我试图在一个跨越两个变量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;
}
由此产生的十字架将会相当大,所以我宁愿不做黑名单替代(即制作我不想明确违法的所有内容),因为我可能会错过无效组合,或者明确写出所有允许的内容,因为它会变得费力,庞大而棘手。
答案 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表达式。