1. FPGA验证概述
各位同学好,我是老李。做FPGA验证这行有十几年了。今天咱们聊聊验证这件事儿。
很多人觉得验证就是“测一测”,其实远没那么简单。我刚开始带项目时,也以为写代码比验证重要。后来吃过亏才明白——验证才是决定芯片能不能一次成功的命门。
1.1 FPGA验证在芯片设计流程中的位置
芯片从想法到量产,大致走这么几步:
| 阶段 | 产出 | 验证手段 |
|---|---|---|
| 需求定义 | 设计规格书 | 文档评审 |
| 架构设计 | 架构文档 | 建模验证 |
| RTL编码 | Verilog/VHDL代码 | 仿真验证、形式验证 |
| FPGA原型验证 | FPGA比特流 | 板级测试、软硬件协同验证 |
| 综合/布局布线 | 门级网表 | STA、后仿 |
| 流片 | GDSII | 物理验证 |
| 芯片测试 | 芯片样品 | ATE测试、系统测试 |
看到没?FPGA验证卡在RTL编码之后、综合之前。这个位置很关键——它是流片前最后一次能完整跑系统级场景的机会。
我记得有个项目,仿真跑了三个月,覆盖率99%。结果FPGA上板一跑,CPU和外设的握手协议就出问题了。为什么?仿真环境里激励太“干净”了,真实世界的毛刺、异步时钟域交互,仿真根本模拟不全。从那以后,我坚持每个项目必须留出FPGA验证的时间。
1.2 验证与测试的区别
这个问题我面试时必问。很多人答不上来,或者混着说。
一句话总结:
- 验证(Verification):检查设计是否做对了(Did we build the thing right?)
- 测试(Testing):检查做出来的东西有没有坏(Did we build the right thing?)
说白了,验证是流片前的事,测试是流片后的事。
| 维度 | 验证 | 测试 |
|---|---|---|
| 时间点 | 流片前 | 流片后 |
| 对象 | 设计模型(RTL/网表) | 物理芯片 |
| 目标 | 发现功能/时序bug | 发现制造缺陷 |
| 方法 | 仿真、形式分析、FPGA原型 | ATE、边界扫描、BIST |
| 覆盖率 | 功能覆盖率、代码覆盖率 | 故障覆盖率 |
| 成本 | 时间成本为主 | 流片失败成本极高 |
举个例子。你写了个UART模块,验证要确认它能不能在9600波特率下正确收发数据。测试则是芯片回来后,用示波器量TX/RX引脚,看波形对不对、电压够不够。
我曾经踩过的坑:
有个项目,验证环境里UART功能全过,但FPGA上板后死活收不到数据。查了两天,发现是验证环境里时钟频率设错了,比实际板子快了10倍。这就是验证环境没对齐真实场景的典型问题。所以我现在要求:FPGA验证的时钟、复位、IO时序必须和最终芯片一致。
1.3 验证平台的基本组成
一个完整的FPGA验证平台,说白了就是让设计在真实硬件上跑起来,同时还能观察、调试。我习惯把它分成五个部分:
我的经验:别一上来就搭大而全的平台。先跑通最小系统,再逐步加模块。否则出了问题,你根本不知道是设计bug还是平台bug。
1.3.1 硬件平台
- FPGA开发板:选型要看逻辑资源、IO数量、高速收发器、DDR接口够不够
- 外围器件:DDR颗粒、Flash、PHY芯片、ADC/DAC等
- 接口连接器:FMC、HSMC、SMA等,方便扩展
- 电源/时钟:多路独立供电、可编程时钟发生器
1.3.2 开发工具链
- 综合实现工具:Vivado、Quartus、Libero
- 仿真工具:VCS、QuestaSim、Xsim
- 调试工具:ChipScope、SignalTap、逻辑分析仪
- 版本管理:Git、SVN
1.3.3 测试激励与参考模型
- 定向测试用例:覆盖典型场景
- 随机测试用例:覆盖边界和异常
- 参考模型:C/C++/SystemC模型,用于比对结果
- 自检机制:比对通过/失败自动判断
1.3.4 调试与监控
- ILA(集成逻辑分析仪):抓内部信号波形
- VIO(虚拟IO):实时读写寄存器
- 串口/网口打印:输出调试信息
- JTAG调试链:在线更新、单步调试
1.3.5 自动化脚本
- 编译脚本:一键综合、布局布线、生成比特流
- 运行脚本:自动加载配置、启动测试
- 结果收集脚本:自动比对、生成报告
- 回归测试脚本:批量跑用例,输出pass/fail统计
这五个部分缺一不可。我见过很多团队,硬件平台很豪华,但自动化脚本一塌糊涂。每次改完代码,手动点鼠标等半小时出比特流,再手动敲命令跑测试。这种效率,一个月能跑几个用例?
下面这张图,是我自己总结的验证平台架构,你们可以照着搭:
这张图里,我特别想强调参考模型和比较器这两个部分。很多新手搭平台,只把DUT跑起来,然后拿示波器看波形对不对。这太原始了。
正确的做法是:写一个C模型,把同样的激励喂进去,让比较器自动比对DUT输出和模型输出。这样跑一万个用例,机器自动告诉你哪个没过,而不是你盯着波形一条条看。
我的建议:
刚开始搭平台,别追求完美。先做到这三件事:
- DUT能在FPGA上跑起来
- 能用ILA抓到关键信号
- 能自动比对至少一个典型用例的结果
这三件事做到了,平台就算立住了。后面再慢慢加自动化、加覆盖率、加随机测试。
嗯,第一章就聊这么多。验证这件事,说难不难,说简单也不简单。关键是思路要对——你不是在“测”设计,你是在“证明”设计是对的。这个心态转变了,后面学起来就顺了。