systemverilog中的阵列覆盖率

问题描述

我有一个数组en_abist_ov[0:12]。每次我对一个Covergroup进行采样时,我都想查看是否设置了特定元素en_abist_ov[i]。 所以我想为数组的每个元素创建一个coverpoint。

预先感谢

解决方法

您可以在SystemVerilog中具有一组掩护组,例如:

covergroup CG with function sample (input bit c);
  option.per_instance = 1;
  coverpoint c;
endgroup 

CG cg [16];

然后您需要循环构建它们:

bit en_abist_ov[0:12];

initial begin
  foreach (en_abist_ov[i])
    cg[i] = new;

然后您可以在另一个循环中对每个样本进行采样,例如:

foreach (en_abist_ov[i]) 
    cg[i].sample(en_abist_ov[i]);     

例如:

module M;
  
  bit en_abist_ov[0:12];
  
  covergroup CG with function sample (input bit c);
    option.per_instance = 1;
    coverpoint c;
  endgroup 
   
  CG cg [16];

  initial begin
    foreach (en_abist_ov[i])
      cg[i] = new;
    { << {en_abist_ov}} = 13'b1010101010101;
    foreach (en_abist_ov[i]) 
        cg[i].sample(en_abist_ov[i]);     
    { << {en_abist_ov}} = 13'b0;
    foreach (en_abist_ov[i]) 
        cg[i].sample(en_abist_ov[i]);     
    foreach (en_abist_ov[i])
      $display("s[%0h]=%b,coverage cg[%0h].get_inst_coverage= %f",i,en_abist_ov[i],cg[i].get_inst_coverage);
    $display("cg[0].get_inst_coverage= %f",cg[0].get_coverage);
  end
  
endmodule

https://www.edaplayground.com/x/LZSi