功能覆盖率与覆盖率闭环
返回 ALU 任务总览。
任务:统计合法操作码
当前 alu_coverage.sv 只实现了一个 coverpoint:
covergroup op_cg with function sample(input logic [2:0] op);
option.per_instance = 1;
op_cp: coverpoint op {
bins each_op[] = {[3'd0:3'd5]};
}
endgroupeach_op[] 为 0~5 分别建 bin。top 在每笔检查后调用 cov.op_cg.sample(tr.op);。输出的 100% 只表示六个合法操作码至少各采到一次,不代表每个 a/b、复位时机、请求间隔或结果都正确。op=6/7 有定向用例,但不在这组六个合法 bin 内。
问题:“注释掉 20 条随机测试,为什么操作码覆盖率很可能还是 100%?”答案:17 条定向测试本来就涵盖了 0~5。覆盖率只看这个 coverpoint,自然不受随机测试是否存在的明显影响。
任务:从规格推出新的覆盖点
建议下一轮增加:
| 需求 | 候选 bins | 为什么比只数 opcode 更有用 |
|---|---|---|
| 左移边界 | b=0、1..7、8(仅 op=5 时采样) | 区分保持、部分移出、全部移出 |
| 加法截断 | 9 位扩展和的进位 0/1(仅 op=0 时采样) | 确认既测普通加法也测低 8 位回绕 |
| 请求与复位 | 空闲/连续请求、活动中复位 | 对应状态与时序需求 |
计算进位必须先扩成 9 位,例如 {1'b0,a}+{1'b0,b};若先用 8 位结果再判断是否超过 255,进位已丢失。这里列的是下一轮覆盖率设计,不是声称当前源码已经实现这些 coverpoint。
覆盖率是“看见哪些场景”的证据,scoreboard 与 SVA 是“行为是否符合规格”的检查。即使两者都为绿色,也要考虑参考模型与 RTL 写出相同错误、测试没有产生某种关键序列等风险。下一步读 断言、复位与回归。