第3章 验证计划与验证策略制定:核心概念、原理机制、实战要点

3.1 问题背景

在芯片开发周期中,验证往往占用 60%~70% 的总工时。缺少清晰验证计划的项目,通常会在验证中期陷入“盲测”——测试用例零散、覆盖率指标模糊、回归失败无从判断优先级。验证计划是连接设计规格与验证活动的“工程契约”,它回答三个核心问题:验证什么(功能点)、怎么验证(策略与方法学)、何时算完成(退出准则)。

验证计划不是文档负担,而是提前识别风险、量化验证收敛路径的决策工具。

3.2 核心概念

  • 验证计划(Verification Plan):描述验证对象、验证方式、资源安排与完成标准的工程文档。
  • 验证策略(Verification Strategy):在风险与成本约束下,对验证层次、方法学、工具链和流程的整体选择。
  • 功能点(Feature Point):从设计规格中提取的最小可验证行为单元,是覆盖建模的基础。
  • 覆盖模型(Coverage Model):功能覆盖点、交叉覆盖与断言的集合,用于量化验证充分度。
  • 验证收敛(Closure):当覆盖率、缺陷率、风险评估达到既定指标时,验证终止的条件。

验证计划与策略制定的核心流程可概括为五步:

验证计划与验证策略制定流程 需求解读 规格/接口/时序 功能点提取 可测行为单元 验证策略 层次与方法学 覆盖模型 功能+断言+代码 基线评审 回归与收敛 验证计划 = 测什么 + 怎么测 + 何时算完成

3.3 原理机制

验证计划制定的底层机制是“目标分解 → 策略映射 → 度量闭环”:

  • 目标分解:将设计规格中的功能描述拆解为独立的可测功能点。
  • 策略映射:每个功能点至少映射一种验证手段——定向测试、约束随机、断言或硬件加速。
  • 度量闭环:功能覆盖率反映“测了多少功能”,代码覆盖率反映“代码执行了多少”,二者共同驱动回归补充,直到满足退出准则。

3.4 流程步骤

  1. 解读设计规格:阅读设计文档、接口协议、时序图,列出待澄清问题。
  2. 提取功能点:拆解为可验证行为单元,标注优先级与风险等级。
  3. 确定验证层次:规划 IP 级、SoC 级、系统级的验证范围与复用关系。
  4. 制定验证策略:选择约束随机、断言、故障注入等方法的组合。
  5. 设计覆盖模型:定义功能覆盖点、交叉覆盖与断言覆盖。
  6. 编写并评审计划:输出计划基线,作为回归测试的准入依据。

3.5 案例说明:UART 控制器验证计划

以 UART 控制器 IP 为例,从规格中提取典型功能点,并映射验证策略与覆盖方式:

编号 功能点 验证策略 覆盖方式
FP-01 波特率分频配置 约束随机 + 定向 功能覆盖点
FP-02 8/9 位数据帧收发 定向测试 断言覆盖
FP-03 FIFO 上溢保护 异常注入 功能覆盖点
FP-04 流控线 CTS/RTS 断言 + 定向 交叉覆盖
FP-05 中断状态清除 随机序列 + 定向 代码覆盖 + 功能覆盖

3.6 表格总结:验证计划关键要素

要素 作用 关键产出
功能点列表 明确验证对象 可追踪功能矩阵
验证层次选择 确定验证粒度 层次与模块归属表
覆盖模型 量化验证进展 覆盖率报告
回归策略 保障持续集成 回归通过标准
退出准则 判定验证完成 签核报告

3.7 误区提醒

  • 计划没有优先级:所有功能点平均用力,导致高风险路径未被充分验证。
  • 被覆盖率绑架:只追求 100% 代码覆盖率,却遗漏关键功能覆盖点,发现不了协议级缺陷。
  • 忽略异常注入:仅验证正常路径,FIFO 上溢、同步失败、配置冲突等异常场景覆盖不足。
  • 回归策略缺失:没有种子管理和统一回归脚本,环境变更后无法快速判断是否引入新问题。

3.8 实践清单

  • 验证计划基线是否在 RTL 全面开发前建立?
  • 每个功能点是否映射到至少一种验证手段?
  • 覆盖率目标是否同时包含功能覆盖与代码覆盖?
  • 回归脚本是否支持随机种子可重复执行?
  • 退出准则是否经过设计、验证、架构三方评审确认?
回归脚本建议统一管理随机种子:例如使用 +seed=100 固定复现问题,使用 +seed=$random 扩展随机空间。
# 回归脚本示例(简化)
vsim -c top_tb -do "run -all; coverage save cov.ucdb" +seed=100
vcover merge regression.ucdb cov.ucdb
vcover report -details regression.ucdb