功能覆盖率的一些写法,过程记录......
1. 自动建仓,收集 enum类型的变量 (自动建仓的名字可读性较好)
xxx_cp:coverpoint xxx_enum'(xxx);
2. 自动建仓,收集不连续的值
xxx_cp:coverpoint xxx iff (xxx inside {32'h0102????}) {
wildcard bins xxx_bins[] = {32'h0102????} with (item inside {xxx_q}); //xxx_q 为一些离散的值,checker,激励等其他部分可以共用
}
3. 自动建仓,收集一些特殊值
xxx_cp:coverpoint xxx {
bins all[] = xxx_cp with($onehot(item));
bins mod3[] = xxx_cp with(item % 3 == 0);
}
4. ignore bins
xxx_cp:coverpoint xxx {
bins all[] = {[1:10]};
}
yyy_cp:coverpoint xxx {
bins all[] = {[1:20]} iff(cond==1);
}
cs_xxx_yyy:cross xxx_cp, yyy_cp {
ignore_bins ig1 = binsof(xxx_cp) intersect{2} && !binsof(yyy_cp) intersect{[3:6]};
ignore_bins xxx_eq_yyy = binsof(xxx_cp) with (xxx_cp == yyy_cp);
//ignore_bins xxxmod = binsof(xxx_cp) with(xxx_cp % 3 == 0) && binsof(yyy_cp) intersect{3} iff(cond==1); //待确认
ignore_bins xxxmod = binsof(xxx_cp) with(xxx_cp % 3 == 0) iff(cond==1);
}
5.cross(正向bins,而不是去ignore)
cs_xxx_yyy:cross xxx_cp, yyy_cp {
option.cross_auto_bin_max=0;
bins cs1 = binsof(xxx_cp) intersect{2} && !binsof(yyy_cp) intersect{[3:6]};
bins cs2 = binsof(xxx_cp) with (xxx_cp == yyy_cp);
}
6. cp中使用函数返回值
xxx_cp:coverpoint xxx_func() {
bins all[] = {[1:10]};
}
7. covergroup的多例化 (TODO:后续补充注释)
`define pack_s(name_s, t0=logic[666:666], d0=d0, t1=logic[666:666], d1=d1, t2=logic[666:666], d2=d2, t3=logic[666:666], d3=d3, t4=logic[666:666], d4=d4, t5=logic[666:666], d5=d5, t6=logic[666:666], d6=d6, t7=logic[666:666], d7=d7, t8=logic[666:666], d8=d8, t9=logic[666:666], d9=d9) \
\
typedef struct packed { \
t9 d9; \
t8 d8; \
t7 d7; \
t6 d6; \
t5 d5; \
t4 d4; \
t3 d3; \
t2 d2; \
t1