学习目标:
SV绿皮书第九章:功能覆盖率
学习内容:
1.覆盖率是衡量设计验证完备性的一个通用词语
2.覆盖率类型:代码覆盖率、断言覆盖率、漏洞率曲线、功能覆盖率
3.代码覆盖率:行覆盖率、路径覆盖率、翻转覆盖率、状态机覆盖率
仿真器都带有代码覆盖率的工具,当运行完所有测试,代码覆盖率工具便会创建相应的数据库,覆盖率数据也可被转换为可读格式
4.代码覆盖率最终的结果是用于衡量你执行了设计中的多少代码,到达100%并不代表验证工作完成
5.断言覆盖率需要自己定义,断言最常用于查找错误
6.漏洞率曲线,每次漏洞率下降时,就应该寻找各种不同的方法去测试可能的边界情况
7.验证的目的就是确保设计在实际环境中的行为正确
覆盖率稳步增长 | 添加新种子或者加长测试时间 |
---|---|
覆盖率增速放缓 | 添加额外的约束 |
覆盖率停止增长 | 创建新的测试 |
10.覆盖组(covergroup)与类相似,一次定义后便可以多次实例化
11.covergroup可以包含一个或者多个coverpoint,且全都在同一时间采集
covergroup可以定义在类中,也可以定义在interface或者module中
covergroup可以采样任何可见的变量
covergroup----采样哪些数据、、关心的数值、采样的触发事件是什么
12.一个类中可以包含多个covergroup,当有多个独立的covergroup时,每个covergroup可以根据需求自行使能或者禁止,且可以单独定义触发采样事件
covergroup必须被例化才可以用来收集数据
13.在类中定义covergroup
class Transactor;
Transaction tr;
mailbox mbx_in;
//定义
covergroup CovPort; //关键词+名字
coverpoint tr.port; //关键词+采样变量---关心的数值未给出,所有都关心---coverpoint名字未给出
endgroup
function new(mailbox mbx_in)
CovPort=new(); //例化,实例名与名字一样,只能例化一次
//CovPort cg1=new(); //例化多次,covergroup 名字+实例名
this.mbx_in=mbx_in;
endfunction
task main;
forever begin
tr=mbx_in.get;
ifc.cb.port<=tr.port;
ifc.cb.data<=tr.data;
CovPort.sample(); //采样,sample()函数为采样事件
end
endtask
endclass
14.可以使用sample()函数完成,也可以在covergroup 中采样阻塞表达式使用wait或者@实现在信号或事件上的阻塞,也可以同时使用,至少有一种
event trans_ready;
covergroup CovPort @(trans_ready);
coverpoint ifc.cb.port;
endgroup
15.当你在coverpoint指定采样一个变