1. 验证环境概述:什么是验证、验证在芯片设计流程中的位置、验证工程师的职责与技能树
1.1 到底什么是验证?
先聊聊最基础的问题——验证是什么。
说白了,验证就是「检查你的设计对不对」。你写了一大堆 RTL 代码,功能看起来跑通了,但你真的确定它在所有情况下都正确吗?
我见过太多人把「仿真通过」和「验证完成」划等号。其实差远了。仿真只是验证的一种手段,验证的本质是证明你的设计在所有合法输入下,行为都符合预期。
举个例子。你写了一个加法器,输入 1+1 得到 2,这没问题。但输入 2^31-1 + 1 呢?溢出时行为对吗?边界条件呢?随机激励下呢?
验证就是干这个的——穷尽一切可能,找出设计的漏洞。
1.2 验证在芯片设计流程中的位置
芯片设计流程,我习惯把它分成几个大阶段:
- 需求定义——芯片要做什么
- 架构设计——怎么实现
- RTL 编码——写代码
- 验证——检查代码对不对
- 后端实现——综合、布局布线
- 流片——送去制造
- 测试——回来测芯片
验证在哪个位置?嗯,它贯穿整个流程。
从架构阶段开始,验证就要介入。我记得有一次,架构文档里写了一个很复杂的握手协议,我一看就觉得有问题。后来搭环境一跑,果然死锁了。如果等到 RTL 写完才发现,那改起来就痛苦了。
验证不是「设计完了再检查」,而是从第一天就开始。
下面这张图可以帮你理解验证在整个流程中的位置:
1.3 验证工程师的职责
验证工程师到底干什么?很多人以为就是「写 testbench 跑仿真」。其实远不止这些。
我总结了一下,验证工程师的核心职责包括:
- 理解设计规范——你得先知道设计要做什么,才能验证它做对了没有
- 制定验证计划——哪些功能要测?边界条件是什么?覆盖率目标多少?
- 搭建验证环境——用 UVM、SystemVerilog 搭一个可复用的验证平台
- 编写测试用例——定向的、随机的、带约束的,各种 case 都要有
- 调试失败用例——仿真挂了,是设计 bug 还是环境问题?
- 分析覆盖率——功能覆盖率、代码覆盖率,看看还有哪些没测到
- 撰写验证报告——证明验证工作完成了,设计可以送去流片了
1.4 验证工程师的技能树
想成为一名合格的验证工程师,需要掌握哪些技能?我列了一个清单:
| 技能类别 | 具体技能 | 重要程度 |
|---|---|---|
| 编程语言 | SystemVerilog、Verilog、C/C++、Python、Perl | ★★★★★ |
| 验证方法学 | UVM、VMM、OVM | ★★★★★ |
| EDA 工具 | VCS、QuestaSim、Xcelium、Verdi | ★★★★☆ |
| 脚本能力 | Makefile、Shell、Tcl | ★★★★☆ |
| 协议知识 | AMBA AXI/AHB/APB、PCIe、DDR、USB、Ethernet | ★★★★☆ |
| 覆盖率分析 | 功能覆盖率、代码覆盖率、断言覆盖率 | ★★★★☆ |
| 调试能力 | 波形分析、日志分析、断点调试 | ★★★★★ |
| 软技能 | 沟通能力、文档能力、团队协作 | ★★★★☆ |
你可能会问:「这么多技能,我该从哪开始?」
我个人建议,先把 SystemVerilog 和 UVM 学扎实。这是验证的根基。然后学一个主流仿真工具,比如 VCS 或 QuestaSim。脚本能力可以边做边学,遇到重复劳动自然就想写脚本了。
1.5 验证的挑战与趋势
验证这个领域,说实话,越来越难了。
芯片规模越来越大,一个 SoC 可能有几十亿个晶体管。功能越来越复杂,各种低功耗模式、安全机制、多核协同。验证的复杂度呈指数级增长。
我遇到过最头疼的一个项目,光验证计划就写了 200 多页。跑一次回归要三天,覆盖率还死活上不去。最后加班加点搞了一个月才搞定。
现在的趋势是:
- 形式化验证——用数学方法证明设计正确,不需要跑仿真
- 验证自动化——用 AI 自动生成测试用例、自动分析覆盖率
- 硬件加速验证——用 FPGA 原型或 emulator 加速验证
- 软件与硬件协同验证——芯片还没回来,先跑软件
但不管趋势怎么变,验证的核心思想不会变——用系统化的方法,确保设计在所有情况下都正确。
好了,这一章就聊到这里。验证的世界很大,我们慢慢探索。