给定两个位向量'a'和'b'我想要覆盖我是否按位看到a和be的所有可能组合。更确切地说,让我们假设'a'和'b'的长度为2.然后,对于i = 0,1我希望看到以下组合
a[i] == 0 && b[i] == 0,
a[i] == 0 && b[i] == 1,
a[i] == 1 && b[i] == 0,
a[i] == 1 && b[i] == 1.
有简洁的方法吗?我当然可以写
covergroup bitwise_toggle;
a0: coverpoint a[0];
a1: coverpoint a[1];
b0: coverpoint b[0];
b1: coverpoint b[1];
aXb0: cross a0, b0;
aXb1: cross a1, b1;
endgroup
但是如果a和b是32位长呢?我是否定义了64个封面点和32个封面组?由于这显然不合需要且容易出错,我想知道是否有人有更好的解决方案。
答案 0 :(得分:1)
您可以通过编写
来简化封面组covergroup bitwise_toggle;
aXb0: coverpoint {a[0],b[0]};
aXb1: coverpoint {a[1],b[1]};
endgroup
然后,您只需要为32位变量定义32个覆盖点并且不需要交叉。 但是你应该进一步解释为什么这需要包含在一个封面组中。编写封面组的多个实例会更容易。
使用多个封面组实例执行此操作
covergroup bitwise_cg(string name) with function sample (bit [1:0] axb);
option.per_instance = 1;
option.name = name;
coverpoint axb;
endgroup
bitwise_cg cg[32];
// construction of covergroups
foreach(cg[ii]) cg[ii] = new($sformatf("axb%0d",ii));
// sample of covergroups
foreach(cg[ii]) cg[ii].sample({a[ii],b[ii]});
答案 1 :(得分:0)
如果你想要一个封面组中的所有内容,那么这是另一个解决方案:
covergroup bitwise_toggle with function sample(int bit_index, bit a_bit, bit b_bit);
bit_index_cp : coverpoint bit_index {
bins indexes[] = {[0:31]};
option.weight = 0;
};
a_bit_cp : coverpoint a_bit { option.weight = 0; };
b_bit_cp : coverpoint b_bit { option.weight = 0 };
axb_cross : cross bit_index_cp, a_bit_cp, b_bit_cp;
endgroup
当采样事件发生时,迭代a和b的所有位并调用covegroup的样本函数:
bit[31:0] a;
bit[31:0] b;
for(int k = 0; k < 32; k++)
bitwise_toggle.sample(i, a[i], b[i]);
axb_cross
是您感兴趣的覆盖率指标。其他封面是辅助的,这就是他们的权重设置为0的原因。