文章目录
1. 覆盖率的类型
覆盖率是衡量设计验证完备性的一个通用词语
1.代码覆盖率
衡量设计实现的情况,工具自动帮你执行覆盖率收集。
主要包括一下几方面:
* 行覆盖率:多少行代码被执行过
* 路径覆盖率:在穿过代码和表达式的路径中有哪些已经被执行过
* 翻转覆盖率:哪些单位比特变量的值为0或1
* 状态机覆盖率:状态机哪些状态和状态转换已经被访问过
主要关注设计的覆盖率,测试代码不是主要;未经测试的代码里可能隐藏硬件漏洞,也可能是冗余的代码
2.断言覆盖率
断言是用于一次性的或者在一段时间对一个或多个设计信号在逻辑或者时序上的声明代码
可以使用cover property来测量这些关系的信号值或者状态是否发生变化
【漏洞率曲线】
每次漏洞率下降时,就应该寻找各种不同的方法去测量可能的边界情况
3.功能覆盖率
功能覆盖率是和设计意图紧密相连,衡量哪些设计特证已经被测试程序测试过的一个指标。
通过将每次仿真收集的覆盖率信息合并(前提是测试通过),分析覆盖率数据就可以决定如何修改递归测试集,
- 如果覆盖率稳步增长,那么就添加新种子或者加长测试时间;
- 如果覆盖率增速放缓,那么添加额外的约束来产生更多激励;
- 如果覆盖率停止增长,然而设计某些测试点没有被覆盖到(覆盖率不足100%),那么就创建新的测试;
- 如果覆盖率为100%但依然有新的设计漏洞,那么覆盖率可能没有覆盖到设计中某些设计功能区域;
2. 功能覆盖策略
1.收集信息而非数据
关注感兴趣的状态,而不是具体数值
2.只测量需要的内容
收集功能覆盖率数据的开销很大,所以只测量你会用来分析并且改进测试的那部分数据;
3.验证的完备性
目标:同时驱动高的代码覆盖率和高的功能覆盖率
- 如果代码覆盖率低但功能覆盖率高,说明验证计划不完整,测试没有执行设计的所有代码;
- 如果代码覆盖率高但功能覆盖率低,说明测试没有把设计定位到所有感兴趣的状态上,或者可能设计没有实现某功能;
3.覆盖组
- 覆盖组(covegroup)与类相似,可以多次例化;
- covegroup至少要有一个coverpoint,且全都在同一时间采集;
- covergroup可以定义在类中,也可以定义在接口或者module中;
- covergroup 必须要被例化才能采样数据
//采样方式一 : sample()
covergroup Covport;
coverpoint port;
endgroup
Covport cg1 = new();//例化
cg1.sample();//采样
//========================
//采样方式二 : 事件触发,最好不用这种方式
event trans_ready;//定义事件
covergroup Covport@(trans_ready);//也可以用wait
coverpoint port;
endgroup
4.数据采样
基本概念有如下:
-
coverpoint指定采样一个变量或者表达式,SV会创建很多“仓(bin)”来记录每个数值被捕捉到的次数;
-
bin是衡量功能覆盖率的基本单位;
-
计算coverpoint上的覆盖率,首先需要确定可能数值的个数,即域。如下:
覆盖率= 采样值的数据 / bin的数目
例如:一个3bit变量的域是7:0,正常情况下会自动分配8个bin。如果仿真过程中有7个值被采样到,那么最终的coverpoint的覆盖率就是7/8
-
所有 coverpoint 的覆盖率最终构成 covergroup 的覆盖率,所有 covergroup 的覆盖率最终构成整体的功能覆盖率;
4.1 bin的创建和应用
SV会默认为某个coverpoint创建bin,用户也可以自己定义bin的采样域(推荐自己定义)。如果采样变量的域范围过大,而又没有指定bin,那么系统会默认分配一个64个bin,将值域范围平均分配给这64个bin。用户可以使用covergroup的选项auto_bin_max来指定自动创建bin的最大数目。
covergroup Covport;
options.auto_bin_max = 8;//covergroup中的option
coverpoint tr.port{
//这个option会覆盖covergroup的设置
options.auto_bin_max = 2


2333

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



