SV精通6:验证的量化与功能覆盖率
一、覆盖率
1 概述
2 覆盖率反馈回路
- 随机约束(constrained random tests) 很窄的时候会变成定向测试(directed testcase)
- Many runs , different seeds : 跑多次使用不同的种子
- Functionall Coverage : 功能覆盖率
- Identify holes:分析漏洞
即一开始可以使用定向测试
测试题
答案:AB
3 漏洞率曲线
漏洞率下降时,应寻找各种不同的办法去测试可能的边界情况(corner case)
4 功能覆盖率步骤
二、 覆盖率类型
1 代码覆盖率
工具分析,编译时添加选项,不需要额外代码
- 行覆盖率
- 路径覆盖率
- 反转覆盖率
- 状态机覆盖率
最终结果用于衡量设计代码,关注点在设计代码的分析上,而不是测试平台
代码覆盖率100%是必要不充分条件
测试题
答案:C
实际情况常常达不到100%,我们会:1、设置编译器这部分达不到;2、设置100%的阈值
2 断言覆盖率
可以使用SV的程序性代码:assert
但使用SVA更简单
断言除了用于信号和状态的检查外,还可以用作覆盖率收集
只有代码覆盖率会自动收集,断言覆盖率需要自己定义
3 功能覆盖率(重要)
功能覆盖率关系图
不止仿真,形式验证、加速都可以收集覆盖率
pass:功能测试有没有通过
功能覆盖率步骤
合并覆盖率
测试题
答案:BCD
三、功能覆盖策略
1 收集信息而非数据
着眼于感兴趣的状态,而不是具体数值
2 只测量需要的内容
什么时候打开覆盖率收集,什么时候关闭
只收集哪些?功能点…
合理的定义覆盖率采样事件
3 验证的完备性:代码覆盖率与功能覆盖率的关系
目标是同时驱动高的代码覆盖率和功能覆盖率
Functional Coverage & Code Coverage figure
- Need more FC points ,including corner cases : 部分代码代表的功能还没有提取,需要定义更多的功能覆盖率
- Is design complete ? : (最常见的)某些感兴趣的状态还是没有被测试到,分析我们的功能覆盖率哪些没有测试到,针对他们去添加修改约束和性能测试
测试题
答案:CD
四、覆盖组(关键词covergroup)
1 概念
covergroup
与类相似,一次定义多次例化covergroup
可定义在类、interface、module中covergroup
包含一个或多个coverpoint
,所有points全部同一时间采集covergroup
可采样任何可见变量,例如程序变量、接口信号、设计端口- 一个类里面面可包含多个
covergroup
- 你拥有多个独立的
covergroup
时,每个covergroup
可以根据需要自行使能或禁止 - 每个
covergroup
可以定义单独的触发采样时间,允许从多个源头收集数据 covergroup
必须例化后才能收集数据
方法
1 |
|
2 在类里定义covergroup
两种例化方式
第一种:实例名和类名一致,但类名还是类名,实例名也是实例名,但没法例化多次
1 |
|
第二种(建议):实例名与类名不一致,我们定义类也是用这种,可以例化多次
1 |
|
采样
第一种采样方式(手动)
1 |
|
第二种采样方式:covergroup的采样触发等待某些特定的信号(自动)
3 covergroup的采样触发
使用事件触发
借助已有事件,比如已有的时钟或event
测试题
答案:ABC
五、数据采样
1 概述:仓bin
定义coverpoint时,SV会创建很多仓,可以是自己定义的bin,也可以是自动生成的bin,推荐自己定义
2 coverpoint 和 bin
3 bin的创建和应用
4 命名coverpoint和bin
misc = default
5 条件覆盖率:iff关键词给coverpoint添加额外条件
关注port变量,不单单要触发采样条件ck.sample()
,还要(!bus_if.reset)
即已经复位
为什么ck要先关闭:因为要操作复位信号
6 翻转覆盖率:=> 符号
测试题
答案:ABD
7 wildcard覆盖率:把X,Z或?当成0,1的通配
8 忽略某些bin:关键词ignore_bins
使用ignore_bins
定义bin
9 非法某些bin:关键词illegal_bins
10 交叉覆盖率:关键词cross
(1) 排除部分cross bin:ignore_bins + binsof + intersect
1 |
|
ignore_bins md = binsof(port) intersect{0} && binsof(kind) intersect {[9:11]}
ignore_bins lo = binsof(kind.lo)//lo在前面定义了bin lo = {[8:$]}
(2) 精细的交叉覆盖率指定:交叉后bin由于过于多了,我们更常用指定,只用binsof
尽量不做排除法,而是指定法
测试题
答案:ABC
D错是因为,如果不连续(漏掉)某些bin,SV可能会自动帮你填充如:
456没有关心
采样到illegal_bins仿真会停止
六、覆盖选项
1 单个实例的覆盖率:查看单个覆盖率option.per_instance = 1
2 添加注释 option.commet = string*
3 覆盖次数限定:option.at_least
4 覆盖率目标:option.goal
5 covergroup方法
1 |
|
七、数据分析
1 概述
获得总体覆盖率:使用系统函数,或使用get_inst_coverage()
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!