资讯动态

FPGA内建眼图扫描:PCIE链路信号完整性评估实战

发布时间:2026/9/29 7:19:13 来源:尧图企业网站定制
1. 为什么要在PCIE系统里做眼图BlockDesign搞高速接口的工程师都有一个共识PCIE链路的调试最怕的不是完全不通而是时通时不通。链路训练能到L0跑个几天也没事但一上压力测试或者换个温度环境就开始报Correctable Error甚至直接Link Down。这种问题用示波器去戳物理层当然可以但很多时候板子已经封在机箱里或者你手上根本没有几十GHz带宽的示波器。这时候用FPGA内部的眼图扫描功能来做链路质量评估就是性价比最高的方案。这个项目的核心思路很直接在Xilinx或者复旦微的FPGA上用BlockDesign的方式搭一套针对PCIE系统的眼图扫描系统。所谓眼图BlockDesign不是让你去画一个眼图显示界面而是利用FPGA收发器内置的Eye Scan功能通过AXI接口把扫描数据读出来再通过UART或者以太网上报到上位机最终在PC端还原出眼图。Xilinx的GTY/GTH收发器从UltraScale系列开始就支持内建的眼图扫描复旦微的Z7系列芯片对标Xilinx Zynq-7000系列在收发器上也提供了类似的PRBS误码检测和眼图扫描能力只是工具链和IP的调用方式有差异。这套系统解决的核心问题是在不依赖外部高速示波器的前提下量化评估PCIE链路的信号完整性。它适合已经跑通了PCIE基础通信、但需要进一步做信号质量验证的工程师也适合正在做板级信号完整性调试、需要快速定位链路余量不足的硬件团队。整个方案的门槛不算高但有几个关键点如果没踩对扫描出来的眼图要么是糊的要么根本扫不出来。我前后在Xilinx Kintex UltraScale和复旦微Z7上各做过一轮踩过的坑主要集中在参考时钟配置、Eye Scan的扫描范围设置、以及BlockDesign里AXI总线的地址映射上。下面把整个系统的设计思路、关键细节和实操过程完整拆一遍。2. 系统整体设计与方案选型2.1 为什么选BlockDesign而不是纯RTLXilinx的Vivado工具链里BlockDesignBD本质上是一个IP Integrator的画布它把IP核的例化、互联、地址分配都图形化了。对于眼图扫描这种系统核心IP包括PCIE硬核或者GT收发器、AXI Interconnect、MicroBlaze软核或者Zynq PS、UART IP、以及Eye Scan相关的DRPDynamic Reconfiguration Port访问逻辑。如果纯手写RTL光是AXI总线的互联和地址译码就够写几百行而且改一个参数就要重新综合一遍。用BlockDesign的好处是IP的互联关系可视化地址映射自动生成参数修改后增量综合速度快。尤其是Eye Scan需要频繁访问收发器的DRP寄存器BD里可以直接把DRP接口引出来通过AXI4-Lite挂到MicroBlaze或者Zynq PS的M_AXI_GP接口上上位机通过串口发命令就能触发扫描。复旦微的Z7芯片在Vivado下的支持方式略有不同。复旦微提供了自己的板级支持包和部分定制IP但核心的GT收发器IP和Xilinx原生的GT Wizard在结构上是一致的。实际操作中我建议先用Xilinx的GT Wizard生成收发器IP再手动替换为复旦微对应的器件型号这样BD的架构可以复用。2.2 PCIE系统里眼图扫描的接入点选择PCIE链路里做眼图扫描接入点有两个选择一是在PCIE硬核内部的GT收发器上直接扫二是在PCIE链路外部单独引一对GT做旁路监测。第一种方案更直接因为PCIE硬核本身就包含了GTEye Scan的DRP接口在硬核内部是可访问的。第二种方案适合已经在运行的PCIE链路不想打断业务流量但需要额外的GT资源和分路器。我选的是第一种方案原因很简单PCIE硬核的GT DRP接口在Vivado里可以直接通过debug bridge或者AXI接口访问不需要额外的硬件改动。具体来说在BlockDesign里例化PCIE IP时勾选Enable Dynamic Reconfiguration Port选项Vivado会自动把DRP接口引出来。然后把这个DRP接口接到一个自定义的AXI4-Lite转DRP的桥接IP上就可以通过软件读写GT的内部寄存器了。需要注意的是PCIE硬核的DRP接口位宽通常是16位或者20位地址空间和普通的AXI4-Lite不完全一致。Xilinx提供了axi_drp_bridge这个IP但在某些版本里需要手动配置地址映射。复旦微的Z7芯片上PCIE硬核的DRP接口定义和Xilinx原版基本一致但寄存器的偏移地址可能有细微差别这个后面在实操部分会详细说。2.3 眼图扫描的数据通路设计整个数据通路是这样的上位机通过UART发送扫描命令 - MicroBlaze或者Zynq PS接收命令 - 通过AXI4-Lite配置Eye Scan的扫描范围和步进 - 启动扫描 - 读取扫描结果 - 通过UART回传到上位机 - 上位机用Python或者MATLAB还原眼图。这里的关键是Eye Scan的扫描结果数据量。以Xilinx GTY为例一次完整的眼图扫描通常需要扫描水平和垂直两个方向水平方向覆盖1个UIUnit Interval垂直方向覆盖整个电压摆幅。如果水平步进是1/64 UI垂直步进是1/64的幅度那么一次扫描就是64x644096个点。每个点的误码率数据是16位或者32位总共就是8KB到16KB的数据量。通过UART以115200的波特率传输大概需要1到2秒完全可以接受。如果PCIE链路速率是Gen38GT/s1个UI是125ps。Eye Scan的水平扫描范围通常可以覆盖±0.5UI也就是±62.5ps。垂直方向的范围取决于接收端的均衡设置通常在几百毫伏左右。这些参数在配置Eye Scan寄存器时需要根据实际链路速率和均衡模式来调整。3. 核心细节解析与实操要点3.1 GT收发器Eye Scan的寄存器配置Eye Scan的核心寄存器分布在GT收发器的DRP地址空间里。以Xilinx UltraScale的GTH为例关键寄存器包括RX Eye Scan Control Register控制扫描的启动、步进、范围RX Eye Scan Data Register读取扫描结果的误码率RX Eye Scan Status Register指示扫描是否完成具体的寄存器地址在Xilinx的UG576文档里有详细说明。这里不逐条列地址而是说配置逻辑首先需要设置水平方向的扫描步进和范围然后设置垂直方向的步进和范围最后启动扫描。每扫一个点硬件会自动统计该点的误码率软件只需要轮询状态寄存器等扫描完成后读取数据即可。复旦微Z7芯片的GT收发器在寄存器定义上和Xilinx 7系列GTX高度相似但Eye Scan的精度和扫描速度略有差异。实测下来复旦微Z7的Eye Scan在Gen2速率5GT/s下扫描一个64x64的点阵大约需要3到5秒比Xilinx同级别芯片慢一些但完全可用。注意Eye Scan的扫描精度和扫描时间是一对矛盾。步进越小眼图越精细但扫描时间成平方增长。建议先用粗步进比如1/16 UI快速扫一遍确认眼图大致形状后再在眼图中心区域用细步进精扫。3.2 BlockDesign里AXI地址映射的坑在Vivado的BlockDesign里当你把多个IP挂到AXI Interconnect上时Vivado会自动分配地址。但Eye Scan的DRP接口不是标准的AXI4-Lite从设备它需要经过一个桥接IP。这个桥接IP的地址范围如果分配不当会导致读写DRP寄存器时访问到错误的地址。我遇到的具体问题是MicroBlaze的M_AXI_DP接口挂了一个AXI UART Lite和一个AXI DRP BridgeVivado自动分配的地址是UART在0x40600000DRP Bridge在0x40610000。但DRP Bridge的内部地址译码逻辑默认只用了低16位导致访问0x40610000和0x40600000时产生了地址重叠。解决办法是在DRP Bridge的IP配置里把地址位宽从16位改成20位或者在BD里手动锁定地址范围。复旦微Z7的BlockDesign里如果用的是复旦微提供的PCIE IP它的DRP接口可能已经封装好了不需要额外的桥接IP。但如果你用的是Xilinx原生的PCIE IP就需要自己加桥接逻辑。这一点在项目初期就要确认清楚否则综合出来发现DRP读写不通回头改BD很浪费时间。3.3 参考时钟和复位逻辑的处理PCIE系统的参考时钟通常是100MHz或者125MHz由外部晶振或者时钟芯片提供。Eye Scan的扫描精度和参考时钟的抖动直接相关。如果参考时钟的抖动太大扫出来的眼图会明显闭合但这不代表链路真的有问题而是时钟质量不行。我在一个项目里遇到过PCIE链路在Gen3下眼图扫描结果很差眼高只有几十毫伏但实际跑压力测试却没有误码。后来用示波器测参考时钟发现抖动超过了1ps RMS换了一个低抖动的时钟芯片后眼图扫描结果立刻改善。所以在做眼图扫描之前一定要先确认参考时钟的抖动指标。复位逻辑方面Eye Scan的启动需要在PCIE链路进入L0状态之后。如果链路还在LTSSM的Polling或者Configuration状态GT的内部寄存器可能还没有完全配置好这时候启动Eye Scan会读到无效数据。建议在软件里先读取LTSSM的状态寄存器确认是L0之后再启动扫描。4. 实操过程与核心环节实现4.1 Vivado BlockDesign的搭建步骤第一步创建Vivado工程选择对应的器件型号。Xilinx Kintex UltraScale选xc7k325t或者xc7k420t复旦微Z7选对应的FMQL系列型号。工程创建后先添加PCIE IP核。在IP Catalog里搜索PCIE选择PCI Express Gen3 Subsystem或者对应的Gen2版本。第二步配置PCIE IP。关键配置项包括链路速率Gen1/Gen2/Gen3、链路宽度x1/x2/x4/x8、参考时钟频率100MHz/125MHz、是否使能DRP接口。这里一定要勾选Enable Dynamic Reconfiguration Port否则后面没法访问GT的Eye Scan寄存器。第三步添加MicroBlaze或者配置Zynq PS。如果用的是Zynq系列包括复旦微Z7直接启用PS的M_AXI_GP接口把它接到AXI Interconnect上。如果用的是纯FPGA比如Kintex UltraScale需要例化MicroBlaze软核并添加DDR控制器和UART IP。第四步添加AXI DRP Bridge。在IP Catalog里搜索AXI DRPXilinx提供了axi_drp_bridge这个IP。把它挂到AXI Interconnect的从设备端口上然后把它的DRP接口接到PCIE IP的DRP接口上。注意DRP接口的位宽和地址位宽要匹配。第五步添加UART IP。用AXI UART Lite或者AXI UART 16550都可以挂到AXI Interconnect上把UART的TX/RX引脚约束到FPGA的管脚上。第六步地址分配和引脚约束。在Address Editor里确认每个IP的地址范围没有重叠。然后创建XDC约束文件把PCIE的参考时钟、复位、UART引脚、DDR引脚等都约束好。第七步生成Bitstream并导出XSA文件。如果用的是Zynq导出XSA后可以在Vitis里开发软件如果用的是MicroBlaze直接在Vivado里用SDK或者Vitis开发。4.2 Eye Scan扫描软件的编写软件部分的核心是三个函数配置Eye Scan寄存器、启动扫描、读取结果。以C语言为例伪代码逻辑如下// 配置Eye Scan参数 void config_eye_scan(uint32_t h_step, uint32_t v_step, uint32_t h_range, uint32_t v_range) { // 写水平步进寄存器 Xil_Out32(DRP_BASE H_STEP_OFFSET, h_step); // 写垂直步进寄存器 Xil_Out32(DRP_BASE V_STEP_OFFSET, v_step); // 写水平范围寄存器 Xil_Out32(DRP_BASE H_RANGE_OFFSET, h_range); // 写垂直范围寄存器 Xil_Out32(DRP_BASE V_RANGE_OFFSET, v_range); } // 启动扫描 void start_eye_scan() { Xil_Out32(DRP_BASE CONTROL_OFFSET, 0x01); } // 等待扫描完成并读取结果 int read_eye_scan_result(uint32_t *result_buf, uint32_t buf_size) { uint32_t status; uint32_t count 0; while (1) { status Xil_In32(DRP_BASE STATUS_OFFSET); if (status 0x01) { // 扫描完成 break; } if (count TIMEOUT) { return -1; // 超时 } } // 读取扫描结果 for (uint32_t i 0; i buf_size; i) { result_buf[i] Xil_In32(DRP_BASE DATA_OFFSET i*4); } return 0; }上位机用Python写一个串口接收程序把收到的数据解析成二维数组然后用matplotlib画出眼图。眼图的横轴是水平方向的时间偏移单位是UI纵轴是垂直方向的电压偏移单位是mV每个点的颜色深浅代表误码率的高低。4.3 扫描参数的计算与选择扫描参数的选择直接决定了眼图的质量和扫描时间。以PCIE Gen38GT/s为例1个UI是125ps。如果水平扫描范围设为±0.5UI步进设为1/32 UI那么水平方向有32个点。垂直方向的范围取决于接收端的均衡设置假设接收端差分摆幅是800mV垂直扫描范围设为±400mV步进设为1/32那么垂直方向也有32个点。总共就是32x321024个点。每个点的扫描时间取决于误码率的统计精度。Xilinx的Eye Scan硬件通常需要统计一定数量的比特才能给出可靠的误码率。如果每个点统计10^6个比特在8GT/s的速率下每个点需要125微秒。1024个点就是128毫秒加上软件开销一次完整扫描大约1到2秒。复旦微Z7的Eye Scan硬件在统计精度上可能略有不同实测下来每个点需要统计10^7个比特才能得到稳定的误码率扫描时间会增加到10到20秒。如果时间太长可以适当降低统计精度但眼图的噪点会增多。提示在实际调试中我通常先用1/16 UI的粗步进扫一遍确认眼图的大致中心和形状然后再在眼图中心区域用1/32或者1/64的细步进精扫。这样可以在保证精度的同时把总扫描时间控制在可接受的范围内。5. 常见问题与排查技巧实录5.1 扫描结果全是高误码率怎么办这是最常见的问题。扫描出来的眼图如果全是红色高误码率说明Eye Scan没有正确工作。排查顺序如下第一确认PCIE链路是否已经进入L0状态。如果链路还在训练阶段GT的内部寄存器可能还没有配置好。可以在软件里读取LTSSM状态寄存器确认是L0之后再启动扫描。第二确认DRP接口的读写是否正常。可以先写一个已知值到DRP寄存器再读回来看是否一致。如果不一致说明DRP桥接IP的地址映射有问题。第三确认Eye Scan的扫描范围是否设置正确。如果扫描范围超出了GT接收端的有效范围扫出来的点可能全是无效数据。建议先把扫描范围设小一点比如±0.1UI确认能扫出眼图后再逐步扩大。第四确认参考时钟的抖动是否在合理范围内。如果参考时钟抖动太大眼图会明显闭合但这不是Eye Scan的问题而是时钟质量问题。5.2 眼图扫描速度太慢怎么优化扫描速度慢通常是因为统计精度设得太高或者扫描点数太多。优化方法降低每个点的统计比特数。从10^7降到10^6扫描时间可以缩短10倍但眼图的噪点会增多。减少扫描点数。先用粗步进扫一遍只在眼图中心区域精扫。提高UART波特率。从115200提高到921600数据传输时间可以缩短8倍。如果用的是Zynq可以考虑用以太网代替UART传输数据速度可以提高到几十Mbps。5.3 复旦微Z7和Xilinx芯片的差异处理复旦微Z7的GT收发器在寄存器定义上和Xilinx 7系列GTX基本一致但有几个差异需要注意Eye Scan的扫描精度可能略有不同同样的步进设置下复旦微Z7扫出来的眼图可能比Xilinx的稍微粗糙一些。DRP接口的时序参数可能不同如果直接复用Xilinx的DRP桥接IP可能需要在BD里调整时序约束。复旦微的Vivado版本可能不是最新的某些IP的版本和Xilinx原版有差异建议在项目初期就确认好工具链版本。下面是一个常见问题的速查表问题现象可能原因排查方法解决方案扫描结果全高误码链路未进入L0读LTSSM状态寄存器等待链路训练完成DRP读写不一致地址映射错误写已知值再读回调整DRP桥接IP地址位宽眼图明显闭合参考时钟抖动大用示波器测时钟抖动更换低抖动时钟芯片扫描时间过长统计精度过高检查统计比特数设置降低统计精度或减少扫描点眼图中心偏移均衡设置不当检查RX均衡配置调整CTLE/DFE参数5.4 实操心得与避坑技巧第一个坑PCIE IP的DRP接口在Vivado里默认是不使能的。如果你在配置PCIE IP时忘了勾选Enable Dynamic Reconfiguration Port后面在BD里是找不到DRP接口的。这时候只能删掉PCIE IP重新配置或者手动在RTL里例化GT Wizard。我建议在项目初期就把这个选项勾上哪怕暂时不用。第二个坑AXI Interconnect的地址位宽默认是32位但DRP桥接IP可能只用了低16位。这会导致地址重叠读写DRP寄存器时访问到错误的地址。解决办法是在DRP桥接IP的配置里把地址位宽改成20位或者24位或者在BD里手动锁定地址范围。第三个坑Eye Scan的扫描结果需要做归一化处理。硬件返回的误码率数据是原始计数值需要根据统计的比特总数换算成误码率。如果忘了这一步画出来的眼图颜色映射会不对。第四个坑复旦微Z7的PCIE硬核在Gen2速率下Eye Scan的扫描范围可能比Xilinx的窄。实测下来复旦微Z7在Gen2下的水平扫描范围大约是±0.3UI而Xilinx同级别芯片可以到±0.5UI。如果扫描范围设得太大边缘的点可能全是无效数据。第五个坑UART传输数据时要注意字节序。FPGA是小端模式上位机如果是大端模式解析出来的数据会错位。建议在协议里明确字节序或者在软件里做转换。6. 系统扩展与后续优化方向这套眼图BlockDesign系统跑通之后可以往几个方向扩展。第一个方向是自动化扫描把扫描参数配置、数据读取、眼图绘制全部脚本化每次上电后自动跑一遍生成眼图报告。这对于批量生产测试很有用。第二个方向是多链路同时扫描如果板子上有多路PCIE链路可以在BD里例化多个DRP桥接IP通过AXI Interconnect挂到同一个MicroBlaze或者Zynq PS上软件里分时复用扫描。第三个方向是结合PRBS误码测试Eye Scan给出的是眼图的形状PRBS测试给出的是误码率。两者结合可以更全面地评估链路质量。Xilinx的GT Wizard里可以同时使能Eye Scan和PRBS软件里切换模式即可。第四个方向是上位机界面优化用PyQt或者Web前端做一个交互式的眼图显示界面支持缩放、测量眼高眼宽、导出报告等功能。这个对于团队协作和报告输出很有帮助。我在实际项目里这套系统帮我在没有高速示波器的情况下定位了好几次PCIE链路的问题。有一次是PCB走线的阻抗不连续导致眼图闭合通过Eye Scan扫出来的眼图明显在某个水平位置有凹陷后来检查PCB发现是过孔设计有问题。还有一次是参考时钟的抖动导致眼高不足换了时钟芯片后眼图立刻改善。这些经验说明Eye Scan虽然精度不如专业示波器但对于板级调试和链路余量评估来说已经完全够用了。

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

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

免费获取报价 →
↑