
目录介绍
1 概述... 1
1.1 简介... 1
1.2 目的... 1
1.3 原则... 1
2 实施流程... 1
3 分类... 1
4 实施三步走... 2
5 覆盖类型分析... 2
6 测试方法... 2
7 实例分析... 3
8 常用小技巧... 4
9 个性化思路... 5
1.1 简介
UVM测试从根本上说属于白盒测试,其又类似于结构测试或基于代码的测试。UVM测试是一种测试用例设计方法,我们清楚设计内部的东西以及里面是如何运作的。
通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试。在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。
1.3 原则
2)所有逻辑值均需测试true和false两种情况。(保证所有条件被运行)
3)检査程序的内部数据结构,保证其结构的有效性。 (时序合规)
4)在取值的上、下边界及可操作范围内运行所有循环。(covergroup可观测)
2)设计阶段:依据程序设计说明书,按照一定规范化的方法进行模块结构划分和设计测试抽象表。
3)执行阶段:搭建环境,输入测试用例,得到测试结果,对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。
4)总结阶段:进行覆盖率测试,查看覆盖率是否达到100%,否则增加新用例回溯。
3. 分类
UVM测试的方法总体上分为静态分析方法和动态分析方法两大类。
1)静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查代码设计是否和设计描述一致,有无冲突或者歧义。
2)动态分析是当环境在执行之前、之中和之后,对环境结果的分析。它显示了一个环境在运行状态下是正确还是不正确。其中最重要的技术是路径和分支测试。
1)根据代码的功能,手动设计测试用例进行基本功能测试;(即拆解设计文档中模块的基本功能)
2)统计UVM覆盖率,为未覆盖的路径设计测试用例,实现完整的代码覆盖,比较理想的覆盖率是实现100%语句、条件、分支、路径覆盖;(即找出遗漏的测试用例)
3)自动生成大量随机参数的测试用例,捕捉"未处理某些特殊输入"形成的错误。(即将输入参数全部随机化,验证前两步可能存在的缺陷)
从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆盖。
1)语句覆盖(Statement Coverage):为了暴露程序中的错误,程序中的每条语句至少应该执行一次。选择足够多的测试数据,使被测程序中每条语句至少执行一次。
2)判定覆盖(Decision Coverage)又称为分支覆盖:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次。
3)条件覆盖(Condition Coverage):在设计程序中,一个判定语句是由多个条件组合而成的复合判定,构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。 (交叉覆盖)
4)多条件覆盖也称为条件组合覆盖:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。
5)修正条件判定覆盖:要求满足两个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(||、&&)连接的条件,每个条件对于判定的结果值是独立的。
在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。包括以下7个步骤:
第一步:根据需求说明书,制定测试进度时间表。
第二步:根据设计说明书画出设计流图

流程图用来描述程序控制结构。可将流程图映射到一个相应的流图,在流图中,每一个圆代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头代表控制流。
第三步:拆解模块基础功能点,遍历所有可能的路径,同时注意取值的上下边界与可操作范围内的随机,对于特殊的个别变量(数量较少),需要使用cover_group进行全覆盖;(完成2,3步后可生成初版环境说明书)
第四步:编写抽项表,并与设计人员讨论,完成抽象补充;
第五步:UVM环境搭建与基础tc_demo的拉通;
第六步:用例编写,测试以及代码回溯;
第七步:覆盖率分析,针对未覆盖点新增用例。
从整体来看,前四步会显得更重要,如果前期分解不够彻底,那么环境编写后将会不好改动。
针对第6点的测试方法,给出以下需求,实际模拟拆分需求的步骤:

注:节点E的bit0为G路径,bit1为H路径
分析:1)该二叉树一共4条分支;(即路径遍历)
2)每个节点位宽不同,在取值的上、下边界及可操作范围内运行所有循环。(即边界覆盖)
3)假如E节点同时满足H与G,则满足同时覆盖;
总结:上述为基础测试分析,此外还有冲突测试(例:同时满足读写条件),压力测试(例:最大性能测试),异常测试(例:翻转测试,超过位宽测试)等。
8. 常用小技巧
1)UVM环境搭建或者用例编写时,在重要的支路都使用display或则直接断言进行打印,但是要注意打印内容的规范性(英文+用途),会加快调试进度;

2)对于log的打印最好不要写死地址, $test$plusargs和$value$plusargs,可以大大优化测试过程;
3)对于固定的报文格式,使用java的virtual class可以使代码可读性更高,但是注意一点,代码嵌套最好是两层,超过三层就不合适了;
4)对于是否公用缓冲池,灵活使用automatic函数;
5)间接断言可使用于检验不定态,同时可以用于检验波形是否合规,其增加开发成本,在大项目中使用更具性价比;
6)修改状态机时,注意位宽的限制,最好增加打印,这样可以最快查出问题;
7)在打印的时候加入$time,记录打印时间点,方便波形定位;
8)打印数组大小或者内容,能加速调试进度。
1)优化命名结构;
2)慎用宏定义;
3)数据禁止连续三层传递;
4)独立功能切割工作缓冲,互不干扰;
5)cover和断言(最好占据代码的三分之一)可以极大方便验证;
6)代码注释需要占据三分之一。