目录
一、交叉覆盖率【难点】
覆盖点记录的是单个变量或者表达式的观测值,而交叉覆盖率可以同时测量两个或者两个以上覆盖点的值。 若其中一个有N种取值,另个一有M种取值,则SV需要N*M个交叉仓来存储所有的组合。
1、基本的交叉覆盖率的例子
SV中的cross结构可以用来记录一个组里两个或两个以上覆盖点的组合值。但是即使每个覆盖点都达到了100%的覆盖率,交叉组合可能会达不到100%。
基本的交叉覆盖率,指定(覆盖点名)
/*
在tr.kind和tr.port上创建了覆盖点,然后这两个点便交叉显示出各种组合。
SV总共创建了128(8*16)个仓。
*/
class Transaction;
rand bit[3:0] kind;
rand bit[2:0] port;
endclass
Transaction tr;
covergroup CovPort;
kind: coverpoint tr.kind; //创建覆盖点kind 注意格式 变量名称:coverpoint 变量
port: coverpoint tr.port; //创建覆盖点port
cross kind,port; //把kind和port交叉
endgroup
2、对交叉覆盖仓进行标号
指定交叉覆盖仓的名称(仓名)
covergroup CovPortKind;
port: coverpoint tr.port{
bins port[] = {0:$};
}
kind: coverpoint tr.kind{
bins zero = {0}; //一个仓zero,对kind采样值为0进行计数
bins lo = {[1:3],5}; //lo仓代表1:3和5的值
bins hi[] = {[8:$]}; //8个独立的仓8-15,分别保存
bins misc = default; //一个仓用来保存没有被选中的值
}
cross kind,port;
endgroup
3、排除掉部分交叉覆盖仓(难点:课后反复研究)
在交叉覆盖中,可以使用binof和intersect分别指定覆盖点和数值集,这样可以使用单个的ignore_bins结构清除掉个体仓。
在交叉覆盖中排除掉部分bin
covergroup CovPort;
port: coverpoint tr.port{
bins port[] = {0:$};
}
kind: coverpoint tr.kind{
bins zero = {0}; //一个仓zero,对kind采样值为0进行计数
bins lo = {[1:3],5}; //lo仓代表1:3和5的值
bins hi[] = {[8:$]}; //8个独立的仓8-15,分别保存
bins misc = default; //一个仓用来保存没有被选中的值
}
//port8个bin,kind11个bin。 一共8*11=88个交叉bin
cross kind,port{
ignore_bins hi = binof(port) intersect {7}; //排除掉了所有代表port为7和任意kind值组合的仓
ignore_bins md = binof(port) intersect {0} && //排除掉了port为0和kind为9、10、11的组合,共3个仓。
binof(kind) intersect {[9:11]};
ignore_bins lo = binof(kind.lo); //使用仓名排除掉了lo整个仓和任意(即0:7)port组合的仓
}
endgroup

本文深入探讨了SystemVerilog中的交叉覆盖率,包括如何创建和管理交叉覆盖点,如何排除不需要的交叉仓,调整覆盖率权重以及分析覆盖率数据。此外,还介绍了通用覆盖组的参数传递和覆盖选项的设置,如单个实例覆盖率、注释、目标及空仓打印。文章还讨论了在仿真过程中动态监测覆盖率的重要性,并提供了不同方法来优化覆盖率统计。
最低0.47元/天 解锁文章
1234

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



