上期答案
覆盖点(coverpoint)是用于指定需要收集覆盖率的目标。Covergroup可以具有多个覆盖点以覆盖不同的表达式或变量。每个覆盖点还包括一组bin,这些bin是该覆盖点不同采样值。bin可以由用户定义,也可以缺省自动创建。在下面的示例中,有两个变量a和b,covergroup有两个coverpoint,他们会检查a和b的值。Coverpoint cp_a是用户定义的,bins values_a检测a是否覆盖到特定的值。Coverpoint cp_b是自动的,bin是自动生成的,会检测b是否覆盖到所有的可能性
bit [2:0] a;
bit [3:0] b;
covergroup cg @(posedge clk);
cp_a coverpoint a {
bins values_a = { [0,1,3,5,7 };
}
cp_b coverpoint b;
endgroup
bit[3:0] var_a;
covergroup test_cg @(posedge clk);
cp_a : coverpoint var_a {
bins low_bins[] = {[0:3]};
bins med_bins = {[4:12]};
}
endgroup
lowbins[]创建了四个bin,对应检查是否覆盖到0,1,2,3,med_bins创建里一个仓,检查是否覆盖到4-12之间的值。因此,一共创建了5个仓
ignore_bins用于指定与覆盖点关联的一组值或者翻转行为,这些值或者翻转行为可以明确从覆盖范围中排除。例如,以下将忽略变量a的所有采样值7和8。
coverpoint a {
ignore_bins ignore_vals = {7,8};
}
illegal_bins用于指定与覆盖点关联的一组值或者翻转行为,这些值或者翻转行为被标记为非法。例如,以下会将所有1、2、3采样值标记为非法。
covergroup cg3;
coverpoint b {
illegal_bins bad_vals = {1,2,3};
}
endgroup
当采样到illegal_bins时,仿真会报错,并且illegal_bins的优先级高于其他bin,即使其他bin和illegal_bins的范围有重叠,也会导致报错。
翻转覆盖率指定为“ value1 => value2”,其中value1和value2是在两个连续采样点上的表达式的采样值。例如,在coverpoint之下,在clk的三个连续正边缘中寻找变量v_a的值4、5和6的翻转行为。
covergroup cg @(posedge clk);
coverpoint v_a {
bins sa = (4 => 5 => 6),
}
endgroup
coverpoint my_variable {
bins trans_bin[] = ( a,b,c => x, y);
}
a=>x, a=>y, b=>x, b=>y, c=>x, c=>y
covergroup test_cg @(posedge clk);
coverpoint var_a {
bin hit_bin = { 3[*4]};
}
endgroup
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
int var_a;
covergroup test_cg @(posedge clk);
cp_a: coverpoint var_a {
bins low = {0,1};
bins other[] = default;
}
endgroup
正确答案将在下一期公布,或者到下面的文章获取答案