文章目录
前言
2023.3.15
2023.3.20
2023.9.12 更新
一、覆盖率知识
1、覆盖率类型
1.1 代码覆盖率
衡量RTL代码是否被充分运行的指标,100%是验证工作完备的必要性,一般设置为95%。
语句覆盖率(statement coverage):指的是程序的每一行代码是否被执行过。条件覆盖率(condition coverage) :指的是每个条件中的逻辑操作数被覆盖的情况。分支覆盖率(branch coverage) :指的是在if, case, _while,repeat, forever,for和loop语句中各个分支执行的情况。事件覆盖率(event coverage):该覆盖率用来记录某一个事件被触发的次数。跳转覆盖率(toggle coverage):用来记录某个设计边界信号数据位的0/1跳转情况,例如从0到1,或者从1到0的跳转。状态机覆盖率(finite stage machine coverage) :仿真器的覆盖率功能可以识别出设计中的状态机部分,记录各种状态被进X的次数,以友状态之间的跳转情况。
1.2 功能覆盖率
覆盖率分析
- 覆盖率稳步增长:添加种子或者加长测试
- 增速放缓:添加额外的约束
- 增长停止:创建新的测试
- 覆盖率达到100%还有设计漏洞:某些功能点没有进行测试
功能覆盖率策略
收集信息而非数据:数量太大的话,应当拆分成多个小范围+边界。着眼于状态而不是某个数据只测量需要的内容:收集覆盖率的时候开销是很大的验证的完备性:同时驱动高的代码覆盖率和高的功能覆盖率
代码覆盖率低功能覆盖率高:没有执行所有的代码,验证计划也不完整
代码覆盖率高功能覆盖率低:可以执行所有代码,没有所有功能点都测试到了
代码覆盖率达到100%,并不意味着工作结束,因为有可能代码有漏洞或者功能点并没有测全。代码覆盖率没有达到100%,那么意味着设计测试激励不足或者设计代码有冗余等情况
1.3 断言覆盖率
断言描述本身也支持覆盖率收集,一般可以通过仿真或者硬件加速的方式来收集,也可以通过形式验证的工具来收集。
定义:用于一次性地或在一段时间对一个或者多个设计信号在逻辑或者时序上的声明性代码,也可以用其他task/function来进行断言,是等价的
关心某个信号值或者状态是否改变,断言覆盖率需要自己设置,覆盖率会被收集到一个覆盖率数据库中。
- 在常见的仿真中,仿真器会记录断言的先决条件是否被触发,以及判断语句成功或者失败。
- 根据选择的验证方法不同,我们可以将断言覆盖率分为:
基于动态仿真或者硬件加速的断言覆盖率
基于形式验证的静态断言覆盖率
2、覆盖组/covergroup
- 需要例化才能采样数据,一次定义就可以多次实例化
- 衡量这些变量在某些特定时间采样到的值,定义采样哪些变量、数值,定义采样事件。
- 可在
class、interface、module里面定义 - 一个类可以有多个
covergroup,都是独立的,可以自行使能或者禁止(之前的有constraint、randomize可以使能) sample():手动采样,显示采样
wait/@:借助已有的事件阻塞触发
//采样方式一 : sample()
covergroup Covport;
coverpoint port; //没有定义数值,意思就是采样所有的值
endgroup
Covport cg1 = new(); //例化
cg1.sample(); //手动采样
//采样方式二 : 事件触发,最好不用这种方式
event trans_ready; //定义事件
covergroup Covport@(trans_ready); //也可以用wait
coverpoint port;
endgroup
3、数据采样
3.1 bins/仓
bin/仓:衡量功能覆盖率的基本单位,记录每个数值被捕捉到的次数
可以手动或者SV自动定义bin域:可能数值的个数。- 每一个
coverpoint组合成covergroup的覆盖率,所有的covergroup组成整体的覆盖率。 覆盖率 = 采样值的数目 / bin的数目
例如:一个3bit变量的域是7:0,正常情况下会自动分配8个bin。如果仿真过程中有7个值被采样到,那么最终的coverpoint的覆盖率就是7/8- 采样变量范围太大时,系统会默认分配
64bin,再将数值平均分配到64个。
auto_bin_max:指定自动创建bin的最大数目, - 定义在 covergroup 的option设置会影响整个covergroup ,即当前covergroup下的所有coverpoint都被设置了。coverpoint里面的设置会覆盖covergroup的设置。
covergroup Covport;
option.auto_bin_max = 8;//covergroup中的option
coverpoint tr.port{
//这个option会覆盖covergroup的设置
option.auto_bin_max = 2;//coverpoint中的option
}
endgroup
//-----------------------------------------------
covergroup Covkind;
coverpoint tr.kind{
bins zero = {
0}; //1个仓代表kind=0
bins lo = {
[1:3], 5}; //1个仓表示1:3和5
bins hi[] = {
[
2万+




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



