验证计划制定:如何编写验证计划,验证范围定义,功能覆盖率目标设定

做验证这么多年,我见过太多项目在验证计划上栽跟头。有人觉得计划就是走个过场,有人把计划写得比小说还厚结果没人看。说实话,验证计划这东西,写得太粗等于没写,写得太细又没人执行。今天我就聊聊,怎么把验证计划做到「刚刚好」。

一、验证计划到底长什么样?

先说说我的理解。验证计划不是文档,是地图。你想想看,一个芯片几百个功能点,几十万行代码,没有地图你怎么走?

我个人习惯把验证计划分成三个层次:

  • 策略层:回答「测什么、不测什么」
  • 方法层:回答「用什么方法测」
  • 执行层:回答「谁、什么时候、测到什么程度」

我在项目中遇到过最典型的反面教材——有人把验证计划写成了「我们要做功能验证、时序验证、功耗验证...」这种废话。这跟没说一样。好的计划应该具体到:哪个模块用UVM,哪个场景用formal,覆盖率目标定多少。

核心原则:验证计划必须可执行、可度量、可追溯。

二、验证范围定义——别什么都往里装

很多新手容易犯一个错误:恨不得把所有功能点都写进计划。结果呢?计划厚得像砖头,最后根本执行不完。

验证范围定义,说白了就是做减法。我一般用「三圈法」:

  1. 必须测的圈:规格书里明确的功能、接口协议、关键路径
  2. 应该测的圈:边界条件、异常处理、低概率场景
  3. 可以测的圈:性能极限、随机压力、跨时钟域

举个例子。我之前做的一个PCIe控制器项目,团队一开始列了200多个测试点。我让他们先砍掉那些「理论上不会出问题」的场景,比如复位时序的极端情况——因为复位逻辑已经用formal验证过了。最后剩下80个核心测试点,项目反而提前了两周完成。

我的经验:验证范围不是越大越好。把80%的精力放在20%的高风险功能上,这才是聪明的做法。

三、功能覆盖率目标设定——别让数字骗了你

功能覆盖率这东西,我见过太多人把它当KPI来追。有人为了达到90%的覆盖率,拼命写covergroup,结果覆盖到了全是无关紧要的场景。这有什么意义?

设定覆盖率目标,我建议分三步走:

步骤 做什么 常见坑
第一步 识别关键功能点 把非关键功能也纳入统计
第二步 定义覆盖模型 cross cover写得太多,组合爆炸
第三步 设定达标阈值 盲目追求100%,忽略验证效率

我记得有个项目,团队把覆盖率目标定在95%。结果最后两周所有人都在补覆盖率,补的全是些边角料场景。核心功能反而没时间深挖。后来我学乖了:核心功能覆盖率定100%,非核心功能80%就够了。

警告:覆盖率只是手段,不是目的。别为了好看的数字,牺牲了验证质量。

四、验证计划模板——拿来就能用

说了这么多理论,给个实际模板吧。这是我这些年打磨出来的结构:

1. 验证范围
   - 模块列表(含优先级)
   - 功能点清单(含风险等级)
   - 不验证范围(明确说明)

2. 验证方法
   - 各模块验证策略(UVM/formal/C-model)
   - 测试用例分类(功能/异常/随机)
   - 覆盖率模型设计

3. 执行计划
   - 里程碑节点
   - 资源分配
   - 风险预案

4. 验收标准
   - 覆盖率目标(分模块设定)
   - 回归测试通过率
   - 遗留问题处理规则

我曾经用这个模板帮一个团队做验证计划,原来他们写计划要花两周,现在两天就能搞定。关键不是模板本身,而是你清楚每个条目背后要回答什么问题。

五、避坑指南——我踩过的那些坑

最后分享几个我亲身经历过的教训:

  • 坑一:计划写得太完美。我曾经花了一个月写了一份50页的验证计划,结果项目需求一变,全废了。现在我的计划最多10页,留出30%的弹性空间。
  • 坑二:覆盖率目标一刀切。所有模块都定90%?别傻了。控制逻辑和数据处理逻辑的风险完全不一样,目标应该分开设。
  • 坑三:忽略回归测试计划。很多人只关注新功能的验证,忘了回归。结果新功能没问题,老功能反而坏了。回归测试的覆盖率目标应该单独列出来。

嗯,说到这我想起来了。有一次我接手一个项目,验证计划里写了「所有模块覆盖率目标95%」。我一看,有个模块是简单的寄存器配置,根本没什么功能点。硬要凑95%的覆盖率,纯属浪费时间。后来我把那个模块的目标改成了70%,省下来的时间全用在了核心数据通路的验证上。

所以啊,验证计划这东西,灵活比完美重要。你想想看,计划是给人用的,不是用来供着的。只要能把验证工作引导到正确的方向上,这就是一份好计划。