最近,我一直在玩SystemVerilog的功能覆盖率。我想做的一件事是从自动生成的交叉列表中过滤掉一些仓。我在互联网上搜索了一个解决方案,但只找到了类似的问题而没有明确的答案。因此,我开始研究这个问题,并提出了两个解决方案,我将与您分享。
为了更好地说明问题,我们假设我们想要生成两个变量 - 一个总是小于或等于另一个变量,并收集生成值的有效覆盖率。
因为我们只对值x <= y感兴趣,所以我们需要对交叉覆盖区域进行某种过滤。正如您在上图中所注意到的,我们必须在总共256个仓中过滤120个仓。尝试将bin排除在bin之外将是一项繁琐的工作。那么,这是我的解决方案:
使用'with'
过滤不需要的bin的最简单方法是在ignore_bins结构中使用'with':
我的意见是,当少于8个仓时,你可以使用任何方便的解决方案('with clause',或'binsof()+ intersect'),但是当涉及更多仓时你需要选择最简单的解决方案。
为了更好地说明问题,我们假设我们想要生成两个变量 - 一个总是小于或等于另一个变量,并收集生成值的有效覆盖率。
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'),但是当涉及更多仓时你需要选择最简单的解决方案。