在systemverilog交叉覆盖范围内,除了一组给定的十字架之外,所有这些都是非法的

时间:2016-01-12 15:42:13

标签: system-verilog

我试图在一个跨越两个变量A和B的封面组中产生一个十字架。我希望十字架包含一个给定的十字架子集,并使所有其他的非法。此外,我不想在一个垃圾箱中组合任何有效的十字架。我可以用A和B封面的分词来表达有效的十字架,即我正在寻找这样的东西:

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是多个bin,一个用于子集中指定的每个交叉。

一个简单的封面允许你通过在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;
}

由此产生的十字架将会相当大,所以我宁愿不做黑名单替代(即制作我不想明确违法的所有内容),因为我可能会错过无效组合,或者明确写出所有允许的内容,因为它会变得费力,庞大而棘手。

2 个答案:

答案 0 :(得分:1)

我发现了一个解决方案,虽然它并没有完全符合我的要求。

你可以使用! binsof(b1)前面的运算符与(b2)表达式相交。这颠倒了它(因此排除了表达式所包含的所有内容)。 A的各种值与B的特定值配对。我可以表示通过binsof(b1)intersect(b2)构造允许的B的值,并将其反转以获得B的非允许值。然后使用这是为了构建非法垃圾箱。

这确实意味着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和B_VAL1和B_VAL3的bin0和bin1的值与来自bin2和bin3的值配对。

答案 1 :(得分:0)

如果您发现十字架包含太多要管理的元组,请考虑使用放入十字架的一组受限制的二进制文件创建覆盖点。例如

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表达式。