覆盖率与回归复盘

返回 项目总览。

一次仿真 PASS 只能证明一个场景。这个项目用固定种子矩阵重复五类 UVM 测试,再合并 coverage database,把结果变成可以追踪和复现的证据。

已验证结果

环境为 QuestaSim-64 10.7c、UVM 1.2,结果日期为 2026-10-08。

指标实测结果
UVM 回归50/50 PASS
directed bench1/1 PASS
UVM seeds1001–1050,共 50 个
检查的 AXI4-Lite 事务10,543
UVM error / fatal0 / 0
assertion failure0
合并功能覆盖率82.14%
DUT statement coverage92.72%(51/55)
DUT branch coverage100%(26/26)
DUT condition coverage100%(8/8)
DUT expression coverage100%(22/22)
DUT toggle coverage69.30%(298/430)

没有诚实的单一“代码覆盖率”

statement、branch、condition、expression 和 toggle 统计对象不同,不能简单平均成一个百分比。简历需要一句话时可写 92.72% statement coverage,再列出其他分项。

回归矩阵

测试运行seeds每次事务单次功能覆盖率
smoke101001–10101357.18%
random101011–102050080.36%–81.85%
WSTRB101021–10302041.32%
error101031–10402056.83%
backpressure101041–105050080.36%–82.14%

directed bench 另运行一次、检查 13 笔事务,但没有实例化 UVM covergroup。

功能覆盖率测了什么

covergroup 包含:

  • command:read/write;
  • address:4 个合法寄存器、若干未对齐区间、越界区间;
  • address kind:legal/unaligned/out-of-range;
  • response:OKAY/SLVERR;
  • WSTRB:zero、single、multi 和 full;
  • command × address kind × response;
  • write address kind × WSTRB。

command、address、address kind 和 response coverpoint 已达到 100%。总覆盖率停在 82.14%,主要有两类原因。

缺口一:刺激没有生成六种 WSTRB

当前约束和专项 sequence 没有产生 6/7/9/B/D/E 六种模式。它们在 coverage model 中有 bins,因此无法命中。

修复方法不是调高随机事务数碰运气,而是把模式加入 WSTRB sequence,或修改 constraint 使 16 种值都可生成,再用 regression 证明 bins 被关闭。

缺口二:cross 中存在不可能组合

例如当前规格规定非法地址必须返回 SLVERR,那么“invalid address × OKAY”就是协议上不允许的组合。如果 cross 自动为它建 bin,正确 DUT 永远无法覆盖。

应在 coverage model 中用 ignore_bins 排除规格不可能组合,用 illegal_bins 表达绝不允许出现的组合,而不是为了追求 100% 去制造错误响应。

100% coverage 不是目标本身

覆盖模型必须先与验证计划一致。删除难以命中的合法场景会制造虚假的 100%,保留不可能场景又会制造永久缺口。

为什么 toggle 只有 69.30%

随机数据不保证每个寄存器位、输出位和控制状态都经历 0→1 与 1→0。较低 toggle coverage 可以帮助发现缺少的位级激励,但不应与 statement coverage 混为一谈。

可以通过针对每个寄存器写入 0/全1/走1/走0、覆盖所有 byte lane,再分析未翻转信号是否属于常量或不可达状态来闭环。

证据范围

headline code coverage 只统计实际实例化的 rtl/axi_lite_slave_regs.v,排除 testbench/UVM 代码,也排除未实例化的专用寄存器示例。功能覆盖率来自 50 个 UVM run 的 axi_lite_cg 合并结果。

回归脚本会:

  1. 以 coverage 选项重新编译;
  2. 对五个测试各运行十个固定种子;
  3. 解析 UVM error/fatal 和每次功能覆盖率;
  4. 每次保存 UCDB,失败立即停止;
  5. 合并 UVM coverage;
  6. 运行 directed bench;
  7. 合并最终 51-run 报告。

下一轮改进路线

  1. 补齐 16 种 WSTRB,并整理 impossible/illegal cross bins。
  2. 为项目专用 CSR 模块建立独立 UVM 配置与 RW1C reference model。
  3. 去除 UVM 中对 32 位、4 字节对齐和 4 寄存器的硬编码。
  4. 对关键 SVA 做自动化反例注入,证明 checker 能在预期位置失败。
  5. 分析 4 条未覆盖 statement 和未翻转 bit,区分刺激缺口、不可达逻辑与冗余代码。
  6. 在 CI 中运行轻量 smoke/error 测试,完整 50-seed regression 保留为发布基线。

项目复盘

这个项目最有价值的部分不是“用了 UVM”,而是形成了闭环:规格行为映射到 sequence 和 assertions,monitor 把引脚行为还原为事务,scoreboard 判断正确性,coverage 说明刺激范围,回归脚本保存可复现证据,最后对剩余缺口给出解释。

面试中应同时讲结果和边界:51/51 PASS 是当前验证计划下的证据;82.14% 功能覆盖率和 69.30% toggle coverage 则清楚指出下一步工作,而不是需要隐藏的数字。

上一篇:SVA 协议检查。返回 项目总览。