UVM在项目中实用的测试方法总结 您所在的位置:网站首页 测试点分解方法怎么写好一点 UVM在项目中实用的测试方法总结

UVM在项目中实用的测试方法总结

2024-07-13 13:08| 来源: 网络整理| 查看: 265

 

 

目录介绍

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.1 简介

UVM测试从根本上说属于白盒测试,其又类似于结构测试或基于代码的测试。UVM测试是一种测试用例设计方法,我们清楚设计内部的东西以及里面是如何运作的。 

1.2 目的

通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试。在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。

1.3 原则

1)一个模块中的所有独立路径至少被测试一次。 

2)所有逻辑值均需测试true和false两种情况。(保证所有条件被运行) 

3)检査程序的内部数据结构,保证其结构的有效性。 (时序合规) 

4)在取值的上、下边界及可操作范围内运行所有循环。(covergroup可观测)

2.  实施流程

1)计划阶段:根据需求说明书,制定测试进度。 

2)设计阶段:依据程序设计说明书,按照一定规范化的方法进行模块结构划分和设计测试抽象表。  

3)执行阶段:搭建环境,输入测试用例,得到测试结果,对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。

4)总结阶段:进行覆盖率测试,查看覆盖率是否达到100%,否则增加新用例回溯。

3. 分类

UVM测试的方法总体上分为静态分析方法和动态分析方法两大类。  

1)静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查代码设计是否和设计描述一致,有无冲突或者歧义。  

2)动态分析是当环境在执行之前、之中和之后,对环境结果的分析。它显示了一个环境在运行状态下是正确还是不正确。其中最重要的技术是路径和分支测试。

4. 实施三步走

1)根据代码的功能,手动设计测试用例进行基本功能测试;(即拆解设计文档中模块的基本功能) 

2)统计UVM覆盖率,为未覆盖的路径设计测试用例,实现完整的代码覆盖,比较理想的覆盖率是实现100%语句、条件、分支、路径覆盖;(即找出遗漏的测试用例) 

3)自动生成大量随机参数的测试用例,捕捉"未处理某些特殊输入"形成的错误。(即将输入参数全部随机化,验证前两步可能存在的缺陷) 

5. 覆盖类型分析

从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆盖。  

1)语句覆盖(Statement Coverage):为了暴露程序中的错误,程序中的每条语句至少应该执行一次。选择足够多的测试数据,使被测程序中每条语句至少执行一次。 

2)判定覆盖(Decision Coverage)又称为分支覆盖:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次。  

3)条件覆盖(Condition Coverage):在设计程序中,一个判定语句是由多个条件组合而成的复合判定,构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。 (交叉覆盖)

4)多条件覆盖也称为条件组合覆盖:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。 

5)修正条件判定覆盖:要求满足两个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(||、&&)连接的条件,每个条件对于判定的结果值是独立的。 

6. 测试方法

在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。包括以下7个步骤:

第一步:根据需求说明书,制定测试进度时间表。

第二步:根据设计说明书画出设计流图  

https://bkimg.cdn.bcebos.com/pic/5243fbf2b211931312e70a1866380cd790238df6?x-bce-process=image/resize,m_lfit,w_220,limit_1

流程图用来描述程序控制结构。可将流程图映射到一个相应的流图,在流图中,每一个圆代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头代表控制流。

第三步:拆解模块基础功能点,遍历所有可能的路径,同时注意取值的上下边界与可操作范围内的随机,对于特殊的个别变量(数量较少),需要使用cover_group进行全覆盖;(完成2,3步后可生成初版环境说明书)

第四步:编写抽项表,并与设计人员讨论,完成抽象补充;

第五步:UVM环境搭建与基础tc_demo的拉通;

第六步:用例编写,测试以及代码回溯;

第七步:覆盖率分析,针对未覆盖点新增用例。

从整体来看,前四步会显得更重要,如果前期分解不够彻底,那么环境编写后将会不好改动。

7. 实例分析

针对第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)打印数组大小或者内容,能加速调试进度。

9. 个性化思路

1)优化命名结构;

2)慎用宏定义;

3)数据禁止连续三层传递;

4)独立功能切割工作缓冲,互不干扰;

5)cover和断言(最好占据代码的三分之一)可以极大方便验证;

6)代码注释需要占据三分之一。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有