第2章 验证计划与覆盖率驱动的验证流程

2.1 问题背景

在复杂 SoC 设计验证中,团队常陷入一个困境:回归用例持续增加,仿真资源不断消耗,但“验证是否完备”始终缺乏可量化答案。盲目的约束随机与向量堆叠无法带来收敛,只会放大噪声。真正有效的验证需要把目标拆解为可测量的覆盖空间,并通过闭环迭代持续逼近。这正是覆盖率驱动验证(Coverage-Driven Verification, CDV)要解决的核心问题。

2.2 核心概念

  • 验证计划:将设计规格转化为可验证目标与场景清单的工程文档,是覆盖率模型与激励策略的唯一输入来源。
  • 覆盖率驱动验证(CDV):以功能覆盖率和代码覆盖率为双指针,指导激励生成、回归执行与收敛判断的闭环流程。
  • 功能覆盖率:通过 covergroup、coverpoint 与 cross 建立的语义覆盖模型,回答“设计行为是否被看到”。
  • 收敛:覆盖率增长进入平台期,且目标覆盖项全部命中,并在连续多轮回归中保持稳定。
验证计划 覆盖率建模 激励与回归 覆盖率分析 收敛决策

2.3 原理机制:CDV 闭环

CDV 的本质是“计划—建模—执行—分析—收敛”的迭代环。每轮回归都必须复盘覆盖率增量,并将其作为下一轮激励调整的依据。核心路径如下:

  • 验证计划将规格翻译为可量化场景;
  • 覆盖率模型把场景映射为统计事件;
  • 约束随机激励与回归产生仿真数据;
  • 覆盖率分析挖掘未命中项与根因;
  • 收敛决策指导补盲或调整模型,形成下一轮输入。

2.4 流程步骤

  1. 制定验证计划:从设计规格、协议规范和风险清单中提取功能点,形成可跟踪验证矩阵。
  2. 建立覆盖率模型:将验证矩阵中的场景翻译为 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
  1. 设计激励并回归:基于约束随机生成事务,批量执行回归,保留 seed 与配置以支持复现。
  2. 采集与合并覆盖率:将多个 seed、多组回归的覆盖率数据库合并,生成整体未命中清单。
  3. 分析缺口并决策:对比覆盖率目标,定位未覆盖项,决定追加定向用例、调整约束或修正模型。

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 轮回归无新增覆盖事件。