在 systemverilog 交叉覆盖中,除了一组给定的交叉外,其他所有交叉都是非法的

Make all but a given set of crosses ilegal in systemverilog cross coverage

我试图在交叉两个变量 A 和 B 的覆盖组中生成交叉。我希望交叉包含交叉的给定子集并使所有其他交叉无效。此外,我不想将任何有效的十字架分组到一个容器中。我可以用 A 和 B 覆盖点的 bin 表示有效的交叉,即我正在寻找这样的东西:

my_cross : cross A, B {
   bins a_subset = binsof(A.bin0) && binsof(B.bin0);
   bins b_subset = binsof(A.bin1) && binsof(B.bin1);
   illegal_bins illegal = default;
}

然而,以上将在两个容器中组合多个交叉,因此 a_subset 将是一个容器,其中包含具有 A.bin0 和 B.bin0 成员的每个交叉。我希望 a_subset 是多个箱子,一个用于子集中指定的每个交叉。

一个普通的 coverpoint 允许你通过在 bin 名称后放置 [] 来做这种事情,但这对交叉不起作用(SystemVerilog LRM 没有说你可以做到,MTI 不接受它)。

my_cross : cross A, B {
   bins a_subset[] = binsof(A.bin0) && binsof(B.bin0);
   bins b_subset[] = binsof(A.bin1) && binsof(B.bin1);
   illegal_bins illegal = default;
}

由此产生的交叉会相当大,所以我宁愿不做黑名单替代方案(即让我不想要的一切都明确非法)因为我可能会错过无效组合,或者明确写出所有允许的作为改变起来会很费力,很大而且很棘手。

如果您发现交叉包含太多元组而无法管理,请考虑使用您放入交叉中的一组受限制的 bin 创建覆盖点。例如

bit [7:0] A, B;
covergroup cg;
  Acp : coverpoint A {
    bins set1[] = {/* some limited set of bins*/ };
}
  Bcp : coverpoint B {
    bins set1[] = {/* some limited set of bins*/ };
}
  my_cross: cross Acp, Bcp;
endgroup

另外,看看 1800-2012 中添加的一些更复杂的 bin 表达式。

我发现了一个解决方案,尽管它并没有完全按照我的要求运行,但已经足够好了。

您可以使用! binsof(b1) intersect(b2) 表达式前面的运算符。哪个反转它(因此排除表达式包含的所有内容)。 A 的各种值与 B 的特定值配对。我可以通过 binsof(b1) intersect(b2) 构造表达 B 的值,并将其反转以获得 B 的 non-allowed 值。然后用它来构造非法垃圾箱。

这确实意味着 A 的无效值仍会包含在交叉中,但是这些值在 A 覆盖点中都被列为非法,因此它们被排除在外。

我最终得到这样的结果:

my_cross : A, B {
    illegal_bins illegal =
     ((binsof(A.bin0) ||
      (binsof(A.bin1))   &&
     !binsof(B) intersect {B_VAL1, B_VAL2}) || 
     ((binsof(A.bin2) ||
      (binsof(A.bin3))   &&
     !binsof(B) intersect {B_VAL1, B_VAL3});
} 

其中 B_VAL1 和 B_VAL2 与 A 的 bin0 和 bin1 的值配对,B_VAL1 和 B_VAL3 与 bin2 和 bin3 的值配对。