1、代码覆盖率
行覆盖率(Line Coverage):衡量多少行代码被执行过;
有限状态机覆盖率(FSM Coverage):衡量状态机中哪些状态和状态转换被执行过;
翻转覆盖率(Toggle Coverage):衡量哪些单bit信号0/1翻转被执行过;
分支覆盖率(Branch Coverage),也称路径覆盖率(Path Coverage):衡量哪些if、case、for、forever、while等语句分支被执行过;
条件覆盖率(Condition Coverage):衡量哪些条件中逻辑操作数被执行过。
2、功能覆盖率
用户自定义覆盖率:定义覆盖组(Coverage groups)、覆盖点(Coverage points)、交叉覆盖(Cross Coverage)。
断言覆盖率,常用于查找错误,如两个信号是否互斥、寄存器读写冲突、memory读写冲突等。关键词assert property。
3、覆盖率-覆盖组触发
(1)调用sample触发覆盖组收集覆盖率
covergroup vss_constraint_common_cov;//定义覆盖组
coverpoint ul_swap//定义覆盖点
{bins value[] = {[240:255]}; bins others = default;}
coverpoint dl_swap
{bins value[] = {[240:255]}; bins others = default;}
…
coverpoint …
endgroup
vss_constraint_common_cov = new();//创建覆盖组实例
vss_constraint_covergroup_common.vss_constraint_common_cov.sample();//收集覆盖率
(2)使用事件触发覆盖组收集覆盖率
covergroup vss_constraint_common_cov @(event_flag);//定义覆盖组
coverpoint ul_swap//定义覆盖点
{bins value[] = {[240:255]}; bins others = default;}
…
coverpoint …
endgroup
(3)使用SV断言触发覆盖组收集覆盖率
cover property//断言事件
(@(posedge clk) write_ena==1)
->write_event;
covergroup vss_constraint_common_cov @(write_event);//定义覆盖组
coverpoint ul_swap//定义覆盖点
{bins value[] = {[240:255]}; bins others = default;}
…
coverpoint …
endgroup
4、覆盖率-数据采样
主要通过创建“仓(bin)”来记录每个数值被捕捉到的次数。
(1)自动创建仓:3bit变量,会被创建23个仓。通过设置auto_bin_max指明建仓个数。
(2)用户自定义仓:
coverpoint hf_num
{bins value[] = {[1:15]}; bins others = default;}
(3)条件覆盖率建仓
关键字iff
cpri_rate_iff:
coverpoint cpri_rate
iff(dl_type==8)
{bins value[] = {0}; bins others = default;}
(4)翻转覆盖率建仓
coverpoint cpri_rate
{bins value[] =(0=>1),(1=>2)}
(5)忽略覆盖点
关键字ignore_bins
coverpoint hf_num
{ignore_bins value[] = {0}; }
(6)不合法的仓
关键字illegal_bins
coverpoint hf_num
{illegal_bins value[] = {0}; }
(7)交叉覆盖率
关键字cross
covergroup vss_constraint_common_cov;//定义覆盖组
ul_swap :coverpoint ul_swap;//定义覆盖点
dl_swap :coverpoint dl_swap;
cross ul_swap, dl_swap;//交叉覆盖率
endgroup