第2章 验证计划与覆盖率驱动的验证流程
2.1 问题背景
在复杂 SoC 设计验证中,团队常陷入一个困境:回归用例持续增加,仿真资源不断消耗,但“验证是否完备”始终缺乏可量化答案。盲目的约束随机与向量堆叠无法带来收敛,只会放大噪声。真正有效的验证需要把目标拆解为可测量的覆盖空间,并通过闭环迭代持续逼近。这正是覆盖率驱动验证(Coverage-Driven Verification, CDV)要解决的核心问题。
2.2 核心概念
- 验证计划:将设计规格转化为可验证目标与场景清单的工程文档,是覆盖率模型与激励策略的唯一输入来源。
- 覆盖率驱动验证(CDV):以功能覆盖率和代码覆盖率为双指针,指导激励生成、回归执行与收敛判断的闭环流程。
- 功能覆盖率:通过
covergroup、coverpoint与cross建立的语义覆盖模型,回答“设计行为是否被看到”。 - 收敛:覆盖率增长进入平台期,且目标覆盖项全部命中,并在连续多轮回归中保持稳定。
2.3 原理机制:CDV 闭环
CDV 的本质是“计划—建模—执行—分析—收敛”的迭代环。每轮回归都必须复盘覆盖率增量,并将其作为下一轮激励调整的依据。核心路径如下:
- 验证计划将规格翻译为可量化场景;
- 覆盖率模型把场景映射为统计事件;
- 约束随机激励与回归产生仿真数据;
- 覆盖率分析挖掘未命中项与根因;
- 收敛决策指导补盲或调整模型,形成下一轮输入。
2.4 流程步骤
- 制定验证计划:从设计规格、协议规范和风险清单中提取功能点,形成可跟踪验证矩阵。
- 建立覆盖率模型:将验证矩阵中的场景翻译为
covergroup、coverpoint与cross。示例:
covergroup bus_cov @(posedge clk);
opcode_cp : coverpoint opcode;
len_cp : coverpoint len;
x_op_len : cross opcode_cp, len_cp;
endgroup
- 设计激励并回归:基于约束随机生成事务,批量执行回归,保留 seed 与配置以支持复现。
- 采集与合并覆盖率:将多个 seed、多组回归的覆盖率数据库合并,生成整体未命中清单。
- 分析缺口并决策:对比覆盖率目标,定位未覆盖项,决定追加定向用例、调整约束或修正模型。
2.5 案例说明
某总线桥模块验证中,计划定义了 14 个场景,覆盖率模型包含 22 个状态点与 5 个 cross。首轮回归代码覆盖率为 93%,功能覆盖率仅 38%——缺失集中在读写交错和窄突发边界。分析后新增 4 条定向约束序列,第 7 轮回归后功能覆盖率达到 100%,代码覆盖率升至 96%;随后连续三轮无新增覆盖事件,判定验证收敛。
2.6 流程总结表
| 阶段 | 输入 | 关键动作 | 输出 / 判据 |
|---|---|---|---|
| 计划 | 设计规格 | 功能分解、风险识别 | 验证矩阵、覆盖目标 |
| 建模 | 验证矩阵 | covergroup / cross 设计 | 覆盖率模型 |
| 执行 | 模型、约束、seed | 回归批量运行 | trace、log、覆盖率原始数据 |
| 分析 | 覆盖率报告 | 缺口定位、根因分析 | 未覆盖项清单、原因列表 |
| 收敛 | 未覆盖项清单 | 补盲、调约束、修正模型 | 连续 N 轮无新增覆盖 |
2.7 误区提醒
- 只统计代码覆盖率,直接忽略功能覆盖率,导致“代码跑了,功能没验”。
- 覆盖率模型过度简化,缺少 cross,覆盖率虚高失真。
- 等全部回归结束才开始收集覆盖率,缺乏过程性闭环。
- 只看全局汇总,不检查子模块、子场景粒度的独立覆盖。
- 不做根因分析,盲目增加随机 seed,期望覆盖率自然填满。
2.8 实践清单
- 项目启动第一周内建立验证计划模板,每个 Feature 绑定覆盖目标。
- 先搭好覆盖率模型,再大规模开发激励,避免后期补模型导致历史数据失真。
- 每次回归合并覆盖率数据库,1 小时内输出增量差异报告。
- 缺口分析采用“缺口—原因—动作”三栏表格闭环管理。
- 收敛判据写成显式指标:连续 3 至 5 轮回归无新增覆盖事件。