一、验证概述:芯片验证的定位、测试激励与功能覆盖的概念、验证计划制定

大家好,我是老李。做芯片验证这行十几年了,今天咱们聊聊验证的“根”。很多新人一上来就学SystemVerilog、学UVM,但我觉得,先搞清楚验证到底是干什么的,比什么都重要。

说白了,芯片验证就是给设计“挑刺”的。设计工程师把功能画出来、写出来,我们验证工程师的任务就是证明它“有问题”。听起来有点残酷,但这就是现实。你想想看,一颗芯片流片成本动辄几百万,要是回来发现功能不对,那可不是闹着玩的。

1.1 芯片验证的定位

验证在芯片开发流程里,到底站在什么位置?我习惯用一张图来说明:

芯片开发流程中的验证定位 需求定义 规格文档 RTL设计 代码实现 功能验证 测试激励 + 覆盖分析 后端实现 综合、布局布线 流片 Tape-out 验证反馈 验证贯穿整个流程:从需求评审到流片前签收,验证无处不在

从这张图能看出来,验证不是最后才做的事。我见过太多项目,设计写完了才想起来搭验证环境,结果发现架构就有问题,推倒重来。嗯,那滋味可不好受。

核心观点:验证是芯片质量的守门员。没有充分的验证,再好的设计也只是纸上谈兵。

1.2 测试激励与功能覆盖的概念

好,咱们聊聊两个最基础的概念:测试激励和功能覆盖。

测试激励是什么?

测试激励,说白了就是给DUT(待测设计)喂的数据。你想想看,你要测试一个加法器,总得给它两个加数吧?这两个加数就是激励。但实际项目里,激励远不止这么简单。

我个人习惯把激励分成三类:

激励类型 说明 举例
定向激励 针对特定场景,手动构造的测试数据 边界值测试:给FIFO写满再读
随机激励 通过约束随机生成,覆盖大量组合 随机地址、随机数据、随机延迟
错误激励 故意注入异常,验证容错机制 CRC错误、协议违例、地址越界

我的经验:刚入行时我总喜欢写定向测试,觉得可控。后来发现,随机激励才是发现隐藏bug的利器。我曾经用随机测试在第三轮回归中抓到了一个概率只有万分之一的死锁问题——定向测试根本不可能覆盖到。

功能覆盖又是什么?

功能覆盖,就是回答一个问题:“我们测全了吗?”

你写了1000个测试用例,但可能只测了同一个功能点。功能覆盖就是帮你量化“测了哪些、漏了哪些”。

我常用的覆盖模型包括:

  • 覆盖点(Coverpoint): 比如“写操作”、“读操作”、“写后读”
  • 交叉覆盖(Cross Coverage): 比如“写操作 + 满标志 = 1”这个组合
  • 转换覆盖(Transition Coverage): 比如状态机从IDLE跳到BUSY再跳回IDLE

注意:覆盖率100%不代表没有bug。我曾经有一个项目,功能覆盖率做到了98%,但漏掉了一个“写指针回绕时读指针恰好也在同一位置”的场景——结果流片回来就挂在这个点上。覆盖率只是工具,不是目标。

1.3 验证计划制定

验证计划,英文叫Verification Plan,简称VPlan。这是整个验证工作的“宪法”。没有计划就开始写代码,就像没有图纸就盖房子——迟早要塌。

我制定验证计划时,一般按这个步骤来:

  1. 读规格文档 —— 把设计规范吃透,不懂就问设计工程师
  2. 提取功能点 —— 把每个功能拆解成可验证的原子点
  3. 确定验证策略 —— 哪些用定向测试?哪些用随机?哪些用形式化?
  4. 规划环境架构 —— 用UVM还是自建框架?需要哪些agent?
  5. 制定里程碑 —— 什么时候完成冒烟?什么时候达到90%覆盖?
  6. 风险评估 —— 哪些功能点容易出问题?需要额外投入?

这里我分享一个实际项目中的VPlan片段(简化版):

// 验证计划示例:AHB Slave模块
// 功能点ID: AHB_SLV_001
// 功能描述: 单次写操作,地址对齐
// 验证方法: 定向测试 + 随机测试
// 覆盖要求: 地址覆盖所有4字节对齐边界
// 优先级: P0(必须覆盖)
// 负责人: 张三
// 状态: 已完成

// 功能点ID: AHB_SLV_002
// 功能描述: 突发写操作,4拍增量
// 验证方法: 随机测试
// 覆盖要求: 地址不跨越1KB边界
// 优先级: P1
// 负责人: 李四
// 状态: 进行中

避坑指南:我曾经犯过一个错误——验证计划写得过于笼统,比如“测试所有读写操作”。结果到项目后期才发现,有些组合根本没测到。后来我学乖了,每个功能点都写清楚“怎么测、测多少、谁负责”。计划越细,后期返工越少。

制定计划时,我还会留出20%的buffer时间。为什么?因为总会有意外。比如某个IP核的规格临时变更,或者发现了一个需要额外验证的corner case。没有buffer,项目就只能加班——你懂的。

小结

这一章咱们聊了验证的定位、测试激励和功能覆盖的概念,以及怎么制定验证计划。说白了,验证就是“用系统的方法找出设计中的漏洞”。测试激励是我们的武器,功能覆盖是我们的地图,而验证计划就是我们的作战方案。

记住一句话:验证不是为了证明设计是对的,而是为了证明设计是错的。带着这个心态去做验证,你会发现很多有意思的东西。

可可精品资料库