前言: 介绍了代码覆盖率和功能覆盖率,对其中的关键词做了简单介绍。
覆盖率
- 验证如果没有量化,那么就意味着没有尽头。
- 覆盖率是用来衡量验证精度和完备性的数据指标,在仿真时设计的哪些结构被触发,哪些没有被触发。
- 如果想要得到全面的验证精度,需要多个覆盖率种类的指标。
划分覆盖率的两种方法
- 按照覆盖率生成的方法,即隐形生成还是显性生成。
- 按照覆盖率溯源,是从功能描述而来还是从设计实现而来。
本文主要介绍代码覆盖率和功能覆盖率。
1.代码覆盖率
- 代码覆盖率的优势是可以由仿真工具自动收集,可以指出测试程序中设计源代码哪些被激活,哪些是非激活。
- 代码覆盖率的数据无法直接反映哪些设计功能被测试 。
1.1 跳转覆盖率
- 用来衡量寄存器跳转的次数,从0到1,从1到0。
- 跳转覆盖率经常用来测试ip模块之间的基本连接性,比如检查输入端口有没有连接。
1.2 跳转覆盖率行覆盖率
- 哪些代码被执行过哪些没有执行,一行一行检查。
1.2 分支覆盖率
- 分支覆盖率是用来对条件语句(if/else, case, ?😃,指出其执行的分支轨迹
- 例如判断表达式为true或false
if (parity == odd || parity == even) begin;
1.3 条件覆盖率
- 条件覆盖率是同来衡量布尔表达式中各个条件真伪判断的执行轨迹。
if (parity == odd || parity == even) begin;
结果为 parity == odd或 parity !== odd;
parity == even或parity !== even.
1.4 状态机覆盖率
- 每个状态的进入次数,状态之间的跳转次数,多个状态的跳转顺序都可以由仿真工具记录下来。
2. 功能覆盖率
- 面向数据的覆盖率:对已进行的数据组合检查.我们可以通过编写覆盖组(coverage groups)、覆盖点(coverage points)和交叉覆盖(cross coverage)获得面向数据的覆盖率。
- 面向控制的覆盖率:检查行为序列(sequences of
behaviors)是否已经发生。通过编写SVA来获得断言覆盖率(assertion coverage).
面向数据的覆盖率可以协助在回归测试时,自动检测哪些功能被激活。
主要包括两个步骤:
- 从功能描述文档提取拆分需要测试的功能点。
- 将功能点量化为与设计实现对应的SV功能覆盖代码。
2.1 覆盖组covergroup
- 覆盖组包含覆盖点coverpoint,选项option,形式参数argument和可选触发trigger event。
- 一个覆盖组包含了一个或多个数据点全部在同一时间采集。
- 通过new()来创建实例,覆盖组可以定义在module、program、interface以及class中。
- 覆盖组可以采集任何可见的变量,比如程序模块变量。
- 在类中的覆盖组也可以采集类的成员变量。
- 一个类可以包含多个覆盖组,每个覆盖组根据需要使能或禁止。
- 覆盖组与类相似,在一次定义后可以进行多次例化。
通过下段代码来简单了解。
enum{
red, green, blue } color;
bit[3:0] pixel_adr , pixel_offset, pixel_hue;
covergroup g2 @(posedge clk); //在上升沿对里边的变量采样
hue: coverpoint pixel_hue; // 对pixel_hue采样,hue是这个coverpoint的名字
offset: coverpoint pixel_offset; //对pixel_offset采样
axc : cross color

本文解析了代码覆盖率和功能覆盖率的概念,包括跳转覆盖率、行覆盖率、分支覆盖率等,并详细介绍了如何使用SystemVerilog实现功能覆盖率,包括covergroup、coverpoint、cross等关键概念。

3571

被折叠的 条评论
为什么被折叠?



