ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

FPGA 100G光口光模块测试实战:从GT配置到误码分析

2026/9/8 20:20:09 拓冰建站 浏览量
FPGA 100G光口光模块测试实战:从GT配置到误码分析 1. 项目概述与测试目标拆解做FPGA开发这些年凡是和高速接口沾边的项目最终基本都会绕到光口上来。尤其是100G这个速率档位从数据中心到仪器仪表从通信设备到视频传输几乎成了标配。我这段时间正好在调试一块带100G光口的FPGA板卡从光模块选型到GT收发器配置从回环测试到误码分析踩了一路的坑也摸清了不少门道。这篇围绕“100G光口/光模块的FPGA测试实例”这个主题把整个测试过程掰开揉碎了讲清楚希望能帮到正在调板子或者准备入手的同行。1.1 100G光口测试到底在测什么先说清楚一件事所谓100G光口在FPGA这一侧其实不是你想象中一根光纤插进去就能跑通那么简单。它本质上是一个高速串行收发链路包含了光模块、连接器、PCB高速走线、FPGA内部的高速收发器也就是GT/GTH/GTY这类SerDes、以及上层的PCS/PMA逻辑。任何一个环节出问题表现出来都是“链路不通”或者“误码率偏高”但定位起来会让人非常头大。我们这次要测的内容拆开来无非是四块光模块本身是否工作正常包括光口能否发光、收光灵敏度是否达标、数字诊断接口能不能读到温度、电压、光功率这些参数。FPGA高速收发器能否在25.78125Gbps这个线速率上稳定锁定时钟能不能完成数据收发。从FPGA逻辑到光模块之间的物理链路是否完整包括AC耦合电容、连接器焊接、PCB走线有没有问题。数据通路在跑业务流量比如64B/66B编码后的以太网帧时误码率能不能达到项目要求。说白了这个测试就是给整个100G通路做一个“体检”体检合格了后面跑上层业务才踏实。1.2 什么场景会用到这个方案这套测试方案覆盖的场景其实挺广。最常见的几类通信板卡开发交换板、线卡上的100G上联口板子贴完片要过老化测试、单板测试这时候就得靠FPGA灌流量去验证光口。FPGA原型验证ASIC流片前拿FPGA做原型需要验证100G以太网MAC、PCS、RS-FEC这些IP的行为。仪器仪表和测试设备误码仪、协议分析仪的光口测试板本质也是FPGA加光模块的结构。自研高速接口方案用FPGA做光纤传输的自定义协议不走标准以太网这时候光口测试更是必修课。不管哪种场景测试的核心路径是共通的FPGA内部产生测试数据→高速收发器并串转换→光模块电口→光口发光→对端接收→比对数据判误码。把这条链路跑通、跑稳项目就成功了一大半。2. 光模块架构与选型动手之前先搞懂对象很多人上来就急着写代码结果板子调不通了才回头查模块资料这是本末倒置。光模块这个东西看着就是个可插拔的小盒子但内部的讲究一点不比FPGA这边少。2.1 100G光模块的内部架构和电接口100G光模块当前最主流的形态是QSFP28电接口侧是4路25G差分对每路速率25.78125Gbps这是100G Base-R的物理层线速率包含了64B/66B编码开销所以不是整数25G。模块内部大致是这样一条链路电接口进来4路高速差分信号→经过模块内部的驱动芯片也就是大家常说的光模块电芯片→调制到激光器上变成光信号发出接收方向反过来光信号经探测器转成微弱电信号经过跨阻放大器TIA和限幅放大器LA放大整形再送到电接口出去。这里有个关键点要留意不同档次的模块内部DSP/CDR的处理能力不一样。有些模块比如长距的LR4、ER4内部带了DSP加强芯片对接收信号有很强的均衡补偿能力有些短距模块比如SR4、AOC有源光缆结构相对简单。这直接影响了你FPGA侧对信号质量的要求以及调试时对误码的判断标准。另外就是模块的50GHz带宽差分阻抗是100欧姆交流耦合FPGA到光模块连接器之间的高速线必须按100欧姆差分阻抗来设计这是个硬性约束。2.2 模块选型的几个关键参数选光模块的时候下面这几个参数一定要确认清楚不然买回来大概率要踩坑参数说明对FPGA测试的影响速率/协议100G Base-SR4/LR4/ER4还是CWDM4、PSM4决定线速率是否是25.78125Gbps以及是否需要RS-FEC电接口标准大多为CAUI-44×25G NRZ直接对应GT收发器lane数工作温度商业级0~70℃工业级-40~85℃影响老化测试环境下的稳定性供电要求3.3V为主部分内置DSP的需要额外功耗板卡电源设计必须留足余量数字诊断I2C接口符合SFF-8636规范通过I2C可以读模块温度、电压、光功率、告警标志特别提醒一点100G光模块的功耗不低一个QSFP28模块典型功耗在3.5W左右带DSP的长距模块可能到5W以上。板卡设计时散热风扇和电源余量都要考虑进去不然测试过程中模块温度过高会出现莫名的误码甚至断链这也是我实际调试中遇到过的真实教训。3. FPGA测试系统整体设计方案选型与回环策略测试系统怎么搭直接决定了调试效率。我的经验是不要一上来就追求“完整业务流量”测试而是把测试拆成多个层级每一层都先证明自己OK再叠加下一层。这样出了问题能快速定位到底在哪一段。3.1 硬件组成与连接方式一个典型的100G光口FPGA测试系统包括以下部分FPGA板卡需要集成支持25G速率以上的高速收发器。Xilinx UltraScale/Ultrascale系列的GTY、Intel的E-Tile收发器都支持这个速率档。光模块QSFP28根据项目需求选择测试环境建议备几种——短距多模SR4、单模LR4、甚至DAC铜缆。光纤跳线多模配MPO/MTP跳线单模配LC跳线注意模块的光口类型要匹配。对端设备可以是另一块同样的FPGA板卡也可以是商用交换机、误码仪。时钟源给FPGA提供参考时钟100G Base-R常用的参考时钟频率是161.1328125MHz或者156.25MHz。如果手头只有一块板子最常见的做法是对光模块做外部回环或者直接在FPGA内部做回环。这一点在后面详细展开。3.2 回环测试方案从内部到外部的四级递进回环测试是高速链路调试的利器。我一般把回环分成几级逐级递进第一级FPGA内部数字回环Near-End PCS Loopback在FPGA逻辑侧直接把发送数据环回到接收通路不经过GT收发器。这一级验证的是你自己的用户逻辑和数据通路对不对。这级都过不了就别往下查了。第二级GT收发器PMA回环Near-End PMA Loopback在GT收发器内部串行数据经过并串转换后直接在芯片内部环回不经过外部引脚也不发光。这一级验证GT的PMA配置、时钟恢复、以及和PCS之间的接口是否正常。通常用IBERT或者自定义的逻辑就能跑。第三级外部线缆回环用一根光纤跳线把光模块的TX和RX口短接或者如果有多个口用DAC线缆环回。这一级把光模块、连接器、PCB走线全部串了进来是最接近真实链路的一种测试方式。第四级点对点对测两块板卡用光纤直连各自发各自的PRBS然后统计对端收到的误码。这是最接近真实业务的验证方式通常用来做最终的误码率认证和长时间老化测试。回环层级的概念可以说贯穿了光口调试的整个过程。你在QA报告里写“回环误码率”的时候一定要写清楚是哪一级回环下的结果否则数字没有可比性。3.3 为什么强调用PRBS做压力测试PRBS伪随机二进制序列是高速链路测试的标配信源。原因是它能在统计特性上模拟真实数据流同时又是可预测的——接收端用同样的PRBS发生器对接收到的数据做比对就能逐比特判断有没有出错。100G以太网物理层规范里明确提到了PRBS31作为系统级误码测试的激励。PRBS31的特征多项式是x^31 x^28 1序列长度2^31 - 1足够长能很好覆盖到低频和高频分量。实际测试中我还常用PRBS15、PRBS23做快速粗测因为PRBS31要跑完一个完整周期才更有意义几分钟的短测虽然也能发现问题但理论采样面不够。4. 核心逻辑实现GT收发器配置与数据通路这块是FPGA工程师真正要写代码和调配置的地方。很多人一看到GT的配置界面就懵其实核心就是三件事时钟对不对、复位顺序对不对、数据接口有没有对齐。4.1 参考时钟与GT位置规划100G光口在FPGA上通常占用一个Quad中的4个连续GTY lane。参考时钟一个关键参数是频率。对于25.78125Gbps的线速率参考时钟有两种常用选择161.1328125MHz线速率除以160和156.25MHz常用于带FEC的场景配合内部的时钟倍频关系。在Xilinx Vivado里GTY的线速率、参考时钟、QPLL/CPLL配置是通过 wizard 生成的transceiver IP来管理的。选线速率25.78125G参考时钟156.25M其他参数保持默认一般能直接出配置。但有一个容易忽略的点注意参考时钟的抖动指标非常关键。如果参考时钟来自板上的普通振荡器务必确认它满足GT的参考时钟抖动要求。实际上遇到过不少“跑起来有误码、查了半天逻辑都没问题”的案例最后发现是参考时钟源抖动超标。另外每个Quad的QPLL是共享的如果一个Quad里4条lane跑同一个速率用QPLL最合适。如果两条lane速率不同就得用CPLL或者换Quad。这个在规划引脚分配的时候就要想好。4.2 收发数据通路设计要点以Xilinx Ultrascale为例100G Base-R的物理层数据通路大致是用户逻辑64bit或者512bit接口→ 64B/66B编码如果跑标准以太网→ 加扰 → 多通道分发4条lane→ GT TX接口 → 串行输出接收侧反之串行输入 → GT RX → 通道对齐lane deskew→ 64B/66B解码 → 解扰 → 用户逻辑如果只用PRBS做物理层测试可以跳过64B/66B直接把PRBS数据喂给GT的并行接口。这也是IBERT工具内部的实现方式。自定义测试逻辑时有一个踩过的坑必须提醒GT的并行数据接口位宽和时钟频率必须匹配。25.78125G的线速率如果内部并行位宽是64bit那么GT的用户时钟就是25.78125G/64 ≈ 402.8MHz。这个时钟频率已经不低了跨时钟域处理务必小心。如果觉得时序收敛困难可以选128bit位宽用户时钟降到约201.4MHz会从容很多。一个简单的PRBS发生器的核心代码逻辑如下Verilog示意仅做参考// PRBS31 generator, x^31 x^28 1 always (posedge clk) begin if (rst) lfsr 31h7FFFFFFF; else begin // 每次产生一个bit多bit时使用展开计算 feedback lfsr[30] ^ lfsr[27]; lfsr {lfsr[29:0], feedback}; end end实际工程里多bit并行PRBS生成需要用矩阵展开的方式Vivado提供了PRBS GeneratorIP可以直接参数化调用Xilinx Application Note比如XAPP884也有参考设计。除非是想练手否则不建议自己造轮子——PRBS虽然是线性反馈移位寄存器但并行展开后的逻辑很容易忽略相位关系导致自收自发没问题、对端就比对不上。4.3 IBERT与自定义误码统计怎么选调试和测试阶段工具会选择很关键。Xilinx的IBERTIntegrated Bit Error Ratio Tester集成在Vivado里通过JTAG可以直接配置GT、产生PRBS、统计误码、扫描眼图是前期调试的利器。但IBERT有一个局限它只测物理层不经过你用户的逻辑和PCS。你实际的业务可能还包含RS-FEC、以太网帧处理等。所以完整测试方案建议分两步走第一步用IBERT做物理层摸底确认GT配置无误、链路误码率满足要求短时间测试至少低于1E-12长时间测试更好。第二步在用户逻辑里集成自定义的误码统计模块加载真实的业务帧或者带包头的数据流做端到端验证。第二部的一个关键设计是加一个误码计数和告警寄存器。通过JTAG或者UART把误码数读出来调试时能随时看实时状态比用逻辑分析仪去抓信号高效得多。// 误码检测与统计简例接收PRBS与本地生成PRBS比对 always (posedge clk) begin if (data_in local_prbs) error_flag 1b0; else begin error_flag 1b1; error_cnt error_cnt 1b1; end end当然这只是最简单的示意真实的误码统计还需要考虑比特对齐bit slip和失步重同步的问题否则一旦失步误码计数器就会被淹没。一般做法是连续检测到多个错误位时强制进入重新同步流程重新搜索PRBS序列的边界。5. 光口物理层测试与信号完整性眼图、光功率与PCB细节调通了逻辑、跑通了PRBS只代表“电通”了。光口光口最终还是要落在光上。物理层的验证要做到心里有数光功率和眼图是两个最直接的手段。5.1 光功率测试与数字诊断QSFP28模块自带数字诊断功能通过I2C接口SFF-8636可以读到模块的温度、供电电压、偏置电流、发射光功率、接收光功率等。开发阶段我强烈建议在FPGA里复用I2C控制器把模块的诊断信息读出来串口打印到终端。这样调试时抬头就能看到发射光功率是不是在规格范围内比如LR4单通道典型值-2~3dBm。接收光功率是否高于接收灵敏度LR4接收端过载一般在4dBm左右灵敏度在-12dBm以下取决于具体模块。模块温度是否过高超过75℃就要警惕了。如果接收光功率是-18dBm甚至更低那大概率是光纤没插好、光口污染了或者对端没发光不用急着去翻FPGA逻辑。别小看这个排查顺序实际调试中我见过太多人对着误码计数器挠头结果发现是光纤跳线插错了口——回环的两个光口都接到同一根跳线上但TX和RX的极性搞反了。5.2 眼图测试用示波器看信号质量眼图是判断高速信号质量最直观的工具。测100G光模块的眼图需要高速采样示波器配上光口探头模块厂家一般是往模块的测试座里插光转电模块或者用模块自带的测试模式。眼图能看出来什么简单说眼高和眼宽眼开得越大信号裕量越足。交叉点位置NRZ信号的交叉点应该在50%左右偏移严重说明上升沿和下降沿不匹配通常是驱动电路的问题。模板MaskIEEE 802.3ba规范里定义了100G Base-R的光口发射眼图模板用示波器的模板测试功能可以直接判Pass/Fail。不过说实话在产线上或者现场调试不是所有人都有条件配高速示波器。这时候更实用的替代方案是用光功率计测平均光功率配合模块内部的“发射波形劣化”告警标志做粗判。如果平均光功率正常、模块也没有告警一般说明发射端基本正常。真正要精调信号质量那再上示波器。5.3 FPGA到光模块的PCB连接细节这部分是板级设计的范畴严格说属于测试环境的“前置条件”但测试中很多诡异问题恰恰是这里埋的雷AC耦合电容GT和光模块之间必须串联AC耦合电容一般用0.1uF的0402封装电容。位置靠近连接器一侧且不能有stub。差分阻抗100欧姆差分走线要严格控制同时注意换层时的过孔有没有足够的回流地过孔。连接器焊接QSFP28连接器是SMT封装引脚密集焊接不良会导致偶发断链。板卡打样回来建议先拿一台显微镜把连接器的引脚焊点和焊盘检查一遍。电源纹波光模块的3.3V电源纹波要控制在50mV以内最好用LDO或者低纹波的DCDC单独供电高速模块对电源噪声非常敏感。这中间还有一个老生常谈但总有人犯的错误高速信号线不要打过长的stub。在调试时如果想飞线量测信号尽量找过孔或者测试点去量不要随便焊根线上去——一根3cm的stub在25G速率下足以把信号质量毁掉。6. 常见问题排查与调试实录调试100G光口谁都会遇到几个让人脱发的问题。我把这段时间自己遇到的和同行交流中高频出现的问题整理了一下做成一个速查表现象可能原因排查方法和解决措施GT TX没有时钟输出参考时钟未起振、QPLL失锁先查参考时钟引脚波形再看QPLL lock状态寄存器链路无法建立Link失败GT极性反了、CDR失锁、光模块没发光检查RX极性配置读模块诊断寄存器确认接收光功率偶发误码信号劣化、电源噪声、模块温度过高看眼图调均衡参数测电源纹波改善散热只有上电初期有误码后面正常模块启动过程中CDR尚未锁定软件上增加链路建立延时等模块初始化完成再开始测误码误码计数持续增加光纤极性接反、光口污染用光纤清洁笔清洁确认TX-RX交叉连接长时间跑出现一次突发误码系统时钟抖动超标、板子热噪声检查时钟芯片加RS-FEC保护做长时间温循测试6.1 链路起不来的定位思路链路起不来是最棘手也最常见的。每次遇到我的排查顺序基本固定确认光模块通电并初始化完成I2C能不能正常读写模块的Reset是不是被拉住了模块的IntL/RxLos等管脚电平是否符合预期确认GT配置无误线速率、参考时钟频率、环路带宽这些参数。这里有个小技巧用IBERT去试它能自动扫描可以锁定的配置比一点一点试寄存器高效得多。确认光通路正常断开对端用光功率计在光口直接测有没有光。有光但收不到那问题在前向链路或者接收端没光那就直接锁定在模块或发送端和FPGA关系都不大了。确认极性PolarityQSFP28模块的lane极性不一定和PCB走线对得上做PCB时很容易因为差分对内两根线的正负交换导致整个link失败。好在GT和光模块都支持极性翻转在配置里把RX_POLARITY或者TX_POLARITY对应位置1就能翻转。这也是回环测试时第一个要排除的嫌疑。6.2 误码率高怎么一步步压缩范围误码率高的时候不要急着改逻辑按下面的思路来先分清是突发误码还是均匀误码。突发误码往往和电源噪声、时钟抖动有关均匀误码则偏向信号完整性不够。用IBERT把发射端和接收端分开测。只发不收看对端误码仪报多少只收不发看本地误码仪报多少。哪一个高就往哪边查。尝试调整GT接收端的均衡参数RX Equalizer包括LPM和DFE设置。Xilinx Vivado的IBERT里可以直接调这些参数并实时观察误码率变化非常方便。检查FEC有没有使能。100G KR4/CR4的RS-FEC(544,514)可以纠错t15个符号如果你的系统对误码率要求极高比如1E-15量级FEC几乎是必须的。但要注意FEC会引入约十几纳秒的时延同时对随机均匀噪声的纠错能力有限链路本身如果质量太差FEC也救不回来。最初我们板子上跑PRBS31短时间测试误码率在1E-12左右看着还行但长时间跑就开始偶发误码后来一查发现是QSFP28连接器的电源Pin接触不良导致模块供电电压不稳定。把连接器重新固定好之后问题彻底消失。所以说什么高级的配置都不如先把基础可靠性做好。6.3 散热与功耗一个容易被忽视的隐形杀手100G光模块功耗高发热量大尤其是在密闭的机箱里长时间跑老化测试。模块本身有温度保护功能过温会主动关断激光器表现就是跑到一半光口突然没光了模块温度寄存器一看90多度。如果遇到这种问题先不要怀疑FPGA逻辑先把散热做好确保模块的散热片贴合到位散热器到模块顶面之间导热垫是不是够厚风道是不是合理模块位置有没有被其他热源烤到把模块的Temperature寄存器值打印出来持续监控超过85℃就要警惕。我自己在调试中踩过一个坑测试机箱里的风扇转速是自动温控的板子在机箱外调试时模块温度才五十多度很正常一旦塞进机箱、周围还有别的板卡温度直接飙到九十多度光模块自动关断链路断了当时还以为是软件逻辑有Bug。后来在I2C诊断里加了温度告警打印一眼就抓到问题了。6.4 时钟与复位FPGA逻辑的命门最后再提一个通用但也最容易被忽略的GT的复位顺序和用户逻辑的复位释放时机。Xilinx的Transceiver IP会生成一个完整的复位控制器逻辑核心的原则是TX复位必须先完成直到TX Reset Done拉高才能开始RX复位收发通路都就绪后才能释放用户逻辑的复位开始数据收发。如果这个顺序不对会出现一种很诡异的现象有时上电能跑有时不能偶尔链路断了就再也起不来。实际排查中可以在Vivado里观察GT的状态寄存器如TXRESETDONE、RXRESETDONE确认每个阶段是否就绪再对照IP的复位时序图找差异。调试中为了快速恢复现场我给板子做了一个“软复位”按钮逻辑按一下按键就把所有GT和PCS逻辑复位一遍重新走初始化流程。这个小功能在频繁调参数的时候非常管用不用反复重新上电节省了大量等待时间。7. 实操体会与后续扩展最后说点个人在实际项目中的经验总结。100G光口的FPGA测试看着门槛高其实拆解开就是一层一层剥洋葱先解决逻辑再解决电压最后才是光信号的验证。很多人一上来就扎进GT配置和PRBS代码里反而忽视了回环级别设计、时钟、连接器这些基础工程问题结果绕了大弯。我现在的调试顺序基本固定为上电先读光模块诊断信息再跑IBERT做物理层扫描确认每条lane的误码底数误码底数达标后再加载用户逻辑做端到端PRBS或者业务流量测试最后才做长时间老化加余量分析。每一步都有真实的数据和记录支撑出了任何问题都能串起来排查。另外一个体会是好的测试工具和测试方法能省下你一半的调试时间。IBERT、I2C诊断脚本、软复位逻辑、误码计数寄存器和串口打印这些东西加起来可能只占了整个工程的小部分工作但它们的价值远高于花大块时间写的业务逻辑。毕竟对测试来说创造稳定可控的环境比堆功能重要得多。如果你后续要继续往这个方向深入可以从这几个点着手尝试自己实现完整的100G Ethernet PCS逻辑64B/66B RS-FEC替代Xilinx的硬核IP这个过程对协议理解的提升非常有帮助还可以探索PAM4单波长的100G光模块比如100G DR1/FR1那是另一个物理层方向GTM收发器和均衡策略和NRZ完全不同会是不错的进阶课题。