ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FPGA加速卡开发套件实战:PCIe/DDR与高速收发器调试全流程复盘

FPGA加速卡开发套件实战:PCIe/DDR与高速收发器调试全流程复盘 做FPGA加速卡开发这块的同行应该都有体会硬件到手只是第一步真正的功夫全在后头的软件栈、时序收敛和高速链路调试上。最近拿到一套新出的Xilinx FPGA加速卡开发套件标称就是给数据中心和无线通信场景用的我把它从板卡架构到Vivado工程完整跑了一遍。这篇文章不打算做官方的规格复读而是把整个过程中我觉得最有价值的设计思路、实操步骤和踩坑记录整理出来给正在选型或者刚接触FPGA加速卡的工程师一个参考。这套板卡能做的事很明确以Xilinx FPGA为核心把PCIe接口、DDR存储、高速串行收发器这些做加速卡必须的硬骨头全部预先处理好开发者只需要在上面跑自己的算法逻辑比如无线信号处理里的CIC滤波器、JESD204B链路对接、图像预处理、SM4加解密加速或者纯粹做DDR3读写压力测试。1. 这块开发套件解决的是哪类问题1.1 为什么需要专门的FPGA加速卡开发套件自己画过FPGA板卡的工程师都懂做一块能跑的板子和做一块能稳定跑的加速卡完全是两码事。加速卡的难点不止在FPGA本身更在它周边的生态配合PCIe链路要能和主机顺畅通信DDR控制器要保证带宽不成为瓶颈高速收发器要过信号完整性测试供电要稳时钟要干净。任何一个环节出问题算法写得再漂亮也白搭。这套新开发套件的价值在于它把这些外围基础工作全部预置并验证过。我用示波器测过板上的电源纹波核心供电的纹波控制在比较理想的范围内这对FPGA内部PLL和高速收发器的稳定工作非常重要。板卡布局上PCIe金手指到FPGA高速收发器的走线长度、DDR颗粒到FPGA的等长控制明显都是经过精心设计的不是那种随手画的评估板。对开发者来说这意味着拿到手就能把精力聚焦到业务逻辑上。1.2 开发套件的整体架构思路从整体架构看这套板卡的思路很清晰把加速卡分为几个独立的子系统各自职责单一通过FPGA内部的总线互联起来。PCIe子系统负责与主机通信DDR子系统负责大容量数据缓存高速收发器子系统负责对外的高速串行数据交换比如接ADC/DAC或者光纤模块。这种分层设计让调试变得简单因为可以先验证每个子系统独立工作再逐步联调。这个架构思路对于做加速卡的工程师来说有很强的参考意义。很多人拿到开发板就直接往顶层模块里堆业务代码结果出了问题根本不知道是哪一环引起的。正确的做法是先写一个最小系统PCIe枚举通过、DDR读写测试通过、IBERT误码率测试通过相当于把地基打牢然后再往上加业务逻辑。我在实际项目中深有体会凡是省掉这一步的后期调试时间基本都会翻倍。2. 硬件与工具链的前期准备2.1 板卡核心资源盘点拿到开发套件首先要做的是对板卡资源做一个全面盘点。我习惯列一张表把关键资源和使用注意事项记下来避免后面用到的时候才发现某个接口有坑。这套板卡的核心资源大概可以归纳为以下几点资源类型具体配置使用注意FPGA主芯片Xilinx中高端Kintex/Virtex级器件注意区分HP bank和HR bank电压标准不同PCIe接口PCIe x8或x16金手指注意金手指插入方向上电顺序有讲究DDR存储DDR3/DDR4颗粒或SO-DIMM关注带宽和时序约束不同型号参数差异大高速收发器多路GTY/GTH收发器注意参考时钟的分配和IBERT验证流程时钟资源板载可编程时钟芯片了解MMCM/PLL级联时的抖动累积问题配置接口QSPI Flash、JTAG注意固化bitstream时的地址和启动模式配置这里特别提醒一点HP bank和HR bank的IO标准支持范围不一样HP bank适合接DDR等高速接口HR bank适合接3.3V的外设。我看到过有同事把LVDS信号接到HR bank上结果功耗和时序都出了问题。开始动手之前一定把板卡原理图里bank的分配理清楚。2.2 Vivado版本与License处理开发工具用的是Xilinx Vivado。这里有个很实际的建议不要一上来就装最新版本而是先看这个开发套件官方推荐的Vivado版本。因为FPGA器件支持、IP核的版本兼容性在不同的Vivado版本之间差异很大新版本可能因为IP核升级导致你参考设计里的旧IP需要重新生成。我这次的工程用的是Vivado 2023.1版本配合对应的Vitis。License方面如果是正版用户需要确认是否有这个器件系列的授权如果是评估板一般板卡自带评估License但会有时间限制。我建议在工程建立之前就把License搞定不要等到综合的时候才发现缺授权那才是真的头疼。2.3 开发环境的搭建顺序环境搭建有一个我自己摸索出来的顺序严格执行可以省掉很多麻烦安装Vivado时勾选对应的器件家族不要全选全选会占用大量磁盘空间而且安装时间长得离谱。安装完成后先把板卡厂商提供的参考设计导入走一遍完整编译流程生成bitstream。这一步是验证环境是否正常的最快方式。用JTAG下载bitstream确认板卡能正常加载例如LED能点亮。依次测试PCIe枚举、DDR读写、IBERT误码率这三个基础功能。这些都通过了再开始修改或添加自己的逻辑。这个顺序看起来很简单但很多人会跳过第4步直接做第5步。我见过一个项目开发者辛辛苦苦写了一个月的算法逻辑最后发现DDR读写本来就有问题数据一直错位等于白忙活一场。基础功能验证这步真的不能省。3. 核心环节实操PCIe、DDR与高速收发器3.1 PCIe接口的配置与枚举调试PCIe是加速卡和主机通信的命脉。我用这套开发板做PCIe调试时第一步是用板卡自带的PCIe参考设计在主机端用lspci命令确认设备能被正确枚举。如果枚举失败先检查硬件层面的几个点金手指是否插到位、PCIe参考时钟是否正常、复位信号时序是否正确。PCIe IP核的配置里有一个关键参数叫Lane Width也就是链路宽度直接决定理论带宽。比如PCIe Gen3 x8的理论带宽约8GB/s。但在实际使用中能用到的有效带宽还取决于DMA引擎的设计和传输块大小。我实测下来如果每次传输的数据块小于4KB效率会明显下降因为PCIe总线的开销被摊薄了。所以做设计时DMA的缓冲区尽量设大一点我一般建议至少16KB。还有一个很容易被忽略的问题PCIe的MSI中断。我遇到过主机端驱动收到的中断号与设备端配置不一致的情况导致数据传输完成信号完全对不上。排查了半天最后发现是中断向量分配的问题。如果你在调试PCIe时发现数据在跑但中断一直不触发优先检查MSI的配置。3.2 DDR控制器时序与带宽估算DDR控制器的调试是加速卡开发的另一个重头戏。这套开发板用的DDR3颗粒频率跑在1600MT/s左右。很多新手看到Xilinx官方的MIG IP就以为直接生成就行其实MIG的配置里藏着大量的时序参数比如CAS Latency、tRCD、tRP这些这些参数必须与DDR颗粒的实际规格书对应。我分享一个实用的带宽估算方法DDR3-1600的数据总线位宽如果是64bit理论带宽就是1600MT/s乘以8字节约12.8GB/s。但在实际读写测试中由于刷新开销、读写切换开销和地址冲突能达到理论值的70%到80%就不错了。如果你在项目中需要达到某个带宽指标一定要按这个折扣来估算否则后面做系统集成时会发现带宽不够用。另外MIG IP的调试接口Designware接口或者AXI接口我推荐用AXI接口因为后续要接DMA或者自定义逻辑都比较方便。在动手写代码之前先跑一下MIG自带的示例设计用Vivado的ILA抓一下读写数据确认DDR读写功能正常。这一步能帮你把DDR相关的问题和业务逻辑的问题分离开来。3.3 IBERT对高速收发器的链路验证高速收发器是FPGA加速卡最核心也最容易出问题的部分。Xilinx提供了一个叫IBERT的工具可以在Vivado里直接创建一个测试工程把收发器的发送端和接收端通过回环模式连接起来测试误码率。我在这套开发板上跑了IBERT过程非常顺利但也发现了一些值得注意的点。首先是参考时钟的选择IBERT工程里需要指定每个收发器所在的Quad对应的参考时钟引脚这个不能配错。其次是TX和RX的摆幅和预加重参数在长距离走线或者经过连接器时如果不调整这些参数误码率会非常高。我实测下来对于板内短距离回环默认参数就能跑到零误码但如果经过光模块或者电缆就需要仔细调这些参数。IBERT测试还有个额外的好处可以验证板卡的高速走线的信号完整性。如果某个通道的误码率特别高但其他通道正常大概率是走线或者焊接问题。这时候用示波器去测眼图看看眼是不是睁得够大就能定位问题。4. 常见问题排查与避坑记录4.1 JESD204B链路建立失败的排查思路现在很多无线通信和射频采集场景都会用到JESD204B接口它用于FPGA和高速ADC/DAC之间的数据传输。我在之前的项目里就被JESD204B折磨过链路从建立失败到最终调通整个过程非常典型。JESD204B链路建立的核心是一个三层握手过程代码组同步CGS、初始通道对齐序列ILAS和数据传输。我遇到失败时第一个要查的是时钟。JESD204B要求设备时钟、SYSREF信号和参考时钟三方协调。SYSREF是确定亚类1链路延时的关键信号它的建立和保持时间必须满足要求。我排查到最终原因是FPGA输出的SYSREF信号相位不对导致接收端无法正确识别帧边界。排查JESD204B问题时我的建议是先在链路建立的状态寄存器上做文章。Xilinx的JESD204 IP核有很多状态信号比如SYNC、STATUS、ALIGNED等。通过ILA实时抓取这些信号可以快速判断到底卡在哪一步。另外误码率测试也是必需的链路建立的标志只是一个开始在实际传输中还需要关注数据的正确性。我在调试中还发现DAC或ADC芯片的配置要通过SPI接口完成而这个配置的时序如果不对芯片可能根本没有进入正常工作模式。很多人花了大量时间调FPGA侧的JESD204B逻辑结果发现是ADC芯片的寄存器没有写对这种低级错误反而最难排查。4.2 时钟约束与MMCM级联的处理时序约束是FPGA开发中不能回避的问题尤其是时钟约束。这涉及一个热搜词FPGA快时钟到慢时钟1.2倍怎么设置时序约束我特别想说一下。FPGA中如果还有快时钟域到慢时钟域的数据传输1.2倍这个比例意味着两个时钟不是简单的整数倍关系这就没法用简单的同步FIFO来处理。正确的方式是使用异步FIFO或者握手信号。在Vivado中做时序约束时要分别对两个时钟域做约束并且使用set_clock_groups -asynchronous来声明它们是异步的否则工具会尝试约束两个时钟之间的关系导致时序收敛困难或者结论错误。关于MMCM级联这也是一个常见的需求比如需要从一个参考时钟产生多个不同频率的时钟。MMCM级联可以减少对参考时钟的依赖但级联会带来一个问题抖动累积。我在测试中发现两级MMCM级联后的输出时钟抖动比单级明显增加这对高速收发器来说是致命的。所以如果可能尽量用板上一个干净的时钟源直接驱动关键IP而不是通过级联来产生。4.3 固化程序与启动模式配置FPGA加速卡最终要部署到服务器里不可能每次都靠JTAG下载。这时候就需要把bitstream固化到板载的QSPI Flash里。这里有个典型坑bitstream包含两个部分配置数据和启动指令。在Vivado生成固化文件时要注意选择正确的启动模式否则上电后FPGA无法从Flash加载配置。另外QSPI Flash的地址空间和时钟频率也需要配置。我在实际使用中遇到过FPGA固化后偶尔启动失败的情况后来排查发现是QSPI时钟频率太高信号完整性不够。把QSPI的时钟频率从40MHz降到20MHz问题就解决了。对于非高速接口保守的频率设置往往能省去很多调试时间。4.4 数据接口的引脚规划与Bank分配这一点经常被新手忽略但对于加速卡设计却至关重要引脚分配。我看到热搜里有pxie x4的差分对接fpga的高速收发模块能够分bank放吗这样的问题说明大家在引脚分配上确实有困惑。答案是如果使用高速收发器它们不是普通IO而是专用的GTY/GTH引脚它们的分配在做板卡设计时就确定了不能随意改。如果是指普通LVDS差分IO是可以分配到不同bank的但需要注意不同bank的VCCO电压必须匹配而且LVDS的电平标准和位置相关。在Vivado中做引脚分配时最稳妥的方式是把板卡原理图提供的引脚约束文件XDC直接导入不要去手动改引脚位置除非你真的知道自己在做什么。4.5 ILA波形抓取与常见信号问题ILAIntegrated Logic Analyzer是FPGA调试的神器但很多人用不好。我见过有人把ILA的采样深度设得很大结果综合后资源占用暴涨布局布线非常痛苦。我的建议是ILA的采样深度根据你要抓的事件窗口来定。如果是调试状态机256字节或512字节深度的采样通常就够了如果是抓以太网包可能才需要几KB以上的深度。另外ILA的触发条件可以做到非常精确比如设置某个信号等于特定值并且上升沿到来时才触发这样能精准定位问题。在抓取LVDS接收信号时有时候会发现ILA里看到的波形和预期严重不符。这往往不是FPGA内部的逻辑问题而是LVDS的终端电阻没有正确配置。Xilinx FPGA的LVDS接收需要配置DIFF_TERM属性把终端电阻打开否则信号反射会导致数据错误。我在代码里加一行电平转换约束问题就迎刃而解了。4.6 一套加速卡开发流程的时间线和节拍最后分享一个时间线的概念。一个从零开始到能稳定运行的FPGA加速卡开发我个人的经验是大概需要4到6周的时间。第一周安装环境、熟悉板卡、跑通参考设计和IBERT。第二周到第三周实现PCIe DMA和DDR读写这是最核心也是最容易出问题的地方。第四周开始加入自己的算法逻辑同时进行联调。第五周做时序收敛和系统级压力测试。最后一周处理各种边角问题比如启动固化、异常处理、上位机软件的完善。如果是用这套现成的开发套件省去了画板卡和调试硬件的时间整个周期大概可以缩短到3到4周。也就是说开发套件的真正价值不只在硬件本身更在于它把最耗时、最不可控的硬件调试环节压缩到了最小让你能把更多精力放在算法和业务逻辑上。我自己在这些年踩过无数次坑之后最大的体会就是FPGA开发拼的不是某个单点技术有多强而是整个开发流程能不能有条不紊地推进。每一步验证做到位再做下一步看起来慢实际上整体最快。这套Xilinx FPGA加速卡开发套件给我的最大帮助恰恰是它把最底层的高速链路和存储通道都验证好了让我从第一步起就有底气。如果你刚踏上FPGA加速卡这条路先把板卡提供的基础例程吃透再动手改自己的设计这比任何高深技巧都管用。
返回列表