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统计

这五个部分缺一不可。我见过很多团队,硬件平台很豪华,但自动化脚本一塌糊涂。每次改完代码,手动点鼠标等半小时出比特流,再手动敲命令跑测试。这种效率,一个月能跑几个用例?

下面这张图,是我自己总结的验证平台架构,你们可以照着搭:

FPGA验证平台架构 测试激励(定向/随机) DUT(待测设计) FPGA上的RTL实现 参考模型(C/C++/SystemC) 理想行为模型 结果比较器(Pass/Fail) 调试与监控(ILA/VIO) 自动化脚本(编译/运行/回归) 硬件平台(FPGA板 + 外围器件 + 接口) 说明:激励同时送入DUT和参考模型,比较器自动判断结果,调试工具实时抓取内部信号

这张图里,我特别想强调参考模型和比较器这两个部分。很多新手搭平台,只把DUT跑起来,然后拿示波器看波形对不对。这太原始了。

正确的做法是:写一个C模型,把同样的激励喂进去,让比较器自动比对DUT输出和模型输出。这样跑一万个用例,机器自动告诉你哪个没过,而不是你盯着波形一条条看。

我的建议:

刚开始搭平台,别追求完美。先做到这三件事:

  1. DUT能在FPGA上跑起来
  2. 能用ILA抓到关键信号
  3. 能自动比对至少一个典型用例的结果

这三件事做到了,平台就算立住了。后面再慢慢加自动化、加覆盖率、加随机测试。

嗯,第一章就聊这么多。验证这件事,说难不难,说简单也不简单。关键是思路要对——你不是在“测”设计,你是在“证明”设计是对的。这个心态转变了,后面学起来就顺了。