覆盖率
覆盖率是用来衡量验证精度和完备性的数据指标。也可以告诉我们在仿真时设计的哪些结构被触发,哪些没被触发。
高质量的验证需要满足以下三个条件
- 测试平台必须产生合适的激励来触发一个设计错误
- 测试平台需要产生合适的激励使得被触发的错误可以进一步传导到输出端口
- 测试平台需要包含一个监测器用来监测被激活的设计错误,以及在它传播的某个节点可以捕捉到它
覆盖率的种类
- 最常见的划分覆盖率的两种方法:按照覆盖率生成的方法,即隐性生成和显性生成。按照覆盖率溯源,即他们是由功能带来的还是设计。
代码覆盖率
- 代码覆盖率100%并不意味着足够的功能覆盖率
跳转覆盖率
- 用来衡量寄存器跳转的次数(0->1,1->0)
- 端口跳转覆盖率经常用来测试IP模块之间的基本连接性,例如检查一些输入端口是否没有连接,或者已经连接的两个端口的比特位数是否不匹配,又或者一些已经连接的输入是否被给定的固定值等
行覆盖率
- 用来衡量源代码哪些代码被执行过,以此来指出哪些代码行没被执行
- 从每一行执行的次数,如果设置最小的执行次数,也可以用来做充足代码测试的一项指标
分支覆盖率
- 用来对条件语句(if/else,case,?:),指出其执行的分支轨迹
条件覆盖率
- 用来衡量一些布尔表达式中各个条件真伪判断的执行轨迹
状态机覆盖率(FSM)
- 仿真工具由于可以自动识别状态机,因此在收集覆盖率时也可以将覆盖率状态的执行情况监测到
- 每个状态的进入次数,状态之间的跳转次数,以及多个状态的跳转顺序都可以由仿真工具记录下来
功能覆盖率
- 功能验证的目标在于确定设计有关的功能描述是否被全部实现
- 代码覆盖率无法得知要求的功能是否实现,而需要显性地通过功能覆盖率与设计功能描述的映射
- 创建功能覆盖率模型需要完成两个步骤:从功能描述文档提取拆分需要测试的功能点;将功能点量化为与设计实现对应的SV功能覆盖代码
覆盖组(covergroup)
- 覆盖组与类相似,在一次定义以后便可以多次进行例化
- 覆盖组含有覆盖点(coverpoint)、选项(option)、形式参数(argument)和可选触发(trigger event)
- 一个覆盖组包含了一个或者多个数据点,全都在同一时间采集
- 覆盖组可以定义在类里,也可以定义在模块或者程序(program)中
- 覆盖组可以采集任何可见的变量,在类中的覆盖组也可以采集类的成员变量
- 对任何事务的采样都必须等到数据被待测设计接收到以后
enum {red,green,blue} colcor;
bit [3:0] pixel_adr,pixel_offset,pixel_hue;
covergroup g2 @(posedge clk);
Hue:coverpoint pixel_hue;
Offset:coverpoint pixel_offset;
AxC:cross color,pixel_adr;
all:cross color,Hue,Offset;
- covergroup…endgroup来定义覆盖组
- 内部可以定义多个coverpoint
- 如果不在covergroup声明时指定采样事件,那么默认该覆盖组只能依赖于其另外一个手动采样函数sample()
覆盖点(coverpoint)
- 一个覆盖组可以包含一个或者多个coverpoint,一个coverpoint可以用来采样数据或者数据的变化
- 一个coverpoint可以对应多个bin,这些bin可以显性指定,也可以隐性指定
- coverpoint对数据的采样发生在covergroup采样的时候
仓(bin)
- bin可以用来将每个感兴趣的数值均对一个独立的bin或者将所有值对应到一个共同的bin
- if语句可以用在bin的定义,它表示条件为false,那么在收集该bin的时候,该bin的采样数目不会增长
- covergroup的参数可以被传递到bin的定义中
- 在定义bin时,可以使用with来进一步限定其关心的数值
- bin除了可以覆盖数值(=>),还可以覆盖数值的变化
- 使用=>来表示相邻采样点的变化,使用->来表示非相邻采样点的数值变化,在=>序列后的下一个时序必须紧跟=>序列的最后一个事件
- 如果coverpoint没有指定任何bin,那么SV将会为其自动生成bin,遵循的原则是:如果变量是枚举类型,那么bin的数量是枚举类型的基数;如果变量是整型(M位宽),那么bin的类型将是2^M和auto_bin_max选项的较小值
- wildcard修饰符可以使得bin中包含x,z和?的数值都将用来表示0或者1,是通配符
- ignore_bins用来将其排除在有效统计的bin集合之外
- illegal_bins用来指出采样到的数值为非法值,如果被采样到那么仿真将报错
交叉覆盖率(cross)
- covergroup可以在两个或者更多的coverpoint或者变量之间定义交叉覆盖率(cross coverage)
- 两个coverpoint交叉后将生成256个交叉的bin
- binsof()的参数可以是coverpoint或者变量,表示对应的bin总和,可以利用binsof()对其结果做进一步过滤