Systemverilog跨保护点语法问题

时间:2019-03-05 13:02:28

标签: system-verilog uvm

嗨,我是stackoverflow和systemverilog / uvm的新手。我目前正在尝试获取交叉保护点以捕获(a == b)&&(c == d)的条件,而不管它们是什么值。我尝试了以下十字架,但似乎都没有。

covergroup abcd_tracking with function sample (bit [7:0] a, bit [7:0] b, bit [7:0] c, bit [7:0] d);
  coverpoint a {   
    bins a_bin[1] = {[0:$]};
  }
  coverpoint b {   
    bins b_bin[1] = {[0:$]};
  }
  coverpoint c {   
    bins c_bin[1] = {[0:$]};
  }
  coverpoint d {   
    bins d_bin[1] = {[0:$]};



   abcd_cross : cross a,b,c,d 
  {
    bins abcd_bin =  abcd_cross with( (a==b) && (c==d) );

  }

   abcd_cross_2 : cross a,b,c,d 
  {
    bins abcd_2_bin =  ( binsof(a) intersect(b)  && binsof(c) intersect(d) );

  }


   abcd_cross_3 : cross a,b,c,d 
  {
    bins abcd_3_bin =  ( binsof(a) intersect{[0:$]} with (a==b)  && binsof(c) intersect{[0:$]} with (c==d) );

  }

这实际上应该是一个永远不会受到打击的非法条件,但是即使检查我的日志文件,采样的变量也不符合我试图在我的环境中定义的条件,但三个交叉覆盖点似乎一直在受到打击交叉掩护点。捕获此特定条件的正确语法是什么:“(a == b)&&(c == d)”?

1 个答案:

答案 0 :(得分:0)

您有许多语法错误,但除此之外,我认为您对掩盖点和交叉点的工作方式有一些误解。

您的四个Coverpoint对于所有可能的值都只有一个bin。这意味着每个bin都会以任何值命中第一个样本,这是第一个样本的四个覆盖点中的每个覆盖点的100%覆盖率。而且,由于交叉会为所有可能的垃圾箱组合创建垃圾箱,因此您在第一个样本上只会得到一个交叉垃圾箱。因此,三个十字中的每个十字都覆盖在第一个样本上。

如果您要为Coverpoint的每个值使用单独的bin,则需要编写

coverpoint a {   
    bins a_bin[256] = {[0:$]};
}

现在,简单地对a,b,c,d进行交叉将创建256 * 256 * 257 * 256 = 2 32 交叉箱。十字架的箱将自动生成,并且仅当您希望合并或忽略箱时才指定它们。如果仅对(a == b)&&(c == d)的情况感兴趣,则可以忽略所有其他bin

abcd: cross a,b,c,d {
   ignore_bins not_equal = abcd with( a!=b || c!=d);
}