上期答案
covergroup test_cg @(posedge clk);
coverpoint var_a {
bin hit_bin = { 3[*4]};
}
endgroup
[* N]指的是连续的重复操作。因此,上面的bin覆盖的是连续4次采样都是3的翻转覆盖率
wildcard bins可以让bin在定义时使用x、z和?作为0或者1的通配符。下面的例子中,并不关心低两位是多少,只要高两位为11就在覆盖范围内。
coverpoint a[3:0] {
wildcard bins bin_12_to_15 = { 4'b11?? };
}
coverage可以指定两个或多个coverpoint或变量之间的cross coverage。cross coverage使用cross进行指定的。交叉覆盖率的仓数,等于交叉目标仓数的乘积,因为要覆盖到两者的所有可能组合。
bit [31:0] a_var;
bit [3:0] b_var;
covergroup cov3 @(posedge clk);
cp_a: coverpoint a_var {
bins yy[] = { [0:9] };
}
cp_b: coverpoint b_var;
cc_a_b : cross cp_b, cp_a;
endgroup
cp_a有10个bin,cp_b有16个bin,因此cc_a_b有160个bin。
交叉覆盖率通常用于不同功能或者事件同时发生的情况,去验证这些事件是否同时发生了。
bit[1:0] cmd;
bit[3:0] sub_cmd;
covergroup abc_cg @(posedge clk);
a_cp: coverpoint cmd;
cmd_x_sub: cross cmd, sub_cmd;
endgroup
cmd和sub_cmd都是二值变量,a_cp有4个bin,sub_cmd默认有16个bin,因此,交叉覆盖率具有64个bin。
int var_a;
covergroup test_cg @(posedge clk);
cp_a: coverpoint var_a {
bins low = {0,1};
bins other[] = default;
}
endgroup
代码对int类型进行覆盖率收集,low的bin数为2,而通过default所创建的数量为
个,数量十分巨大,这会导致仿真器崩溃或者仿真速度下降。应该尽量避免使用default或者不要使用default。
正确答案将在下一期公布,或者到下面的文章获取答案