代码覆盖率:
Statement/Line coverage
用于衡量在仿真测试期间测试了多少条语句(行)
always @ (posedge clk) begin
if( A > B) begin //Line 1
Result = A - B; //Line 2
end else begin //Line 3
Result = A + B; //Line 4
end
end
Block coverage
在begin-end或if else或case语句之间或while循环或for循环之间的一组语句称为块。 块覆盖率衡量的是在仿真过程中是否覆盖了这些类型的块码。 块覆盖范围看起来类似于语句覆盖范围,不同之处在于块覆盖率包含了一组语句
在下面的的示例代码中,有三个代码块
always @ (posedge clk) begin //always block
if( A > B) begin // if block
Result = A - B;
end else begin // else block
Result = A + B;
end
end
Branch/Decision coverage
conditional Coverage and Expression coverage
件覆盖率会检查HDL中的所有布尔表达式,并计算该表达式为真或假的次数。表达式覆盖率检查语句的右侧,统计所有可能组成的真值表的覆盖程度
以下是包含3个布尔变量的表达式,它们决定了Result变量为true或false
Result = (A && B) || ©
Toggle coverage
翻转覆盖率可衡量仿真运行期间设计中信号和端口的翻转率。 这有助于识别哪些信号一直没有翻转
FSM coverage
状态机覆盖衡量仿真期间是否所有状态机的状态都被覆盖到
covergroups coverpoint bins
- 覆盖点(coverpoint)是用于指定需要收集覆盖率的目标
- Covergroup可以具有多个覆盖点以覆盖不同的表达式或变量
- 每个覆盖点还包括一组bin,这些bin是该覆盖点不同采样值
bit [2:0] a;
bit [3:0] b;
covergroup cg @(posedge clk);
cp_a coverpoint a { // 覆盖点1
bins values_a = { [0,1,3,5,7 }; // 覆盖点bin1,变量目标值
}
cp_b coverpoint b; // 覆盖点2,自动生成bin,会检测b是否覆盖到所有的可能性
endgroup
下面的例子中coverpiont cp_a创建了多少个bin?
// 一共创建了5个仓
bit[3:0] var_a;
covergroup test_cg @(posedge clk);
cp_a : coverpoint var_a {
bins low_bins[] = {[0:3]}; // lowbins[]创建了四个bin,对应检查是否覆盖到0,1,2,3
bins med_bins = {[4:12]}; // med_bins创建里一个仓,检查是否覆盖到4-12之间的值
}
endgroup
ignore bins 和 illegal bins
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的范围有重叠,也会导致报错