我实现了以下掩护组:
covergroup my_covergroup_cg (input string name);
enable_reg_cp : coverpoint enabled_reg[PARAM1-1:0] {
illegal_bins no_enable = {0};
}
feature_active_reg_cp : coverpoint feature_active_reg_mask[PARAM2-1:0] { // Interested in covering a PARAM2-width chunk of a 32-bit feature_active_reg
illegal_bins all_features_active = {'1}; // We must not activate all features (1 bit = 1 feature active)
}
my_covergroup_cross : cross enable_reg_cp , feature_active_reg_cp {
illegal_bins il0 = (binsof (enable_reg_cp) intersect {0});
illegal_bins il1 = (binsof (feature_active_reg_cp) intersect {'1});
}
endgroup : my_covergroup_cg
[执行时,我的十字架的“ il1”非法垃圾桶被击中的值为“ 0x1”feature_active_reg_mask [PARAM2-1:0]-完全合法,与{'1}不匹配(相当于..111111:全为)。
在“ binsof”范围内如何处理这些{'1}时是否存在特定问题?
这是最常见的工具问题。根据1800-20167 LRM中的19.5.7节的值解析,所有bin表达式都将在Coverpoint类型的上下文中进行求值。您可以使用[$:$]
作为替代,代表最大可能值。
但是...] illegal_bins
中的cross
是不必要的,因为仅覆盖了掩护点的箱柜。 AND ...您定义了一组明确的垃圾箱,没有隐式定义的垃圾箱,因此应将其写为
covergroup my_covergroup_cg (input string name);
enable_reg_cp : coverpoint enabled_reg[PARAM1-1:0] {
bins enable[] = {[1:$]}; // will be split into N bins according to auto_bins_max
}
feature_active_reg_cp : coverpoint feature_active_reg_mask[PARAM2-1:0] { // Interested in covering a PARAM2-width chunk of a 32-bit feature_active_reg
bins some_features_active = {[0:$]};
ignore_bins all_features_active = {[$:$]}; // We must not activate all features (1 bit = 1 feature active)
}
my_covergroup_cross : cross enable_reg_cp , feature_active_reg_cp;
endgroup : my_covergroup_cg
在2 nd覆盖点中,$值与两个bin规范重叠,但是ignore_bins
覆盖了它。
只需分享我的变通方法以进行知识共享:我决定继续使用localparam
语义。看起来问题与解释{'1}
的工具有关。我做了以下事情:
localparam all_ones = {PARAM2{1'b1}};
covergroup my_covergroup_cg (input string name);
enable_reg_c .... // rest of code
并且我将别名传递到我的illegal_bins
illegal_bins il1 = (binsof (feature_active_reg_cp) intersect {all_ones});
干杯,