System verilog Systemverilog:按位切换覆盖率的按位交叉

System verilog Systemverilog:按位切换覆盖率的按位交叉,system-verilog,System Verilog,给定两个位向量‘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

给定两个位向量‘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个覆盖组?由于这显然是不可取的,而且容易出错,我想知道是否有人有更好的解决方案。

您可以通过编写

covergroup bitwise_toggle;
  aXb0: coverpoint {a[0],b[0]};
  aXb1: coverpoint {a[1],b[1]};
endgroup
然后您只需要为32位变量定义32个覆盖点,而不需要交叉。 但您应该进一步解释为什么需要将其包含在单个covergroup中。编写一个covergroup的多个实例会容易得多

更新 要对多个covergroup实例执行此操作

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]});

如果您希望将所有内容都包含在一个covergroup中,那么这里有另一个解决方案:

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的sample函数:

bit[31:0] a;
bit[31:0] b;
for(int k = 0; k < 32; k++)
    bitwise_toggle.sample(i, a[i], b[i]);
位[31:0]a;
位[31:0]b;
对于(int k=0;k<32;k++)
位切换样本(i,a[i],b[i]);

axb_cross
是您感兴趣的覆盖率指标。其他覆盖点是辅助的,这就是为什么它们的权重设置为0。

谢谢!简化是相当大的改进。我希望将所有内容都包含在一个covergroup中,以便能够将其映射到验证计划中的单个条目。现在我注意到verifcation Planner的功能是全局匹配到覆盖点。。。我会相应地修改这个问题。您知道如何在多个covergroup实例中优雅地实现这一点吗?您还应该能够定义十字,而无需定义其点:
十字a[0],b[0]
。这应该隐式声明
a[0]
b[0]
的覆盖点。这可能会使报告比串联版本更具可读性,也就是说,通过查看覆盖的是对
{1,0}
,而不是
10
(或者,更糟糕的是,如果工具坚持将所有内容打印为十进制/十六进制,
3
)。来源:IEEE 1800-2012,第19.6节