System verilog 如何更容易地为总线中的每个位创建覆盖点?

System verilog 如何更容易地为总线中的每个位创建覆盖点?,system-verilog,System Verilog,在一个设计中,有一个4位的总线,因此alfa[3:0],我想制作一个covergroup,显示所有位是否同时为0和1 一种方法是这样写: covergroup alfa_cv @(posedge clk); coverpoint alfa[0]; coverpoint alfa[1]; coverpoint alfa[2]; coverpoint alfa[3]; endgroup alfa_cv alfa_covergroup = new; 但是有没有更简单的方法使覆盖点覆

在一个设计中,有一个4位的总线,因此alfa[3:0],我想制作一个covergroup,显示所有位是否同时为0和1

一种方法是这样写:

covergroup alfa_cv @(posedge clk);
  coverpoint alfa[0];
  coverpoint alfa[1];
  coverpoint alfa[2];
  coverpoint alfa[3];
endgroup

alfa_cv alfa_covergroup = new;

但是有没有更简单的方法使覆盖点覆盖总线中的每个位呢?

通常代码覆盖包括切换覆盖。您不必为此创建covergroup。但您可以创建一个CoverGroup数组

covergroup cg(input int index, ref bit [31:0] bus) @(posedge clk);
  each_bit: coverpoint bus[index];
  option.per_instance = 1;
endgroup

cg cgbits[32];

for (int index=0; index<$size(alfa);index++)  
   cgbits[index] = new(index,alfa);

正如大家在这里提到的,你不需要为此编写一个covergroup,因为切换覆盖将解决这个问题

但是,如果您想编写一个covergroup,那么您可以直接使用alfa作为coverpoint,如下所示

covergroup alfa_cv @(posedge clk);
  coverpoint alfa;
endgroup

您可以在covergroup内执行以下操作:coverpoint alfa;。您好,感谢您的建议,但这为4位中的所有值组合提供了一个覆盖组,因此2**4=16个组合,并且不仅为每个位0和1,因此4*2=8个组合。感谢您的启发,但由于报告的错误,不得不做一些修改,例如,必须将索引声明为genvar index;。这取决于for循环所在的上下文。