资讯动态

FPGA硬件在环验证:仿真全绿为何还要上板测真实芯片

发布时间:2026/9/6 7:31:56 来源:尧图企业网站定制
1. 仿真做到全绿为什么还非要上板测真芯片两三年前我接手过一块MCU类芯片的验证任务。RTL仿真、门级后仿真都跑到“全绿”覆盖率数字也好看上板点亮却花了整整两周才把系统跑稳。从那时候起我在每个项目里都会先问一句这一轮验证到底在验证什么——是验证RTL的功能描述还是验证流片回来的那颗真实硅片这个问题听起来很基础其实是FPGA硬件在环验证和传统仿真验证的分水岭。1.1 RTL仿真排除不了的一类问题RTL仿真在建模仿真环境里跑的是“理想化数字世界”信号翻转有确定的setup/hold时间逻辑门有确定延时IO上有抽象的驱动强度。可真实芯片不是这样芯片内部有工艺偏差带来的延迟波动有电源噪声导致的时序抖动有跨时钟域时真实亚稳态行为有IO驱动器在给定负载下的波形失真还有芯片内部DFT、时钟树、复位树在真实物理实现中引入的额外延迟。举我实际遇到过的例子某个SPI从机模块RTL仿真里连续读写一万次都通过但芯片回来后接真实Flash时钟频率跑在48MHz时偶发读写错误。插入逻辑分析仪观察波形发现是MOSI数据线与SCK时钟线之间的相对偏斜在特定温度下超出了从机容忍范围。这种问题在RTL仿真里根本不存在因为仿真环境里信号偏斜是固定的、理想的。只有在真实的FPGA硬件在环环境里把真实芯片放在闭环里跑真实的外设协议这类问题才会暴露出来。另外一个RTL仿真永远模拟不了的是芯片内部的模拟电路和混合信号行为——PLL锁定过程、上电复位阈值、IO输入迟滞、电气快速放电ESD保护电路对信号边沿的影响。这些内容数字仿真模型通常只做行为级抽象甚至直接缺失。仿真全绿只能说明数字逻辑功能与设计意图一致并不能说明硅片在真实电气条件下能正常工作。1.2 后仿真与行为级模型之间的“最后一公里”有些人会说“我们做了SDF门级后仿真带上了实际延时不够吗”后仿真确实比纯RTL仿真更接近物理实现但它仍然是在模拟器里跑不是把信号真正送到物理管脚上。后仿真用静态时序分析工具提取的SDF文件来描述延时可SDF文件的准确性依赖工艺角、电压、温度条件而真实芯片的工作条件是动态的、局部变化的。更重要的是后仿真环境里外部设备传感器、Flash颗粒、另一颗协议芯片都是行为模型——这些模型的接口时序不一定是芯片回来后对接的真实器件的电气行为。我印象很深的一个项目是做一颗BISS-C协议编码器接口芯片的验证。后仿真里把BISS-C主机行为模型写得标准规范仿真全绿。上板后用真实的编码器线缆和数据帧格式去对接发现芯片在数据时钟沿采样窗口过窄导致在3米线缆、高容性负载下偶发误码。原因是行为模型没有考虑线缆寄生电容带来的信号边沿退化而后仿真里信号越沿是理想的。这种问题只有在硬件在环环境里连接真实编码器才能复现和定位。所谓“最后一公里”就是仿真环境与物理世界的差距。FPGA硬件在环验证的价值正在于此把被测芯片放回真实的工作环路中让信号真的流经它的每个管脚让时钟真的从晶振或时钟发生器输入让协议真的与外部实体设备交互。1.3 HIL面向的不是“找舒适感”而是定位风险部分团队对硬件在环有误解认为这是“给芯片找一个真实舞台做总装测试”。实际上HIL的核心定位不是总装而是风险定位——定向暴露数字逻辑、IO电气、时钟交互三类风险中最隐蔽的那部分问题。我搭HIL环境的第一步永远是列一张“仿真覆盖不了的风险清单”IO电气特性是否满足对接设备输入要求、时钟/复位在真实上电过程的行为、多电压域之间的交互、异步信号真实亚稳态趋势、固件与硬件在真实总线时序下的配合。这张清单直接决定HIL台架要设计哪些测试用例。说得直白一点RTL仿真做的是“逻辑对不对”HIL做的是“物理上能不能用”。一块芯片如果只能通过仿真验证那它只是纸面上能用HIL才把它推进到“物理上可能用”的阶段。2. 硬件在环到底在“环”什么测量对象与验证边界2.1 测的不是RTL描述而是流片回来的物理器件硬件在环验证Hardware-in-the-Loop, HIL听起来是个挺宏大的概念放到芯片验证场景里字面拆解就是把一颗真实的芯片放进一个闭环测试系统里让它按照真实工作方式与外设交互然后观测它的行为是否符合预期。关键在于“真实”两个字。HIL环境里被测对象DUT是流片后封装的芯片是放在PCB上、有真实电源供电、有真实信号走线、受到真实噪声干扰的物理器件。FPGA在其中扮演的角色有两种一是作为测试台架test harness实时生成激励并采集响应二是作为待测芯片的原型参照。标题里说的“测真实芯片而不是仿它的模型”指的是前一种场景——被测对象是可以放进系统的真芯片FPGA是它周围的测试环境与外围设备。我搭过的最典型的HIL环境FPGA通过板内走线接到一块子卡子卡上插着待测芯片。FPGA里实现了AXI4-Lite主设备、中断控制器和回环逻辑模拟芯片在系统里的真实工作场景芯片的接口由FPGA的IO驱动芯片的中断和状态输出经过电平转换也回到FPGA。整个设计里芯片不再是在仿真器里跑着的抽象模型而是一颗上电后真实工作的器件。2.2 HIL与纯FPGA原型验证的区别FPGA原型验证和FPGA硬件在环验证经常被混淆但对有经验的验证工程师来说这两件事的工作对象完全不同对比维度FPGA原型验证FPGA硬件在环验证被测对象FPGA内装载的RTL真实流片芯片验证目的功能验证、软硬件协同验证电气特性、真实接口时序、系统级行为激励来源仿真激励或软硬件系统真实外设、真实总线、真实协议覆盖问题类型逻辑功能、架构设计IO电气、时序裕量、跨域交互、固件配合时序保证依托FPGA工具实现芯片真实物理特性两者的定位是互补的。流片前用FPGA原型跑通整个软件栈早发现架构级问题流片后用HIL环境验证真实芯片的电气行为与系统配合。如果一个团队在芯片尚未回来时就开始搭HIL台架那它本质上是在做“预验证”和“台架调试”为芯片回来后的HIL测试做准备工作。做个类比原型验证相当于用真车底盘和发动机模型做风洞实验HIL则是把量产发动机装到测试台架上点着火烧。前者验证设计合理性后者验证制造出来的东西能不能真干活。2.3 验证边界如何划分HIL不是万能的它有明确的边界。芯片内部的逻辑功能逻辑缺陷、内存单元的失效模式、模拟模块的精度指标都不是HIL的强项这些需要ATE、DFT、特性化测试等其他手段覆盖。HIL的重点覆盖域是真实使用条件下芯片与外部系统的交互行为。我设计HIL用例时的分域逻辑域一IO电气行为——芯片输出波形是否满足对接器件要求输入阈值是否正确接收外部信号域二系统级协议——芯片作为系统中的一部分能否正确完成真实总线读写、中断响应、DMA传输域三固件与硬件配合——真实固件在真实芯片上跑起来能否与FPGA模拟的外设正常交互域四时钟与复位行为——上电/掉电过程、时钟切换、时钟失效等场景下芯片行为是否符合规格超出这个边界的测试我通常不会塞进HIL里——比如cache一致性协议的全状态空间覆盖、模拟前端的位数精度校准这些应该用其他验证手段覆盖硬塞进HIL环境只会让台架复杂度爆炸掩盖真正想观察的问题。3. 一次典型的HIL验证环境搭建从工程结构到板卡连接3.1 顶层台架与被测对象分离我在搭建HIL验证平台时的工程组织方式可以作为一个相对通用的参考。我的做法是用Xilinx Artix-7系列FPGA做台架主控STM32H743负责执行部分控制逻辑被测芯片通过FMC接口接到一块定制的转接子卡上。之所以用FPGA加MCU的组合是因为FPGA擅长产生高精度、低抖动的接口时序激励MCU则擅长跑复杂控制流程和协议栈两者配合能覆盖从底层信号到上层协议的完整验证需求。工程结构上我把代码分成tan层与harness层被测芯片相关的逻辑放在dut_harness模块FPGA自身的外设控制逻辑放在fpga_platform模块两个模块之间用标准AXI接口连接。这样的分层目的是芯片在设计阶段引脚定义发生变更时只需要调整dut_harness内部的引脚映射不影响平台控制逻辑反过来平台控制逻辑调整时也不会触碰DUT相关代码。顶层模块的关键实例化如下module hil_top ( input wire sys_clk_p, // FPGA主时钟 100MHz input wire sys_clk_n, input wire rst_n, // FMC接口到被测芯片 inout wire [7:0] dut_data, output wire [3:0] dut_addr, output wire dut_wr_en, output wire dut_rd_en, output wire dut_reset_n, input wire dut_intr, // 被测芯片中断输出 // 低速控制接口 input wire uart_rx, output wire uart_tx ); // 平台时钟管理 clk_wiz_0 platform_clk ( .clk_in1_p(sys_clk_p), .clk_in1_n(sys_clk_n), .clk_100m(clk_100m), .clk_50m(clk_50m), .clk_10m(clk_10m) // 用于待测芯片的外部输入参考时钟 ); // DUT接口约束与封装 dut_harness u_dut_harness ( .clk (clk_50m), .rst_n (rst_n), .dut_data (dut_data), .dut_addr (dut_addr), .dut_wr_en (dut_wr_en), .dut_rd_en (dut_rd_en), .dut_reset_n (dut_reset_n), .dut_intr (dut_intr) ); // 平台逻辑UART指令解析、寄存器控制、状态采集 platform_ctrl u_platform_ctrl ( .clk (clk_100m), .rst_n (rst_n), .uart_rx (uart_rx), .uart_tx (uart_tx), .ctrl_regs (ctrl_regs), .status_regs (status_regs) ); endmodule3.2 时钟、复位与启动逻辑HIL台架的时钟设计是一个容易被忽略但极其重要的环节。我在最初搭台架时因为贪图方便直接让所有IO逻辑都跑在100MHz全局时钟上结果发现与待测芯片接口交互时的时序裕量非常紧张。后来调整方案给芯片接口单独分配一个50MHz时钟域给平台控制逻辑分配100MHz时钟域中间用异步FIFO过渡时序问题得到很大缓解。时钟规划的决策逻辑是待测芯片的接口继承频率通常不高几十MHz量级用高速时钟直接驱动会产生不必要的setuptime压力平台逻辑需要高速时钟处理协议解析和数据缓存。两级异步FIFO虽然增加了一点资源开销但大大降低了时序收敛难度。复位逻辑的要点在于待测芯片与台架必须分开复位且复位释放顺序要可控。我在PC端脚本里通过UART下发指令分步释放FPGA平台复位、待测芯片复位并在每次释放后读取芯片状态寄存器确认芯片已正确初始化。这个设计的起因是早期版本里我让芯片复位跟FPGA复位一起释放结果芯片上电时部分IO还没有稳定出现偶发锁死必须断电重来。3.3 观测、记录与回环链路设计HIL和仿真环境一个很大的差异是可观测性。仿真里你可以随便拉波形HIL里信号在物理管脚上你只能通过仪器、逻辑分析仪或芯片自带的调试接口去观测。为了弥补这个差距我在台架里加了三种观测手段第一种是内部逻辑分析仪ILA用FPGA厂商提供的IP核抓取DUT接口的关键信号。ILA的优势是采样率高、不影响系统运行缺点是存储深度有限只能抓短窗口。我通常把它挂在疑似异常的协议时序段比如总线读写冲突或中断响应延迟偏大的时段。第二种是协议追踪器在FPGA里实现一个简单的总线监视器持续记录总线上的事务类型、地址、数据存入BRAM。这相当于一个自制的总线逻辑分析仪可以在长时间运行后主动dump出来分析。这个设计帮我在一次DMA连续传输异常中定位到了地址递增逻辑的边界问题。第三种是回环自测通道。我在FPGA里做了一个可配置的回环模块能把待测芯片的输出通过FMC转接板上的短线直接回送到芯片输入。这样可以在不需要外部设备的情况下快速构建数据通路完整性测试。加一个额外的可控延时寄存器还可以测出芯片IO在多大延时下仍能正常工作间接评估输入时序裕量。三种观测手段的组合原则是能用ILA定位的快事件用ILA抓需要长时间积累的慢事件用协议追踪器记录纯粹的电气连续性测试用回环通道搞定。4. 上板后最容易翻车的五个地方实战踩坑记录4.1 管脚复用与约束冲突芯片量产回来后管脚定义与设计阶段的差异是HIL台架搭建中几乎必然遇到的问题。最常见的坑设计文档说某管脚是GPIO模式但芯片复位后默认是专用功能模式需要配置特定寄存器解锁或者同一组管脚既承担调试接口又承担正常功能上电瞬间出现总线冲突。我的一次惨痛经历是待测芯片有一个启动模式选择管脚文档里写的是“上电采样、之后可复用为GPIO”。结果这个管脚在板子上被接到FPGA的普通IO上FPGA在上电配置阶段将该引脚拉高恰好匹配了错误的启动模式芯片进入异常启动流程花了一天排查才通过示波器对比发现。解决方案是给FPGA的IO加默认下拉芯片启动确认完成后再由FPGA重新配置方向。这类问题给的经验是两条一是上板前必须仔细核对芯片管脚的上电默认状态和一个可选的上下拉电阻二是FPGA里所有连接到待测芯片的IO在配置完成后、芯片复位释放之前必须设置为确定的逻辑电平或高阻不能留着“默认状态”直接上电。4.2 上电时序与PLL锁定待测芯片通常有多组电源域上电时序有先后要求。HIL台架不仅要提供电源还要能控制上电顺序。我踩过的坑是待测芯片核心电压和IO电压加电时序倒置导致芯片内部锁相环无法锁定外部时钟虽然到了管脚但内部时钟一直不稳定芯片间歇性死机。我最后的解决方案是在子卡上加了电源时序控制电路用FPGA的GPIO控制各电源模块的EN脚按“先核心、后IO、最后复位释放”的顺序上电每次上电后等待100ms稳定期再释放芯片复位。同时在FPGA中加入时钟监测模块专门检测待测芯片的时钟输出管脚是否有有效时钟翻转以此作为PLL锁定成功的判断依据。4.3 高速接口的信号完整性问题当待测芯片的接口频率超过几十MHz尤其是达到100MHz以上时信号完整性问题会变得非常显著。HIL台架如果只是简单地把芯片引脚连到FPGA的IO上往往会在高速边缘出现振铃、过冲、串扰导致芯片内部接收错误数据。我在调试一颗DDR接口待测芯片时发现高低温循环后读写故障率明显升高。用眼图测试发现数据信号在过冲点处电压超标芯片输入保护二极管在部分温度点导通导致波形严重畸变。排查后发现原因是PCB走线过长且未做阻抗匹配FPGA侧IO驱动强度过大。解决的办法是双管齐下一是子卡上所有高速信号走线做阻抗控制并串联端接电阻二是FPGA侧IO设置可调驱动强度。经过调试把FPGA的IO驱动强度从12mA调低到8mA配合端接电阻眼图余量从不到10%提升到接近40%。经验是HIL台架的PCB设计不能当普通低速板卡来做高速信号区域必须按真实产品板标准来设计。4.4 同步复位异步复位混用这个算是设计层面的问题但在HIL环境里更容易暴露。待测芯片如果是异步复位设计HIL台架在上电释放复位时如果复位信号边沿刚好落在时钟上升沿附近芯片内部寄存器可能出现亚稳态表现为“偶发启动失败断电重来就好”。之前设计验证一颗MCU时外部复位信号在上电后由FPGA释放没有做同步处理结果十次启动里有两次进入错误状态。仔细分析是复位释放与第一个时钟上升沿的相位关系不确定所致。解决方案是FPGA里对复位释放信号做两级同步并确保释放沿与目标时钟的上升沿保持足够的setup时间同时在芯片内部的复位设计中增加一个稳定的复位同步器。4.5 可综合约束限制下的观测折中HIL环境里芯片是真实物理器件但这不意味着所有信号都“可以直接观测”。FPGA里实现的台架逻辑与被测芯片之间是物理引脚连接观测逻辑会占用引脚、时序资源和片上存储因此覆盖度天生低于仿真环境。一个典型的尴尬场景待测芯片某组并行接口的16根数据线我只引出8根到FPGA观测另外8根焊到测试点但未接入FPGA。当接口数据出现偶发错误时我只能通过芯片内部状态寄存器间接判断是哪半部分数据出错排查效率大打折扣。后续设计里我改成高速并行口全部接入FPGA通过ILA抓取调试串口和低速状态口则留到测试点用示波器辅助观察。这个权衡的思路是高速、动态、需要长时间记录的数据走FPGA观测慢速、低频、故障率低的信号留给仪器手工测试。不要试图把所有信号都拉进FPGA那会消耗大量资源且增加布线难度。5. 从HIL通过到量产还差哪几步5.1 HIL能覆盖与不能覆盖的故障面HIL环境跑过、通过能说明一颗芯片在目标系统里“大概率能用”但不能说它“一定能量产”。要理解这个差异需要把芯片验证的手段摊开看一张全景图验证手段覆盖故障类型局限性RTL仿真逻辑功能错误、协议时序错误无法覆盖物理电气问题门级后仿真制造工艺引起的延迟缺陷依赖SDF模型准确性FPGA原型验证架构缺陷、软硬件协同逻辑时序/电气不等于真实芯片硬件在环HIL真实IO电气行为、系统配合、固件交互覆盖不了芯片内部单元级缺陷ATE测试制造缺陷开路、短路、门级stuck-at不验证真实系统行为HIL与ATE的分工很明确ATE回答“这颗芯片有没有制造缺陷”HIL回答“这颗芯片在系统里能不能正常工作”。5.2 与ATE测试的互补关系有一类问题只在ATE里能发现比如芯片内部某个存储单元在特定地址区域存在制造缺陷但在HIL环境里由于固件运行时刚好没有命中那块区域故障从未被触发。反过来有一类问题只在HIL里能发现比如芯片的IO输出驱动能力在低电压条件下不足导致连接的外部设备不能稳定通信而ATE测试通常只验证芯片自身参数不一定覆盖到真实负载情况。所以我在项目里对一颗芯片的完整验证策略是先用ATE跑量产测试向量确认无制造缺陷再放回HIL平台做系统级功能验证跑完HIL后如果有优化方向再回到ATE加测对应的参数项目。一轮下来两颗不同来源的故障样本ATE的高温失效管脚、HIL的时序裕量不足被分别定位才算完成了完整的摸底。5.3 不同芯片类型的HIL策略不同芯片类型的HIL测试策略也有明显差异低功耗MCU重点跑真实固件下的唤醒/睡眠流程、外设功耗的开关时序、时钟切换时的系统稳定性。通信接口芯片以太网PHY、USB控制器等重点跑真实链路下的建链、断开、重传、错误注入case配合网络测试仪或真实对端设备。电源管理芯片PMICHIL的核心是上电时序、负载切换、故障保护触发的真实响应FPGA在这里通常模拟主控IC的下发指令与负载行为。传感器信号链芯片HIL里要接真实传感器或高精度信号源重点看数字接口与模拟前端在真实信号下的配合表现。选择HIL工具链时同样需要区别对待。Xilinx FPGA生态成熟、IP丰富适合做复杂协议交互的台架高云等国产FPGA在成本和供货上有优势适合做相对固定的长时间稳定性测试但如果被测芯片与FPGA之间有高速收发器如PCIe、SATA则必须选择内置高速收发器的FPGA型号普通逻辑IO做不了这种验证。6. 一块验证板、一把逻辑分析仪和两个星期前面讲的都是思路、方法和案例。最后分享一点我个人的实操感受很多人以为HIL验证环境是“实验室的标准设备”其实最关键的往往是一块精心设计的验证子板、一把好的逻辑分析仪以及充足的耐心。我最开始做HIL时对测试用例的设计不够重视以为让芯片跑起来、连上总线、跑通几个主要外设就算完成。后来发现这种“跑通”其实只覆盖了芯片正常工作路径中的一小部分。真正的价值来自系统性异常注入测试总线仲裁冲突、时钟毛刺、供电跌落、热插拔、总线挂死后的恢复机制。这些用例在仿真时代就写在验证计划里但只在HIL环境里才真正有意义因为它们考验的是芯片在真实物理条件下对非理想场景的承受能力。还有一点容易被忽视的是日志和复现机制。HIL环境里遇到偶发问题如果不能复现整个排查会非常痛苦。我在台架里加了故障注入和自动复现功能遇到异常状态就自动记录关键寄存器、总线状态和波形并通过计数器实现“循环运行直到失败”的复现模式。这套机制帮我定位过几个极难复现的偶发问题比如某次时钟源短暂失效导致的系统死锁就是靠几千次循环测试逼出来的。最后给初次搭HIL的人一个建议不要一开始就追求台架功能的完整性先把最小系统跑通——电源正确、时钟稳定、能写能读、状态可观测再逐步加外设和测试用例。一个连基本点亮都不顺畅的台架后面所有数据分析都站不住脚。先把地基打牢再谈覆盖率和自动化这是HIL验证里最朴素也最实用的执行顺序。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价