用FPGA搭建硬件在环(HIL)平台:真实芯片验证的实战指南
发布时间:2026/9/8 11:10:44 锦皓数字建站
平台:真实芯片验证的实战指南`)
做芯片验证久了你会发现一个很微妙的心态变化仿真跑通不等于芯片能跑模型行为再漂亮也不如真实器件焊上去一脚一脚测出来的信号可信。我最近在搭的一套FPGA硬件在环HIL验证环境就是专门干这件事的——用FPGA来伺候真实芯片把被测芯片放到一个可控的电气和时序环境里逼着它在各种边界条件下把问题暴露出来。先说清楚这里的“模型”指什么。我们在做嵌入式开发、板级调试或者芯片验证时经常依赖厂家提供的仿真模型比如一颗传感器芯片的Verilog模型、一颗电源芯片的SPICE模型或者一颗通信芯片的C语言库。模型好用但模型本质上是人对硬件的理解抽象总有理想化成分。HIL验证的思路是让被测对象变成真实芯片本身用FPGA实时产生激励、捕获响应、在线比对把仿真环境里“看不见”的真实信号行为全部纳入测试范围。这篇文章不是教科书是我实际搭建这类平台的经验整理。内容涉及为什么非要测真实芯片、HIL平台的硬件架构怎么选、关键模块怎么设计、调试时哪些坑最常见。适合芯片验证工程师、嵌入式软件工程师以及那些刚接触FPGA想做芯片测试的朋友。1. 为什么非要测真实芯片1.1 模型天生是“理想化过滤镜”仿真模型要解决的核心问题是“功能抽象”。厂家写模型时会把芯片当成一个黑盒只描述输入和输出的逻辑关系很少会去描述真实的电气行为。比如一颗I2C接口的传感器它的Verilog模型里可能只有标准的I2C时序、寄存器读写但真实芯片在SCL上升沿附近可能因为内部触发器的建立时间不够而产生亚稳态可能在电源电压跌落到阈值附近时输出毛刺甚至在总线被外部强拉时出现闩锁现象。这些细节不是模型“故意漏掉”而是想在模型里完整还原它们的成本太高。一颗芯片内部的晶体管级行为、ESD结构、I/O驱动能力曲线仿真起来复杂度惊人。很多时候厂家连自己都没完全搞清楚某些异常行为自然不会写进模型。HIL环境的价值就在于它不依赖任何人对芯片行为的抽象直接把真实行为呈现在你面前。1.2 仿真速度撑不起长时间行为验证RTL仿真跑一个完整的事务序列比如让一颗通信芯片连续工作半个小时这在逻辑仿真器里几乎是不可想象的。ModelSim或VCS跑几十毫秒的仿真时间可能就要几个小时更别说模拟热漂移、PLL失锁、定期唤醒这种需要真实时间积累的现象。我这次验证的项目里被测芯片是一颗带内部PLL的接口芯片它在长时间工作后偶发失锁用仿真模型根本复现不出来因为模型的PLL就是一个简单的分频行为不存在失锁状态。放到FPGA硬件在环环境里我让FPGA连续产生激励跑了一晚上第二天早上在日志里抓到了三次失锁事件这才算真正定位到问题。这种时间维度上的优势是模型仿真永远追不上的。1.3 模型验证的是“设计意图”HIL验证的是“物理现实”模型验证的前提是“模型正确”但模型正确不等于芯片正确。芯片流片回来后可能因为工艺偏差、封装应力、供电噪声行为与模型存在细微差异。这些差异在功能层面可能看不出但在时序余量、信号完整性和长时间可靠性上会清晰暴露。所以要明确一点HIL验证不是要替代模型仿真而是补上模型仿真覆盖不到的那一块。模型仿真回答“逻辑对不对”HIL验证回答“芯片在真实电气环境下还能不能对”。尤其当你拿到一颗全新的芯片或者供应商修改过内部设计在没有权威模型的情况下用FPGA搭一套HIL环境做第一轮摸底是最靠谱的路径。2. FPGA硬件在环验证的整体架构与方案选型2.1 HIL验证平台的基本组成一套典型的FPGA硬件在环验证平台至少包含四个部分被测试的真实芯片DUT、FPGA开发板、控制与数据采集单元通常是MCU或PC、观测调试设备示波器、逻辑分析仪。FPGA在中间扮演的角色是“高速激励源实时响应分析器”它既要按协议时序给DUT发送配置和数据又要以足够快的速度采样DUT的输出做在线比对。以我这次的平台为例DUT是一颗SPI接口的信号调理芯片FPGA负责模拟SPI主机、发送配置寄存器数据、连续读取转换结果。STM32H743通过FMC接口连接FPGA负责下发测试用例、收集错误统计。整个过程不需要PC实时干预FPGA和STM32协同完成自动化测试这种架构的好处是可以长时间无人值守运行。2.2 为什么选FPGA而不是MCU直连有人会问芯片测试直接用单片机的IO口模拟协议不就行了吗低速场景确实可以但一旦涉及上百兆的并行接口、精确到纳秒级的协议时序、或者需要同时产生多路同步信号MCU的定时器和GPIO响应速度就不够了。FPGA的优势在于引脚级时序确定性。逻辑综合布局布线后FPGA的输出延迟是可控的可以用时序约束把信号稳定在目标窗口内。另一大优势是并行性一个FPGA里可以同时例化多个协议引擎每种引擎独立工作互不干扰这对测试多通道芯片非常有帮助。当然也不是说FPGA能包打天下。FMC接口方案里STM32H743的优势是生态成熟、信号处理能力强适合做测试脚本解释和日志管理。FPGA的优势是高速接口和精确时序两者配合干活是当前工程上很顺手的组合。2.3 方案选型时需要考虑的几个关键点选FPGA芯片本身时我一般关注四件事。一是逻辑资源要留够余量建议至少留出30%空闲否则布局布线阶段会很痛苦。二是可用IO数量被测芯片接口多不多、是否同时需要多路采样通道决定了你要选多大的封装。三是片上存储FIFO和BRAM在激励缓存、数据缓冲里用得非常多存储小的片子做复杂协议容易捉襟见肘。四是支持的电平标准如果DUT需要1.8V IO而FPGA只支持3.3V就要额外加电平转换芯片。接口方案上FMC连接器是目前FPGA开发板上最常见的扩展口。FMC的信号完整性比杜邦线强太多引脚规则、阻抗匹配都在连接器层面处理好了。STM32H743那边用FMC并行总线与FPGA通信地址线数据线控制线整套下来从软件层面看就像读写外部SRAM一样简单在HIL环境里调试效率很高。3. 环境搭建与关键模块实现3.1 硬件接线与电源设计搭建这个平台第一件事不是写代码是规划硬件链路。FPGA的FMC口跟STM32H743之间我建议不要直接飞线而是通过一块FMC转接板做信号整形和电平适配。STM32H743的IO电压一般是3.3VFPGA的Bank电压按DUT需求设置如果DUT是1.8V供电FPGA对应Bank就配1.8V尽量让信号链路在电平标准上统一减少转换节点。电源设计是这里最容易被忽视但最重要的环节。被测芯片的供电我习惯用独立LDO而不是DCDC开关电源。DCDC的高频纹波会在DUT内部耦合出各种莫名其妙的问题你排查半天还以为是芯片BUG结果拿示波器一测供电纹波快赶上信号幅度了。LDO虽然效率低但纹波指标好测芯片时稳定压倒一切。还要处理上电时序。很多芯片对上电顺序有严格要求比如核心电压必须先于IO电压否则有闩锁风险。我这次用FPGA的GPIO控制两个电源芯片的EN引脚通过一个简单的状态机控制延时确保先核后IO。具体延时常数可以在板上用调电位器配合示波器调出来比直接改板子灵活。3.2 FPGA内部模块划分与时钟策略FPGA内部我划分成四块FMC从设备接口模块、激励生成与协议引擎、响应采样与校验模块、调试观测接口模块。每块之间通过FIFO解耦避免一个模块的忙等拖垮整条链路。时钟策略上我强烈建议多花一点心思。FPGA自身的系统时钟我用的板上50MHz有源晶振通过MMCM/PLL分频到各个接口需要的频率。给DUT提供的时钟我倾向用FPGA的PLL输出而不是直接从板上晶振硬引因为PLL输出的抖动指标在FPGA内部可控还可以通过驱动强度和输出延时调整减轻信号质量压力。跨时钟域的处理上FMC接口时钟和FPGA内部逻辑时钟不是一个域所有FMC读写的信号进来第一件事就是打两拍同步异步FIFO负责数据搬运。这些如果偷懒直接接大概率在高温或者长时间运行下出偶发错误而且极难复现。3.3 激励生成与协议引擎实现协议引擎是FPGA逻辑里最核心的部分。以我测的SPI芯片为例FPGA端实现一个SPI主机状态机支持模式0到模式3可选、时钟极性可配、位序可配、单次传输长度可配。这些参数都映射到寄存器里由STM32通过FMC写入。设计状态机的时候不要把所有功能堆在一个状态里。我习惯把“发命令”“读数据”“等待响应”拆成独立状态中间用计数器控制时序精度每个状态之间留有余量。这样做的好处是定位问题时可以只看状态寄存器知道卡在哪一步不需要在波形里一格一格去找。激励数据从哪来硬件在环验证的一个典型场景是回放采集到的真实场景数据。我先把一段真实场景的激励数据存到STM32的SD卡里测试时通过FMC DMA搬运到FPGA的BRAM再以精确时序发送给DUT。这样验证的就不再是构造出来的理想信号而是真实噪声环境、真实信号退化后的行为说服力强很多。3.4 响应采样与在线比对逻辑激励发出后DUT会输出响应信号。FPGA要做的不是简单把数据收回来而是边采集边比对。比对分两层第一层是协议层检查帧头、校验、数据长度是否符合预期第二层是数值层与期望值比较允许一定误差范围。我在比对模块里设计了一个直方图统计对DUT输出的关键时序参数比如响应延时、数据建立时间做统计分布而不只是记录对错。这个直方图对定位问题特别有用比如芯片某条路径时序余量变小了在直方图上会有明显漂移而光靠“通”和“不通”根本发现不了这种劣化趋势。错误处理也要提前想好。比对不一致时是把错误数据存入FIFO等待上位机读取还是直接打断当前测试流程我采用双模式开关。常规模式下记录错误继续跑用于长时间稳定性测试严格模式下遇到第一个错误就停住方便现场抓波形定位。3.5 调试观测接口设计HIL环境比纯软件仿真麻烦的地方在于FPGA内部节点不可见。我的解决办法是留一个调试观测口把关键内部信号引到Vivado的ILA集成逻辑分析仪核里面。ILA触发条件设置成“检测到错误标志拉高前一个周期”这样每次错误发生都能记录现场波形。对于FMC链路本身的调试我建议先跑回环。FPGA端把FMC写进来的数据原封不动放回去STM32H743只要发现读回的数据和写入不一致就说明物理链路或者FMC时序配置有问题先排除链路故障再往下测DUT这是排查问题最核心的先后顺序。4. 调试实录与常见问题排查4.1 上电时序没控好芯片第一次上板就发烫这个坑我印象太深了。HIL平台第一次联调被测芯片上电没几秒就开始微微发烫赶紧断电检查最后发现是IO电源先于核心电源到达导致芯片内部逻辑处于一种未定义状态寄生电流通路被激活。解决办法有两个方向硬件上把电源EN时序控制器接到FPGA上用软件控制时序软件上在FPGA配置完成前强制所有IO为高阻避免误输出。从那以后我所有平台的IO在上电期间一律设成输入高阻等系统初始化完成后才切换为输出。4.2 FMC通信数据错位不是时序问题而是地址线虚焊FMC链路反复测试不过数据总是有固定位错误。用示波器量数据线波形发现电平转换沿很干净不是信号质量问题。最后拿万用表对地址线引脚逐一测量发现有一根地址线在转接板上虚焊接触电阻时大时小。这类问题排查起来最费时间因为它不表现为“完全断”而是“时通时不通”用逻辑分析仪看波形有时候完全正常加个震动或者温度变化又出错。经验是固定位错误优先怀疑焊接和接插件不要一上来就调FMC时序参数调半天大概率没用。4.3 时钟抖动引起的偶发数据错位DUT偶尔报CRC错误但错误不规律几十次出现一次用示波器抓DUT输入时钟发现时钟沿上有明显的短毛刺幅度不大刚好过了时钟输入阈值。这个毛刺是FPGA PLL输出经过长走线后反射叠加形成的加上驱动强度设置过高沿过冲被振铃放大。处理方法是降驱动强度同时在时钟线上串联22欧姆电阻吸收反射。改完后跑了72小时错误再没出现。4.4 常用排查顺序速查表问题现象优先怀疑点快速排查手段功能完全无响应供电、复位、时钟是否到位示波器量各电源、复位、时钟引脚功能偶发错误跨时钟域、时序余量、信号完整性查看错误统计分布规律抓ILA波形固定位错误引脚连接、接插件、PCB布线万用表逐线测量回环测试温度升高后出错散热、供电纹波加大、闩锁风险红外测温示波器看纹波检查IO闩锁FMC通信不稳定FMC时序参数、驱动强度、地址线连接先回环再调参数最后查硬件4.5 与仿真结果对不上的一个典型案例有一批次被测芯片的寄存器读回值在仿真模型里永远正确真实芯片上偶尔读出全0xFF。一开始我以为是SPI时序太快降速后问题依旧。后来抓ILA波形发现DUT在CS拉低瞬间内部逻辑还在处理上一次的数据没有准备好应答。查看数据手册才发现这颗芯片需要CS拉高后至少等待50ns才能发起下一次传输仿真模型里把这个约束写得太宽松了。模型没有约束不代表芯片没有约束这类“宽松模型”在真实芯片验证里非常常见遇到结果不一致第一步就去查芯片的时序参数表对照仿真场景是否触发了边界条件。5. 硬件的坑和流程的经验5.1 硬件设计层面要注意的几个点做HIL平台本质上是把小规模的测试系统当成一个精密仪器来设计。被测试芯片的插座或者焊接方式要考虑可替换性我用的是带引脚座的可拆卸结构方便不同批次芯片快速更换。DUT周围预留测试点每个电源引脚、关键时钟引脚、复位引脚都应该有露铜焊盘方便万用表和示波器测量。信号线上建议预留串联电阻位置实际调试时再确定要不要贴。这些设计上的小余量能在调试阶段节省大量时间。供电方面建议一点接地。数字地和模拟地分开走在电源入口处单点汇合避免数字信号回流把噪声带进模拟区域。被测芯片如果有多个供电域每个供电域派生的电源树要独立防止一个域异常拉垮整个系统。这属于硬件设计规范但在HIL平台这种临时拼装的系统里很多人图省事忽略了后面踩的坑一个比一个深。5.2 工具链和流程管理上的经验FPGA工程的版本管理一定要用Git。不要觉得自己的板子一个人调试不需要版本管理等你在Vivado里改了约束、过了两天又改回去然后发现时序变差但想不起来改了什么的时候就知道版本管理的意义了。我习惯每个FPGA工程目录下建三个子目录RTL源码、约束文件、脚本文件。RTL只放我们自己写的逻辑IP核单独存放不提交到主分支避免合并冲突。验证用例的管理也要有文档意识。每个测试用例存成一个独立的配置文件和期望结果文件文件名带上测试目的和日期比如“spi_mode0_fast_20250115.cfg”。跑测试时日志自动记录测试开始时间、版本号、配置参数、错误统计这些信息在多次测试对比时是唯一可靠的依据。没有日志的测试等于白测这句话在HIL场景里特别成立。5.3 给新接触HIL的朋友一个最小可行路径如果你刚入门硬件在环验证不要一上来就搭STM32FMCFPGA多通道DUT这种全功能平台。我建议先这样开始用一块便宜的FPGA开发板找一个SPI或者I2C接口的普通传感器芯片先写一个最简单的FPGA程序发送固定配置、回读固定数据用板上LED显示回读值是否与期望一致。这条链路跑通后再加通信模块、加自动化脚本、加长时间运行测试。这套最小系统能帮你把最核心的概念建立起来激励怎么产生、响应怎么采集、比对怎么做、日志怎么记录。等这条链路稳定后再逐步引入FMC、DMA、更复杂的协议引擎。很多人一上来就追求大而全结果链路太长哪里出问题都分不清是FPGA的问题、MCU的问题还是DUT的问题最后全盘推翻重来反而更慢。5.4 实测过程中的一点心得真实芯片验证和纯仿真最大的区别就是你必须接受“芯片不按你的想法运行”这个事实。一颗芯片可能因为制造工艺的偏差在规格书边界参数上表现得不完全一致这时候查规格书、对比多颗同批次芯片的表现比盲目调代码更重要。真实芯片还会受到物理环境的影响同样一段代码换一个温度、换一个供电电压结果就可能不同这也是硬件在环验证最有价值的地方。我后来养成的习惯是每次长时间测试前先把示波器探头接到DUT供电和参考时钟上记录下环境状态。这样出问题时可以先排除环境因素直接聚焦到逻辑和芯片行为上。还有一点是DUT如果测挂了不要急着换芯片先量电源对地电阻和各引脚对地电阻判断是外部电路问题还是芯片本身损坏盲目换芯片不仅解决不了问题还可能把第二颗也赔进去。这套HIL平台目前已经稳定跑了三版芯片从最初的手动配置、手动读数据到现在的长时间自动化回归、错误直方图统计帮助我们发现了好几处仿真模型完全看不出的问题。如果你也在做真实芯片验证建议趁早把这样一套环境搭起来投入的时间一定会从后续的bug排查中赚回来。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。