免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

FPGA高速接口眼图测试实战:Xilinx与复旦微PCIE BlockDesign全流程

FPGA高速接口眼图测试实战:Xilinx与复旦微PCIE BlockDesign全流程 1. 从一根金手指说起PCIE眼图测试为什么绕不开BlockDesign做FPGA高速接口的同行大概都有过这种经历板子焊回来PCIE链路死活训练不到Gen3或者勉强跑起来但误码率居高不下这时候硬件同事会甩过来一句你眼图测了吗。眼图这个东西说白了就是把高速串行信号在时域上无数次叠加后形成的统计图形眼睛张得开不开直接决定了链路能不能稳定工作。而在Xilinx和复旦微这两家FPGA平台上用BlockDesign搭一套针对PCIE系统的眼图测试工程是我近两年做得比较多的一个活儿今天就把整个流程和踩过的坑完整梳理一遍。先明确一下这套系统要解决什么问题。PCIE链路的信号完整性评估传统做法是拿高端示波器加探头去点测成本高、操作繁琐而且很多场景下你根本没法在板子上引出测试点。用FPGA内部自带的眼图扫描功能通过调整收发器的采样相位和电压阈值统计不同采样点下的误码情况就能在芯片内部画出一张眼图。这套方法在Xilinx的GT系列收发器和复旦微的对应器件上都支持核心思路一致但工具链和IP配置差异不小。这篇文章适合谁看如果你已经做过基本的FPGA开发懂Verilog或者VHDL对PCIE协议有初步了解但还没实际搭过眼图测试系统那这篇内容应该能帮你省下不少查文档的时间。如果你是从Altera或者别的平台转过来的也能通过对比理解Xilinx和复旦微这套流程的特点。我会尽量把每个步骤背后的为什么讲清楚而不是只丢一堆配置截图。需要提前说明的是眼图扫描本质上是一种基于误码统计的间接测量方法它反映的是接收端在当前均衡配置下的实际采样余量和示波器测到的物理眼图有相关性但不完全等同。理解这一点后面很多参数设置你就不会觉得莫名其妙了。2. 两家平台的收发器架构差异与眼图扫描能力对比2.1 Xilinx GT收发器的眼图扫描机制Xilinx从7系列开始GTX/GTH/GTP这些收发器就内置了眼图扫描Eye Scan功能。它的基本原理是在接收端引入一个可调的采样时钟相位偏移和一个可调的判决电压阈值然后在一个二维网格上逐点统计误码。具体来说PRBS序列发生器在发送端产生已知的伪随机码流接收端把采样结果和本地生成的相同序列做比对统计每个网格点上的误码数量。当采样点落在眼图张开区域内时误码率极低当采样点靠近眼睛边缘时误码率迅速上升。把所有网格点的误码率映射成颜色深浅就得到了眼图。在UltraScale和UltraScale系列里这个功能通过EYESCAN原语或者更上层的IBERTIntegrated Bit Error Ratio Tester来实现。IBERT本质上是一个跑在FPGA内部的软核通过JTAG和上位机通信界面上直接显示眼图。但IBERT有个问题它主要面向实验室调试要集成到正式产品或者自动化测试流程里比较麻烦。所以很多团队会选择自己用BlockDesign搭一套把眼图扫描的逻辑嵌到自己的设计里。2.2 复旦微器件的对应能力复旦微的FPGA产品线里对标Xilinx 7系列和UltraScale的器件都有。以复旦微的Z7系列为例它的高速收发器在架构上做了很多自主设计但眼图扫描的基本思路是相通的。不过工具链方面复旦微用的是自家的开发套件IP核的命名和参数界面和Vivado不一样。我实际用下来复旦微的眼图扫描IP在配置灵活性上稍逊一筹比如扫描网格的步进精度、统计时间的可调范围选项没有Xilinx那么细。但基本功能是完整的对于常规的PCIE Gen2/Gen3链路评估够用。这里要提醒一点复旦微不同型号的收发器能力差异比较大有的支持到Gen3有的只到Gen2。选型阶段一定要确认清楚别板子画完了才发现收发器速率不够。另外复旦微的IP文档相对Xilinx来说没那么详尽很多参数含义需要结合收发器手册和实际测试来理解这是做复旦微平台时要有心理准备的地方。2.3 为什么选择BlockDesign而不是纯RTL有人可能会问眼图扫描的逻辑用纯RTL写不行吗为什么要用BlockDesign我的体会是BlockDesign的优势在于IP集成和时钟域管理。PCIE系统涉及多个时钟域收发器的参考时钟、用户逻辑时钟、DMA时钟等等用BlockDesign可以直观地把时钟连接和复位连接理清楚减少出错概率。而且Xilinx的PCIE IP、DMA IP、眼图扫描IP都是以IP核形式提供的用BlockDesign集成比手动例化省事得多。当然BlockDesign也不是没有缺点。它的自动连线有时候会做出你不想要的选择比如把某个时钟自动连到了不该连的地方或者复位极性搞反了。所以我的习惯是自动连线之后一定要逐个检查关键连接特别是时钟和复位。另外BlockDesign生成的HDL代码可读性一般如果后续要移植到复旦微平台基本等于重写这一点要有预期。3. 搭建PCIE眼图BlockDesign的完整操作链路3.1 工程创建与器件选型的关键决策打开Vivado之后第一步是创建工程并选器件。这里有个容易被忽略的点眼图扫描功能对收发器的型号有要求不是所有GT都支持。以Xilinx为例GTP在7系列里功能最弱眼图扫描的精度和灵活性都不如GTX/GTH。所以如果你的板子用的是Artix-7这类只有GTP的器件眼图测试能做但别期望太高。Kintex-7和Virtex-7的GTX/GTH就好很多UltraScale系列的GTH/GTH transceiver更是标配了更精细的扫描能力。选器件的时候还要注意速度等级和温度等级。速度等级低的器件收发器的最高速率可能受限比如-1等级的GTH可能跑不到Gen3的8GT/s。温度等级影响的是工业级还是商业级这个和眼图测试本身关系不大但影响你后续能不能在宽温范围内做测试。创建完工程后建议先跑一遍器件的收发器手册确认你用的Bank里哪些Quad支持PCIE。Xilinx的PCIE硬核通常绑定在特定的Quad上比如X0Y0或者X0Y1不是随便哪个GT都能用的。这个信息在器件的Pinout文件或者Transceiver Wizard里能查到。3.2 PCIE IP核的配置要点在BlockDesign里添加PCIE IP核Xilinx这边叫PCI Express复旦微那边叫法不同但功能类似。配置的时候有几个关键参数需要仔细选链路速率和宽度Gen1是2.5GT/sGen2是5GT/sGen3是8GT/s。宽度方面x1、x2、x4、x8、x16都有。眼图测试通常建议先用Gen1跑通再逐步升到Gen2、Gen3。因为Gen3用了128b/130b编码和更复杂的均衡眼图闭合更严重调试难度大。参考时钟频率PCIE规范要求100MHz的参考时钟但有些设计用125MHz或者其他频率。这个必须和板子上的实际晶振一致否则链路训练都过不了。BAR配置眼图测试本身不需要太大的BAR空间但如果你要通过PCIE把眼图数据传到上位机就需要配置足够的BAR或者用DMA。我一般会留一个BAR给寄存器访问再用XDMA做大数据传输。这里有个坑Xilinx的PCIE IP在Gen3模式下默认会开启一些均衡和DFE功能这些功能会影响眼图扫描的结果。如果你想看裸眼的情况需要在IP配置里把均衡关掉或者调到最低。但关掉均衡后链路可能训练不到Gen3所以实际测试中往往是开着均衡看眼图评估的是均衡后的有效眼图。3.3 眼图扫描IP的集成与参数设置眼图扫描IP在Xilinx这边通常通过IBERT或者Transceiver Wizard生成。如果要在BlockDesign里集成可以用IBERT UltraScale GTH这个IP它支持AXI接口可以通过MicroBlaze或者上位机来控制。复旦微那边有对应的眼图扫描IP配置界面不同但参数含义类似。关键参数包括参数含义典型设置扫描水平范围采样相位的调整范围通常覆盖1个UI扫描垂直范围判决电压的调整范围覆盖差分摆幅的±100%水平步进相位调整的精度1/64 UI或更细垂直步进电压调整的精度1/64摆幅或更细每点统计时间每个网格点的误码统计时长根据目标误码率定通常10^6到10^8比特统计时间的设置很关键。如果你要看10^-12的误码率理论上需要统计10^12个比特那时间就太长了。实际做法是统计到10^6到10^8比特然后用外推法估计更低误码率下的眼图轮廓。这个外推的准确性取决于误码分布的假设通常假设为高斯分布在误码率不是特别低的时候还比较准。3.4 时钟与复位的连接检查BlockDesign自动连线之后一定要手动检查这几处收发器的参考时钟是否来自正确的引脚频率是否正确。用户逻辑时钟是否从PCIE IP的时钟输出引出而不是自己另接了一个。复位信号的极性是否匹配Xilinx的IP通常用低电平有效的复位但有些IP是高电平有效。眼图扫描IP的时钟是否和收发器时钟同源否则扫描结果会漂移。我遇到过一个问题眼图扫描IP的时钟用了独立的MMCM输出和收发器时钟不同源结果扫描出来的眼图左右漂移根本没法看。后来改成从收发器时钟分频出来问题就解决了。这个坑花了我整整两天才定位到希望你能避开。4. 眼图数据采集与上位机可视化处理4.1 通过PCIE回传眼图数据的通路设计眼图扫描产生的原始数据是一个二维数组每个点是一个误码计数。假设扫描网格是64x64每个计数用32位表示那就是16KB的数据。这个量不大通过PCIE的BAR空间直接读就行。但如果网格更细比如256x256数据量就到256KB了用DMA更合适。我的做法是在FPGA里用一个BRAM缓存扫描结果然后通过XDMA把BRAM内容读到上位机。XDMA的配置在BlockDesign里也很直观关键是描述符的地址要对齐否则DMA会报错。另外XDMA的AXI接口位宽要和BRAM的位宽匹配不匹配的话需要加一个位宽转换器。复旦微那边如果它的PCIE IP不支持DMA那就只能用BAR访问。BAR访问的缺点是速度慢但眼图数据量不大的话也能接受。我试过用BAR逐点读64x64的网格大概几秒钟能读完对于调试来说够用了。4.2 上位机软件的眼图渲染上位机这边我用Python写了一个简单的脚本通过XDMA的驱动接口读取数据然后用matplotlib画成热力图。关键是把误码计数转换成颜色误码率越低颜色越深表示眼睛张开误码率越高颜色越浅。也可以取对数后归一化这样低误码率区域的对比度更好。有个细节眼图扫描的坐标轴需要标定。水平轴是相位偏移单位是UI的分数垂直轴是电压阈值单位是毫伏或者差分摆幅的百分比。标定不准的话眼图的形状是对的但数值没有参考意义。Xilinx的IBERT会自动标定自己搭的系统需要手动算一下。4.3 误码率统计的陷阱与数据可信度判断这里要重点说一下误码率统计的陷阱。眼图扫描统计的是误码计数但如果你统计的时间太短很多点的误码计数是0画出来的眼图会显得特别大实际上是因为统计样本不够。判断方法是看眼图边缘的过渡是否平滑如果边缘很陡峭像刀切一样那很可能是统计时间不够。另一个陷阱是PRBS序列的长度。PRBS7、PRBS15、PRBS31的码型不同对收发器均衡的压力也不同。PCIE Gen3实际用的是加扰后的数据不是纯PRBS所以用PRBS测出来的眼图会比实际链路乐观一些。更接近实际的做法是用PCIE IP自带的测试模式或者用自定义的码型发生器。我一般会先用PRBS31跑一遍看眼图的大致形状然后再用实际链路的数据跑一遍对比两者的差异。如果差异很大说明均衡或者CDR的设置需要调整。5. 实测中遇到的典型问题与排查路径5.1 链路训练失败从参考时钟查起链路训练失败是最常见的问题表现是PCIE IP的LTSSM状态机卡在Detect或者Polling状态上不去。排查顺序我一般是这样的先查参考时钟用示波器或者频率计测收发器参考时钟引脚的频率和幅值。100MHz的时钟幅值通常在800mV到1.6V之间差分。如果频率偏了或者幅值不够链路肯定训练不起来。再查复位确认PCIE IP的复位已经释放而且释放的时机在参考时钟稳定之后。有些设计复位释放太早IP还没准备好就开始训练也会失败。查链路宽度和速率配置确认IP配置的链路宽度和实际板子的连接一致。比如IP配的是x4但板子只接了x1那训练就会失败。查收发器极性PCIE的TX和RX极性如果接反了链路也训练不起来。Xilinx的IP支持极性反转配置可以在IP里改。复旦微那边我还遇到过一个额外的问题它的PCIE IP对参考时钟的抖动要求比Xilinx更严格。同样的时钟源在Xilinx板子上能跑Gen3在复旦微板子上只能跑Gen2。后来换了一个抖动更低的晶振才解决。所以如果你用复旦微平台时钟源的选择要更谨慎。5.2 眼图扫描结果异常区分是信号问题还是配置问题眼图扫描结果异常有好几种表现眼图完全闭合、眼图偏移、眼图有异常条纹。不同的表现对应不同的问题。眼图完全闭合可能是收发器根本没工作或者PRBS序列不匹配。先确认收发器的TX和RX都使能了然后确认PRBS的生成和校验用的是同一个序列。Xilinx的IBERT里可以单独配置TX和RX的PRBS模式如果两边不一致误码率会一直是100%。眼图偏移通常是采样相位或者电压阈值的标定有问题。检查扫描范围是否覆盖了实际的眼图位置。如果眼图偏在扫描范围的边缘说明中心频率或者电压有偏差。眼图有异常条纹可能是时钟抖动或者电源噪声。这种情况下眼图的上下边缘会出现周期性的模糊。解决方法是改善电源滤波或者换一个抖动更低的时钟源。5.3 复旦微平台特有的工具链适配问题复旦微的工具链和Vivado差异比较大我踩过的坑包括IP核的命名和端口定义不同从Xilinx移植过来的代码不能直接用需要重新例化。约束文件的语法有差异特别是时序约束和引脚约束。复旦微的约束文件格式和Xilinx的XDC不完全兼容需要手动改。眼图扫描IP的寄存器映射不同上位机软件需要重新适配。文档和示例工程比较少很多问题需要自己摸索或者找FAE支持。我的建议是如果团队同时用Xilinx和复旦微的平台尽量把眼图扫描的逻辑抽象成一层统一的接口底层用条件编译区分两家平台的IP。这样上位机软件和测试流程可以复用减少重复工作。6. 从能跑到好用眼图系统的优化与自动化6.1 扫描速度与精度的平衡眼图扫描的速度和精度是一对矛盾。网格越细、统计时间越长眼图越精确但扫描时间也越长。一个256x256的网格每个点统计10^7比特在8GT/s的速率下每个点需要约1.25毫秒总共需要约80秒。如果统计时间加到10^8比特那就是800秒十几分钟调试的时候等不起。我的做法是分两步先用粗网格比如32x32和短统计时间10^5比特快速扫一遍看眼图的大致位置和形状。然后针对眼图边缘区域用细网格和长统计时间精扫。这样既能快速定位问题又能获得精确的眼图轮廓。6.2 自动化测试脚本的编写思路如果要做批量测试或者长时间监控手动操作就不现实了。我写过一个Python脚本通过XDMA的驱动接口自动配置眼图扫描参数、启动扫描、读取数据、生成眼图报告。脚本的核心是封装了寄存器读写函数然后按照预设的扫描策略循环执行。自动化测试的一个关键点是异常处理。如果链路断了或者扫描超时脚本要能检测到并重试而不是直接崩溃。另外测试结果要保存成结构化的格式比如CSV或者JSON方便后续分析和对比。6.3 眼图结果的长期监控与趋势分析对于已经量产的产品眼图测试可以作为健康监控的手段。定期扫描眼图记录眼图的高度和宽度如果发现眼图逐渐闭合说明链路在退化可能是连接器氧化、线缆老化或者电源纹波变大。这种趋势分析比单次测试更有价值。实现长期监控需要在FPGA里保留眼图扫描的逻辑并且能够在不影响正常业务的情况下启动扫描。这要求眼图扫描IP和业务逻辑共享收发器资源但分时复用。Xilinx的IBERT支持这种模式但配置起来比较复杂需要仔细规划时钟和复位。7. 一些个人体会和后续可以扩展的方向整套系统搭下来我最大的体会是眼图测试本身的技术难度不算特别高难点在于细节的把握和问题的定位。一个参数配错可能就要花好几天去排查。所以我的习惯是每做一个新的板子或者新的器件先把最小系统跑通确认参考时钟、复位、链路训练都正常然后再加眼图扫描。不要一上来就把所有功能都加上出了问题根本不知道是哪里的问题。另外Xilinx和复旦微两家平台各有优劣。Xilinx的工具链成熟、文档丰富、IP选择多但成本高。复旦微性价比好但工具链和生态还在完善中。如果项目对成本敏感复旦微是值得考虑的但要做好投入更多调试时间的准备。后续如果要把这套系统做得更完善我觉得有几个方向可以扩展一是把眼图扫描和PCIE的均衡自适应结合起来自动寻找最优的均衡配置二是把眼图数据上传到云端做长期趋势分析三是支持更多的高速协议比如以太网、SRIO等让这套测试框架更通用。这些方向我还在摸索中有进展再和大家分享。
返回列表