100G光口测试这件事,放在几年前还是数通大厂验证团队的专属领域,但这两年随着数据中心和AI集群的爆发,FPGA工程师碰100G光模块的机会越来越多。我接手过的项目里,有做交换机线卡的、有做加速卡的、还有做专用测试仪表的,几乎都绕不开光口这一关。这期就把我在FPGA上做100G光口/光模块测试的完整实例写出来,从硬件构架到测试流程再到踩坑记录,一次性讲透。先说我做这个项目时的基本盘:主控FPGA用的是Xilinx UltraScale系列的VU9P,光模块是QSFP28封装的100G SR4,协议层没上完整的MAC/PCS,而是用GTY收发器直通模式,配合自定义的PRBS检测逻辑做误码测试。这套组合在实验室验证阶段很常用,既能把光模块和PCB通道的问题暴露出来,又不用一开始就被复杂协议栈拖住。1. 100G光口/光模块的硬件基础与架构拆解1.1 先搞清楚100G光模块到底长什么样100G光模块目前最常见的封装就是QSFP28,四通道小型可插拔,电口侧是4路25.78125Gbps NRZ信号,光口侧根据传输距离和波长不同,又分成SR4、LR4、CWDM4这些子类。SR4是短距离多模,4路850nm并行,靠MPO光纤连接器,传输距离一般在100米以内;LR4是单模1310nm波长,4路LAN-WDM波长复用进一根光纤,能到10公里甚至更远。从测试的角度看,封装和光口类型决定了你的测试工装和光纤跳线怎么选。SR4用MPO-12公头跳线,LR4用LC双工跳线,插错是插不进去的,但买错跳线会浪费大量时间。我的习惯是,项目一开始就把光模块型号、光纤类型、连接器规格列一张表,贴在工作站前面,这比靠脑子记靠谱得多。另外还有一个容易被忽略的点:100G光模块的电口是38引脚边缘连接器,信号速率25Gbps,对连接器的插拔次数和清洁度非常敏感。换模块的时候,手不要摸金手指,插拔前要确认模块卡扣完全打开,否则很容易顶坏PCB上的笼子。1.2 FPGA里哪些资源在负责100G收发FPGA处理100G光口,核心是高速串行收发器。VU9P上的是GTY,线速率能跑到30Gbps以上,25.78125Gbps对它来说留有余量。GTY收发器内部集成了PCS(物理编码子层),但很多测试场景下我们倾向于把它配置成直通模式,也就是不启用8B/10B或64B/66B编码,直接收发原始比特流,让PRBS数据原封不动地穿过去。为什么这么干?因为光模块测试的核心是验证物理通道,而不是协议正确性。如果跑完整的以太网MACRS-FEC,出问题的时候你要花大量时间区分是MAC层逻辑错误、FEC纠错能力不足、还是真正的信号完整性问题。直通模式一步到位,直接把误码率测出来,信号好不好一目了然。GTY收发器在UltraScale里以Quad为单位分组,每个Quad包含4个收发器(GTY)、一个QPLL和一个CPLL。100G用4个GTY,我建议用同一个Quad里的4个通道,因为它们共享QPLL,时钟同源,对测试结果的干扰因素就少了一个。1.3 光模块内部不止有激光器,还有一颗小MCU这一点很容易被FPGA工程师忽略。100G光模块内部除了光收发组件(TOSA/ROSA)、驱动芯片(Driver)和跨阻放大器(TIA),还有一颗MCU或者说控制芯片,负责DDM(Digital Diagnostic Monitoring)功能——监测模块温度、供电电压、激光器偏置电流、发射和接收光功率。这颗MCU通过I2C接口和外部通信,地址一般是A0h和A2h。A0h地址空间存的是模块基本信息(比如型号、序列号、速率能力),A2h地址空间存的是实时监控数据。我在测试中遇到过模块激光器老化导致发射光功率掉到阈值以下的情况,如果不读DDM,误码率测试根本测不过去,还以为是FPGA逻辑问题。所以100G光口的FPGA测试,不光要测数据通路,还要顺带写一段简单的I2C Master逻辑去读模块的DDM寄存器。最低限度,你至少要能读到模块温度、Vcc、Tx功率、Rx功率这四项,不然你连模块工作状态正不正常都不知道,后面排查问题就是盲人摸象。2. FPGA测试方案的整体设计与关键抉择2.1 方案选型:为什么从直通模式开始而不是直接上完整协议做100G测试,第一个要决策的问题就是:数据面怎么跑?我看到很多新手上来就想跑完整的10G/25G/100G Ethernet MAC,理由是更贴近真实业务。这个想法本身没错,但在光模块测试这个场景里,过早引入协议栈是给自己挖坑。直通模式的优势在三点:第一,逻辑简单,你只需要把GTY配置好,然后从TXD引脚灌PRBS数据,再从RXD引脚收回来比对;第二,故障定位快,误码了几乎可以锁定在物理层;第三,GTY自带的PRBS生成和校验逻辑是硬核,不占FPGA逻辑资源,跑起来非常稳。等你把直通模式下的误码率刷到1E-15以下了,再往上叠以太网MAC、FEC、PTP这些,每一步都有独立的测试基线,出问题了也知道是哪一层引入的。我的经验是,这种由底向上的验证顺序,能省掉至少一半的调试时间。2.2 时钟架构:100G测试里最容易翻车的环节100G直通测试的时钟设计是我每次都要反复强调的点。GTY收发器需要一个高质量的参考时钟,100G应用通常用156.25MHz或161.1328125MHz。前者对应25.78125Gbps,后者对应25Gbps(不严格匹配100G以太网速率)。这里有个关键点:光模块和FPGA之间的链路速率是由参考时钟决定的。你用156.25MHz做参考时钟,GTY内部通过PLL倍频到25.78125Gbps,这是100G以太网的标准速率。如果参考时钟的频偏超过±100ppm,光模块接收端的CDR(时钟数据恢复)就可能失锁,或者误码率飙升。我踩过的一个坑:当时图省事,用了一块普通的开发板上的可编程时钟芯片,默认配置输出156.25MHz,但没注意它内部PLL的环路带宽很宽,抖动大,结果25G信号眼图闭合严重,误码率一直压在1E-9下不来。后来换成专用的低抖动时钟芯片(比如Si534x系列),同样的板子,同样的光模块,误码率直接刷到1E-15。时钟抖动对高速串行链路的影响,怎么强调都不过分。另外还要注意:QSFP28模块的参考时钟是FPGA侧提供的,模块自身会根据接收到的信号做CDR,不需要额外供给。这个和10G时代有些模块需要独立时钟不一样,别搞混了。2.3 测试拓扑设计:从内回环到外回环的进阶路线100G光口测试,不能上来就插光纤跑,要分几步走。第一步,先把GTY配置成内部近端回环(Near-End PMA Loopback),这时候信号从发送端直接回到接收端,完全不经过PCB走线和光模块,用来验证FPGA配置和时钟是否正常。第二步,做远端回环(Far-End PMA Loopback),信号经过PCB走线到QSFP28笼子,通过一个回路测试夹具返回,这时候PCB走线的信号完整性就进来了。第三步才是插上真正的光模块和光纤,做光口回环测试。这个分级递进的思路,说白了就是把变量一个一个加进来,哪一步出问题就锁定哪一部分。实际测试中,我见过太多人上来就插光纤,误码了根本不知道是FPGA的问题、PCB走线的问题、光模块的问题还是光纤的问题,白白浪费半天时间。光纤回环还有一种做法:如果是SR4模块,用一根MPO跳线把发射端和接收端对接,光信号从发射口出来直接进接收口。注意MPO跳线的极性,有Type A、Type B、Type C三种,SR4模块回环要用Type B(也就是收发错位交叉的极性),插错了收端是没有光的。3. 100G光口测试的实操过程与关键步骤3.1 硬件连接与上电检查清单先把硬件连接这一步走扎实。我用的是标准流程,每一步都有检查点:第一步,确认板卡断电,插入QSFP28光模块,听到卡扣咔哒一声才算到位。第二步,接上MPO光纤跳线。SR4的MPO-12有12芯,4发4收4备用,注意插头和模块端面的清洁,建议用专用的光纤端面清洁笔先擦一遍再插,灰尘是光口误码率的第一大杀手。第三步,上电后先不要加载FPGA配置,先用I2C扫描确认光模块是否正常上电。读一下A0h地址前几个字节,能读出模块型号说明I2C通信正常。第四步,确认模块的TX_Disable引脚是低电平,如果被拉高了,模块是不会发光的。很多板上这个引脚是通过FPGA GPIO控制的,FPGA没配置之前是默认高,所以你这会儿读DDM会看到Tx功率为0。第五步,读DDM寄存器确认模块温度、Vcc、Tx/Rx功率都在正常范围内。发射光功率一般在1-3mW左右(对应0到5dBm),接收光功率在SR4合格范围内(一般灵敏度在-7dBm左右,但光功率过高或者过低都不行)。如果Rx功率读出来是-40dBm以下,基本可以判断收端没光,先查光纤极性。3.2 GTY收发器配置与IBERT初测配置GTY的方式有很多,最快速的方式是用Xilinx的IBERT(集成误码率测试)参考工程。在Vivado里创建IBERT核,选择你用的GTY所在Quad,设置线速率25.78125Gbps,参考时钟156.25MHz,然后把其他通道都打开,生成bitstream下载到板子。IBERT用起来非常直观,你能在Hardware Manager里直接看到每个通道的收发眼图、误码率、CDR锁定状态。我的建议是,先把4个通道全部跑一遍TX/RX扫掠测试,确认每个通道都能建立链路并且误码率为0,然后再挂长时间测试。要特别说一句:IBERT做的是FPGA内部PMA环回或者通过光模块实际链路测试,它不经过用户逻辑。如果你后续要跑自己写的PRBS测试逻辑,IBERT是通过性测试,不是最终验收,别把IBERT的零误码当成整个系统的零误码,那是两码事。3.3 自定义PRBS测试逻辑的实现要点IBERT验证完之后,该上自己的测试逻辑了。我一般这样设计:发送端,用GTY的TX User Data接口,在直通模式下,自己写一个PRBS31生成器,把生成的伪随机序列灌给TX。GTY内部有硬核的PRBS生成/校验器,但如果你要精确控制注入时机(比如插入错误、统计错误注入后的误码),就自己用LFSR实现一个。接收端,用GTY的RX侧加上PRBS校验器,把收到的数据和本地产生的PRBS序列做逐bit比对,任何一个bit不匹配就加1。同时,用计数器统计总接收字节数和错误字节数,计算误码率。一个很容易踩坑的细节:PRBS序列的同步问题。接收端要先把PRBS序列对齐,才能做逐bit比对。一般的做法是先搜索同步头(PRBS31虽然不像PRBS7那样有特殊图案,但可以通过滑动比较找到对齐点),或者利用GTY内部PRBS校验器的锁定指示。我的建议是直接用GTY自带的PRBS逻辑做统计,然后用自己写的错误注入寄存器配合测试,两套逻辑配合起来,既能测误码率,又能验证错误检测逻辑本身是否正常工作。另外,测试时长怎么定?根据误码率置信度公式,比如你要验证误码率优于1E-15,以25G速率算,至少需要连续跑25G x 1E15 2.5E16个bit,换算成时间大概是277小时,这个在项目交付测试里是等不起的。工程上常用的做法是,在1E-15误码率指标下跑15分钟,如果零误码,可以认为误码率在95%置信度下优于约3E-16;如果跑1小时,置信度更高。具体用多大的门限,取决于你的项目验收标准,我一般会提前和客户确认这个。3.4 眼图测试与信号完整性评估除了PRBS误码率,100G光口测试还有一项重要内容:眼图测试。FPGA内部GTY能提供接收端眼图扫描功能,你可以通过IBERT或者Vivado的Hardware Manager看到每个RX通道的水平眼宽、垂直眼高和浴缸曲线。但GTY内部眼图只能看到FPGA接收端经过CTLE/DFE均衡之后的效果,不完全等同于光模块接收端的光眼图。如果你要看真正的光眼图,需要外接高速示波器(带宽至少25GHz以上)配合光探头。我在规模大的项目里,会专门安排一次光眼图一致性测试,确保光模块本身发射的TX光信号眼图满足IEEE 802.3bm的规范要求——消光比大于3dB,眼高/眼宽满足模板要求。对于实验室日常验证,靠GTY内部的BER扫描和眼图功能就够用了,不需要每次都上示波器。但有一点要注意:GTY眼图的横轴时间单位是UI(Unit Interval),25G速率下1UI约等于38.8ps,如果水平眼宽低于0.5UI,链路的余量就偏小了,应该警惕。4. 常见问题与排查技巧实录4.1 链路无法建立Link的排查顺序100G光口测试最让人头大的问题是链路建立不起来。我的排查套路是这样的:第一步看光模块的LOS(Loss of Signal)状态。读DDM的RX LOS寄存器位,如果置1说明接收端没光,查光纤连接、查对端是否发光、查MPO极性。如果LOS为0,说明有光进来,电源调制成信号也基本没问题。第二步看接收光功率是否在灵敏度范围内。光功率过高(比如短距离SR4插了很短的跳线,加上模块发射光功率偏大,接收端过载)或者过低都不行。SR4过载光功率大约2.4dBm,接收灵敏度一般在-7.3dBm左右,超出这个范围都可能导致CDR失锁或者高误码。第三步看GTY接收端的CDR有没有锁定。如果没锁定,用IBERT扫一下参考时钟的频率偏差,有时候是参考时钟和线速率不匹配,或者时钟芯片配置错了。另外,CDR锁定需要一定时间,不能只看一上电的瞬间状态,等几秒再观察。第四步看GTY的RX极性配置。光模块的TX和RX通道在PCB上可能交叉走线,这时候需要在GTY配置里对某一对通道做极性翻转(Polarity Invert),否则无论如何也联不通。注意是所有4对通路都要检查,不要只查一对。4.2 误码率异常偏高的原因定位链路能通,但误码率居高不下,这是第二个高频问题。排查思路也是分层进行:先从光模块本身查起。读DDM看发射光功率是否异常、模块温度是不是过高。QSFP28模块的壳温一般在70度以下是安全的,如果超过85度,误码率会急剧恶化,这种情况多半是散热没做好或者模块本身有问题。然后看光纤。SR4多模光纤如果弯折半径过小(小于30mm),损耗会暴涨,用光功率计测一下实际接收光功率和模块的Rx功率比对一下,看差值是否在合理范围。再看FPGA侧的信号完整性。如果RX侧抖动过大,试试调整GTY的CTLE和DFE设置。Xilinx在IBERT工具里提供了一键均衡优化功能,可以自动扫参数找最佳值。有时候只是某个通道的走线比较长,单独把那个通道的均衡加强一下就能解决。最后,别忘了看共模问题。多通道并行传输时,如果有某个通道的误码率明显比其他通道差,很可能是PCB上相邻通道的串扰或者电源噪声。这时候可以用GTY的收发通道置换功能,把FPGA逻辑到物理通道的映射调换一下,如果误码跟着通道走,说明是物理层的问题;如果误码跟着逻辑走,说明是FPGA逻辑的配置问题。4.3 误码率测试里比较隐蔽的坑这里分享几个我实际踩过、且不太容易被发现的坑。第一个是GTY的TX预加重设置不当导致的假误码。发送端的预加重(Pre-emphasis)和去加重(De-emphasis)参数没调好,会让信号边缘过冲,接收端均衡再怎么调都救不回来。用IBERT自动优化功能跑一遍,别自己手调,手调经常越调越差。第二个是参考时钟走线问题。我遇到过一块板子在常温下测试零误码,温度一升到60度,误码率飙到1E-7。后来发现是参考时钟的电源滤波做得很差,温度升高后时钟芯片的输出抖动恶化,直接传导到了高速链路。这类问题单靠改配置是解决不了的,得改板子,但至少你要能定位到根因。第三个是MPO光纤跳线的插损不均匀。有时候4条通道里某一条特别差,是因为那条光纤通道上有个很小的弯曲,肉眼看不出来,但光学损耗已经超了。遇到单通道误码率明显偏高,先换一根跳线试试,成本最低的排查手段往往最快见效。第四个是光模块的Bit Error Rate测试需要避免错误区块的误解。PRBS31序列里有连续长0和长1的情况,CDR在这些长串连续bit里可能暂时失锁然后重新同步,如果PRBS校验逻辑不够健壮,可能把正常的数据流误判成错误。这个坑比较深,如果你刚写完PRBS校验逻辑,建议先用GTY自带的PRBS硬核对一对结果,保证自己的逻辑没写错。4.4 测试数据的整理与分析维度100G光口测试做完了,数据整理也是一门学问。我自己的习惯是每一轮测试都记录下面这些维度:测试环境:室温、模块序列号、光纤跳线编号、FPGA型号、Vivado版本、GTY配置文件名光模块状态:模块温度、Vcc、Tx功率、Rx功率,这四项从DDM里读出来误码统计:测试时长、总bit数、错误bit数、计算出的误码率链路余量:GTY扫描得到的水平眼宽、垂直眼高、DFE tap值同一组参数至少重复测三次,取最差记录作为结果。如果误码率表现是有错误但不稳定,不要简单归因为“偶发误码”,这个问题背后往往隐藏着电源噪声、参考时钟抖动等系统性问题,不查清楚就贸然流向下一阶段,后面叠加上完整协议栈会更难定位。我通常还会做一组“温度应力测试”:用电吹风或者恒温箱把模块温度加热到75度左右,跑15分钟,看误码率有没有恶化。温度是光模块的第一敏感性因素,通过这个测试能大致了解模块的余量等级。5. 测试结果评估与项目验收经验5.1 怎么才算通过了100G光口测试很多刚从10G转100G的工程师最关心的问题是:误码率到什么水平才算合格?我整理了一个常见的验收参考门槛:测试场景推荐误码率指标测试时长建议说明直通模式(不经过协议层) 1E-15≥ 15分钟零误码时置信度较高路过PCB走线无光模块 1E-15≥ 15分钟主要是验证通道信号质量经过光模块SR4短光纤 1E-12≥ 30分钟光模块本身有额外抖动经过光模块LR4长距离光纤 1E-12≥ 60分钟长光纤链路余量更紧完整以太网协议RS-FEC 1E-15(以FEC纠错后为准)≥ 24小时最终系统验收注意:FEC里有个预纠错门限的概念。100G以太网用RS-FEC(544,514),它的净编码增益大约是5.5dB左右,也就是说线路误码率在1E-6以下,经过FEC之后可以纠到1E-15或更好。如果你的光链路误码率始终压在1E-7上不去,但FEC能完全纠掉,产品能用;但对测试而言,这个链路余量是不够的,迟早会在温度变化或其他干扰下翻车。5.2 影响测试结果的环境变量100G光口测试对环境的敏感度远超10G时代。同一块板子、同一个模块,在不同的温湿度、不同的电源纹波条件下,测试结果可能差一个数量级。温度的影响前面说过了,不再重复。功耗链路也不能忽视:QSFP28模块的供电电流最大能到3.5A甚至更高,如果模块供电电压掉到3.135V以下,激光器驱动芯片会出现异常,产生突发误码。我给模块供电的DC-DC电路,建议做一下负载阶跃测试,确保模块发射功率突变时电压跌落在允许范围内。静电也是大敌:光模块插拔时如果不做防静电措施,轻则造成模块的I2C通信异常,重则损伤FPGA的GTY引脚。实验室最好配防静电手环和防静电桌垫,别嫌麻烦,我见过不止一块板子的GTY bank被静电打坏,只能返修。5.3 从测试到量产确认的几件小事最后聊几句从实验室测试走向量产的过渡经验。实验室里你能接受的条件和产线上完全不一样。产线上不可能给你一台IBERT扫描一小时,那么关键测试项就要提前固化下来。我通常会在实验室阶段就把产线测试方案想好:第一,把PRBS31测试逻辑固化在FPGA里,产线直接下载bitstream;第二,把I2C读取DDM的逻辑也加上,产线通过上位机脚本直接读模块的收发功率;第三,统计误码率后自动判定PASS/FAIL,阈值按批次量测数据的均值减去6个标准差来定,避免人为拍脑袋。这部分的经验是:别等实验室测试全做完了才去考虑产线测试,那是很多项目延期的主要原因。从FPGA测试一开始,就想着这个项到了产线能不能复用,能节省不少重复开发的成本。6. 后续扩展方向与我的个人体会100G光口的FPGA测试做完之后,后面还有不少扩展空间。比如从100G到200G/400G,FPGA的GTY升级为GTM(GT Speed级),调制方式从NRZ演变为PAM4,测试方法论要有大变化——PAM4信号的眼图有三个眼,误码率测试要用到FFE和MLSD等均衡算法,这些和100G时代完全不是一回事。还有一个方向是往协议栈上走。光模块测试通过之后,下一步就是把100G以太网的MAC、PCS、FEC全部跑起来,这时候你先前积累的直通模式测试基线会非常有用:如果完整协议栈出问题,你能很快判断是协议逻辑问题还是物理层本来就有隐患。我个人在实际操作中的体会是:100G光口测试说到底是分层排查的艺术。每个层次都有自己的测试工具和方法论,把每一层的测试做扎实、留下可对比的数据,后面越走越顺。如果只是插上光纤、看看误码率、差不多就行,那到了产线或者外场,遇到问题你根本没有可追溯的抓手。最后再分享一个小技巧:每次测试前,把光模块的DDM数据打印出来存一份。这组数据是后续排查问题的金标准——当你发现误码率异常时,翻出之前同一模块的DDM记录,能快速判断是模块劣化、光纤污染还是环境变化导致的。做测试的,手头数据越全,心里越有底。