如何在SystemVerilog中使用表达式忽略交叉覆盖区域

最近,我一直在玩SystemVerilog的功能覆盖率。我想做的一件事是从自动生成的交叉列表中过滤掉一些仓。我在互联网上搜索了一个解决方案,但只找到了类似的问题而没有明确的答案。因此,我开始研究这个问题,并提出了两个解决方案,我将与您分享。

为了更好地说明问题,我们假设我们想要生成两个变量 - 一个总是小于或等于另一个变量,并收集生成值的有效覆盖率。
rand bit[3:0] x, y;

constraint c {
  x <= y;
}
我们将使用SystemVerilog覆盖率相关语法,如covergroup,coverpoint和cross来确认我们已生成所有合法值。

因为我们只对值x <= y感兴趣,所以我们需要对交叉覆盖区域进行某种过滤。正如您在上图中所注意到的,我们必须在总共256个仓中过滤120个仓。尝试将bin排除在bin之外将是一项繁琐的工作。那么,这是我的解决方案:

使用'with'
过滤不需要的bin的最简单方法是在ignore_bins结构中使用'with':
covergroup cover_me;
  x_cp : coverpoint x;
  y_cp : coverpoint y;

  x_y_cross: cross x_cp, y_cp {
    ignore_bins ignore_x_values_higher_than_y = x_y_cross with (x_cp > y_cp);
  }
endgroup
有人提出,更一般地解决方案,你可以按照这里的模式打出你想要的任何模式。不是说这个方案更好,只是不同。这种方式确实可以让您手动输入所有X-Y坐标,但如果您的模式是随机的,那么这是有效的。
covergroup cg1 ;
 cA: coverpoint myenumA  {
   bins a_bin[] = {[A1:A3]};
 } 
 cB: coverpoint myenumB {
  bins b_bin [] = {[B1:B3]};
 } 
 cC: coverpoint myenumC {
  bins c_bin[] = {[C1:C3]};
 } 
// Remember - the spec says that when a bin is named it's taken *out* of
// the autobin list.  So the
aXb: cross cA, cB, cC { 
   // Keep triple combinations = {A1+B2+C3} and {A1+B1+C1}
   bins A1B2C3 = binsof (cA) intersect {A1}  &&
              binsof (cB) intersect {B2}  &&
              binsof (cC) intersect {C3} ; 
   bins A1B1C1 = binsof (cA) intersect {A1}  &&
              binsof (cB) intersect {B1}  &&
              binsof (cC) intersect {C1} ; 
   // should ignore everything that's not above ^^
   ignore_bins IGNORE_A_B =
            ( !binsof (cA) intersect {A1}  ||
              !binsof (cB) intersect {B2}   ||
              !binsof (cC) intersect {C3}     ) 
            &&
            ( !binsof (cA) intersect {A1}   ||
              !binsof (cB) intersect {B1}   ||
              !binsof (cC) intersect {C1}     )
           ; 
} 
endgroup
是的,这是“经典”的方式。但正如您所注意到的那样,当仓的数量很大时,它不可扩展。它容易出错且难以阅读。

我的意见是,当少于8个仓时,你可以使用任何方便的解决方案('with clause',或'binsof()+ intersect'),但是当涉及更多仓时你需要选择最简单的解决方案。
  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值