
最近在推进一块基于ADRV9025的射频收发板卡时节奏被JESD链路卡了一周。板子回来后FPGA和ADRV9025之间的SERDES通道看上去都能正常初始化可一到采集数据就出现断续噪声时有时无怎么查都悬在空中。后来沉下心做了一轮系统的PRBS测试才把物理层问题从协议层问题里彻底剥离开。这篇把这次实战的经验整理出来尤其是PRBS测试模式从配置到排查的完整流程希望能帮到正在跟ADRV9025这类高速SERDES接口较劲的朋友。在开始之前先明确这篇内容的适用人群如果你在做射频收发板卡、软件无线电平台或者单纯被JESD204B/C链路搞到头大这篇文章适合你。我会从SERDES物理层的基础认知讲起然后拆解PRBS测试的原理、配置路径、完整实操步骤最后给出一份我踩坑后整理的问题速查表。懂底层的人可以直接跳到第三节新手建议从第一节开始看很多坑其实从基础知识开始就埋下了。1. 先从链路层说起ADRV9025的四路SERDES到底在传什么1.1 SERDES接口的本质是一套“串行快递系统”SERDES的全称是Serializer/Deserializer说人话就是把一堆并行数据在发送端串行化塞进一对差分线里高速传出去到接收端再还原成并行数据。ADRV9025内部集成了四条这样的收发通道每条都由一个发送端和一个接收端组成术语叫SERDES lane或GT lane。和FPGA对接的核心物理介质就是PCB上这四对发射差分走线和四对接收差分走线。那这四条lane传的是什么协调好之后它们承载的是JESD204B或JESD204C协议帧。JESD协议的核心作用是把ADC采集到的IQ采样点和DAC要输出的IQ采样点按时钟和帧结构封装好通过SERDES送到FPGA或者从FPGA接走。你可以把SERDES理解成快递运输车而JESD就是包裹上必须贴的快递单和装箱规则。没有运输车包裹运不过去只有运输车而不会装箱收货方照样看不懂包裹里是什么。在ADRV9025的典型系统里FPGA一侧的GT收发器Xilinx叫GTX/GTH/GTYIntel叫Transceiver就是这条运输通道的接收端。开发者的任务不仅是要让运输车有电跑起来还得保证包裹里的货物被正确拆出。而PRBS测试恰好就是用来专门检查“运输车跑没跑偏”的跟包裹长什么样无关。1.2 JESD204B/C协议里几个绕不开的名词JESD协议对新手来说是有点劝退的这里我把自己当初卡住的名词串一遍M转换器数量。ADRV9025是四通道收发器所以通常M4但也可以拆成2个或1个通道的配置。LSERDES lane数量。一般系统会用L4即一条lane传一个收发通道的数据后端带宽不足时也用L2或L8。F每帧包含的字节数JESD204B下F是一个关键参数通常根据线的数据速率来定。K每个多帧的帧数常用值32或64。K决定了多帧边界也直接影响SYSREF采样时刻的确定。S每个转换器每帧的采样数。子类Subclass 0无确定性延迟Subclass 1用SYSREF实现确定性延迟。ADRV9025实际调试中用的基本都是Subclass 1。LMFC本地多帧时钟是整个确定性延迟机制的锚点。这些参数两两之间还有约束关系数据速率、lane速率、F和K必须匹配不是随便填的。如果你对JESD配置不熟强烈建议先用ADI官方的TESTransceiver Evaluation Software生成一组可行的配置再下手手动改参数很容易把自己绕晕。1.3 为什么ADRV9025要坚持用SERDES而不是LVDS早年ADC送给FPGA的数据大多是并行LVDS几十根数据线加随路时钟PCB布线像蜘蛛网而且数据速率一旦超过1Gbps信号完整性就开始翻车。SERDES把一切变成高速差分串行所需引脚数大幅减少而且通过CDR时钟数据恢复技术不需要严格等长的随路时钟布线PCB设计自由度大得多。代价是什么代价是SERDES链路的调试难度远高于并行接口。并行LVDS只要保证建立保持时间SERDES则需要关注均衡、预加重、CDR锁定、抖动、参考时钟质量、码间串扰等一堆指标。这也是为什么PRBS测试成为这个领域不可跳过的环节——它是一把专门给物理层“体检”的手术刀。2. 为什么PRBS测试是物理层调试的第一道关卡2.1 把物理层和协议层分开是调试效率的分水岭曾经我有个习惯遇到JESD链路不上数第一反应就是查协议配置FMFS、LMFC、SYSREF各种寄存器翻来覆去调结果有时能好有时又坏状态不透明像在猜谜。后来一位经验丰富的同事跟我说了一句话你连物理层是不是干净的都还没验证凭什么让协议层背锅这句话点醒了我。JESD链路是典型的“物理层协议层”叠罗汉结构物理层SERDES差分信号质量、阻抗连续性、参考时钟质量、收发器端接、CDR锁定、均衡器设置。协议层JESD帧结构、码组同步、多lane对齐、SYSREF采样、确定性延迟。协议层是盖在物理层上的房子。物理层隔振不稳协议层的同步就时断时续表现出来就是数据偶发错乱或者干脆不同步。PRBS测试的价值在于它能绕开复杂的协议栈直接在SERDES物理层上打一组伪随机序列用对端校验器检查每一位的正确性。物理层通不通PRBS结果一锤定音。2.2 PRBS7、PRBS15、PRBS23、PRBS31分别怎么选PRBS即伪随机二进制序列不同阶数的生成多项式不同序列长度和数据翻转特性也不同。我实测下来选型的核心逻辑是线速率越高、通道越拥挤越需要用高阶PRBS来制造更接近真实数据的翻转密度。PRBS7序列长度127bit直流分量低主要用来做快速的功能验证适合不超过5Gbps的低速链路。缺点是低频成分少对通道的低频衰减不敏感。PRBS15长度32767bit比PRBS7包含更丰富的低频分量对通道的基线漂移更敏感。实测中常用于3.125Gbps到10Gbps的链路。PRBS23长度8388607bit频率成分更接近真实业务数据适合10Gbps以上的链路。PRBS31长度超长几乎完全模拟真实数据的随机特性用于25Gbps以上的高端链路。ADRV9025的SERDES最高线速率能到24.75Gbps接近这个速率时PRBS31更可靠。实际选多少我给的判断标准很简单能跑更高阶就跑更高阶如果高阶PRBS误码率上不去再退到低阶分段排查。这跟网络链路测试时从Ping小包转到大包是一个思路。2.3 ADRV9025的PRBS测试“测试点”在哪ADRV9025的SERDES核心部分集成了PRBS生成器和误码校验器。测试数据流的路径一般有两种ADRV9025发PRBSFPGA收PRBS由ADRV9025的SERDES TX输出指定阶数的PRBSFPGA侧GT里用IBERT或者Transceiver Toolkit接收并校验。FPGA发PRBSADRV9025收PRBSFPGA的GT PRBS发生器驱动数据ADRV9025的PRBS校验器检查并报告错误数。如果把系统改成ADRV9025内部数字环回PRBS从TX出去再直接回到RX这种模式主要用于排除外部PCB走线问题确认芯片自身工作正常。日常调试中我习惯先做芯片内部环回再做FPGA到ADRV9025的对外链路测试一层层剥洋葱定位速度非常快。3. ADRV9025 PRBS测试模式的配置路径与实现细节3.1 代码层面利用ADI API快速预览功能ADRV9025系列芯片的底层驱动在ADI的mykonos库中API函数命名基本都以MYKONOS开头。和PRBS相关的核心接口常见的是int32_t MYKONOS_enablePrbs(mykonosDevice_t *device, mykonosPrbs_e prbsConfig, uint8_t enable);其中prbsConfig参数可以设为PRBS7、PRBS15、PRBS23、PRBS31等。enable设为1表示使能PRBS发生器设为0表示切回正常收发模式。如果走API流程实际调试步骤我会按下面这个顺序做可以少走弯路先通过SPI或USB验证芯片ID确保驱动对象初始化正确。调用MYKONOS初始化函数载入需要的JESD链路参数profile。将SERDES置于PRBS模式并选择阶数ADRV9025会把PRBS数据源直接接入SERDES TX路径。在FPGA端配置对应的PRBS校验码型起捕获。测完置PRBS失效确保不影响后续正常JESD初始化。这里要特别提醒PRBS测试阶段JESD协议不一定同步。因为PRBS数据在物理层上直接发送不包含JESD帧同步信号所以不能等JESD link up再去测PRBS这两个阶段是分开的。我在最初调试时总想着让整条链路全部起来再捅PRBS结果PRBS和JESD同步混在一起出问题根本分不清哪层。3.2 寄存器层面API覆盖不到的残局怎么破有经验的开发者会告诉你API函数虽然能用可真到板卡异常时往往需要直接操作寄存器来确认底层状态。ADRV9025的寄存器映射比较复杂不同版本的驱动和固件地址有差异这里不贴具体地址出来否则容易误导你但给出通用的定位方法在ADI官网下载与你的芯片版本完全对应的Register Map手册。用TES工具连接板卡后可以直接内窥寄存器视图找到SERDES TX/RX的PRBS配置位。重点查看这几类寄存器PRBS模式选择位、误码计数清零位、误码计数状态位、SERDES PLL锁定状态位。误码率结果通常以计数器的形式放在状态寄存器中可以在TES里持续刷新观察。我在现场调试时会同时开着TES的寄存器视图和FPGA端IBERT界面对比两边看到的误码行为定位效率翻倍。只盯着FPGA一侧有时候会漏掉ADRV9025内部PLL失锁导致返送误码信号的情况。3.3 测试拓扑怎么搭信号往哪边流PRBS测试的拓扑直接决定了你能验证哪一层的完整性。先说三种常见的拓扑拓扑信号路径能验证什么典型适用场景芯片内部环回ADRV9025 TX - 内部路径 - ADRV9025 RX芯片SERDES内部逻辑、PLL、CDR基本功能板卡刚上电怀疑芯片硬件有问题芯片TX到FPGA RXADRV9025 SERDES TX - PCB走线 - FPGA GT RX发送侧物理链路和FPGA接收端信号完整性数传方向调试、DAC通路验证FPGA TX到芯片RXFPGA GT TX - PCB走线 - ADRV9025 SERDES RX接收侧物理链路和ADRV9025接收端信号完整性ADC通路调试、回读路径验证开发中我会优先做一次“芯片内部环回”如果内部环回都报误码说明问题在芯片配置或芯片本身板卡走线先放一边。内部环回干净了再连FPGA做外部测试这时出现的误码大概率是PCB布局布线、参考时钟、连接器质量等物理因素导致的。4. 全流程实操从SPI初始化到误码判定的完整记录4.1 实操环境与准备清单先说这次调试的环境。主控FPGA用的是Xilinx UltraScale平台板卡上的ADRV9025通过SERDES差分对连到FPGA的GTH bank。系统时钟配置为122.88MHzJESD204C模式下工作的线速率为9.8304Gbps。软件环境主要是Vivado 2021.2和ADI的mykonos库、以及Xilinx IBERT IP核。动手之前我建议你准备齐全以下东西省得测试中途到处找一台能稳定连接SPI/USB的电脑提前装好ADI TES软件。示波器带宽至少达到线速率的三倍和至少两根高质量SMA线缆。Xilinx IBERT或者Intel Transceiver Toolkit授权和工程模板。一份完整的ADRV9025寄存器手册或驱动文档。板卡原理图里关于SERDES走线长度、参考层、耦合电容的位置截图。4.2 第一步先确认SERDES PLL锁相是否成功很多朋友一上来直接跑PRBS结果报一大堆误码然后开始怀疑PCB。我的习惯是第一步先看锁相状态。在ADRV9025侧可以通过API函数或直接读寄存器确认SERDES发送和接收PLL的锁定标志位。在FPGA侧IBERT工具启动时会自动检查GT参考时钟并显示PLL locked状态。两侧都锁定了PRBS测试才有意义。否则连发送时钟都没生成测出来的“误码”根本不是误码。这一步发现问题的典型场景是只有一个固定线速率锁不住换一个线速率就正常。这时候优先查参考时钟尤其是时钟源是内部VCO还是外部晶振、时钟芯片的寄存器配置是否和SERDES参考时钟频率对应。我用示波器实测过参考时钟的差分管脚上偶尔会出现幅度偏小或者抖动偏大的情况如果用交流耦合还要看耦合电容是否贴错容值。4.3 第二步用IBERT做FPGA侧PRBS误码与眼图扫描FPGA侧的GT物理层测试Xilinx和Intel的工具都是图形化界面不需要写太多代码。以Xilinx IBERT为例在Vivado中打开IBERT IP核配置GT位置、线速率、参考时钟频率和PRBS类型。综合生成bitstream后烧录到FPGA。打开Hardware Manager能看到IBERT界面中列出所有可用GT。把GT的TX/RX方向都设为PRBS7/15/31并启动。打开“Scan”功能IBERT会自动改变接收端的采样相位生成眼图、浴盆曲线和误码率数据。我这次调试遇到最典型的画面是每条lane的误码率各不相同其中一lane在9.8304Gbps的PRBS31下误码率高达1e-6另外几条在1e-12以下。这个对比立刻把问题锁定到单条物理链路上而且大概率不是全局性问题。眼图扫描有个经验要分享不要被“眼睛睁开度”骗了。有的lane眼图高度看着不错但误码率却高因为参考时钟有低频抖动眼图是长时间平均后的结果低频抖动把瞬时的误码给掩盖了。所以测试要同时看误码累计和眼图不要只看其中一项。4.4 第三步ADRV9025侧启动PRBS用FPGA校验IBERT的测试是由FPGA主动生成PRBS发给ADRV9025这是默认方向。但要完整验证双向链路也得让ADRV9025发PRBS给FPGA。操作如下初始化ADRV9025驱动加载SHOT profile不启动完整JESD数据流。调用MYKONOS_enablePrbs函数配置成PRBS15或PRBS31。在FPGA端启动GT接收方向不启动TX只做PRBS校验。在IBERT界面观察接收累计误码。这里要特别小心ADI API对PRBS模式的实现和芯片版本有细微差异。有时API选择PRBS31但内部触发条件要求先关闭SERDES TX使能否则PRBS码型不生效。遇到这种情况做法是先调用MYKONOS_enablePrbs(..., MYKONOS_PRBS_DISABLE)再重新使能PRBS类型相当于重置一下模块状态。这个“先disable再enable”的技巧我在多个ADRV9025板卡上屡试不爽。4.5 第四步参数怎么算以这个项目为例很多初学者卡在配置参数上。我直接拿这次项目的参数来举例说明从采样率到线速率的推导逻辑。本项目的ADC采样率是245.76MHz每个采样点包含I和Q两个16bit数据四通道收发一起工作。那么采样总数据量为单通道有效速率245.76M × 16bit × 2I/Q 7.86432Gbps四通道合计7.86432G × 4 31.45728Gbps用4条lane平均传输每条lane的有效数据速率就是31.45728Gbps / 4 7.86432Gbps如果走JESD204C的64b/66b编码线速率大约是有效速率 × (66/64) 8.117Gbps如果按JESD204B的8b/10b编码就是9.8304Gbps。实际工程里最终定在9.8304Gbps用的是JESD204B模式的8b/10b编码。这样算下来每条lane的有效带宽余量并不大所以对物理层抖动容忍度要求很高。这也是为什么PRBS测试在这种高负载配置下的形象更突出——稍有信号完整性瑕疵误码就会爆发。在IBERT里输入目标线速率时直接填9.8304Gbps参考时钟频率要和GT的QPLL配置匹配。UltraScale的GTH支持多种分频组合具体参数Vivado会自动计算但前提是参考时钟频率选对。4.6 第五步误码判定标准别拿偶发误码吓自己PRBS测试最终要回答“链路到底能不能用”这个问题。我的经验是把误码分成三档零误码或误码率低于1e-15并且累计至少一亿比特无误码物理层可以放心。误码率在1e-12量级偶尔冒一两个bit错误多半是参考时钟或者供电噪声引起可以做优化后复测。误码率持续在1e-6以上链路不适合承载JESD数据别指望协议层能救必须改硬件或参数。测试时间也要有讲究。我一般至少跑15分钟速率越高越要拉长到半小时以上。因为环境温度变化会引起PCB材料的介电常数漂移短时间看不出误码长时间工作后反而暴露。实测中就有一次链路冷态零误码跑热之后误码率开始抬升后来发现是参考时钟芯片的热漂移导致的。5. 常见问题速查与排查技巧实录5.1 问题PRBS全通但JESD数据依然错乱这是我见过最多的情况也是最容易被误判的。PRBS全通说明SERDES物理层没问题但JESD仍然错乱问题大概率在协议层或者时钟同步链路上。排查顺序确认JESD配置里的M、L、F、K是否和FPGA端完全一致。我曾经因为F参数一个字节的差异导致数据始终错位但PRBS测试却完全通过。检查SYSREF信号质量。JESD204B/C Subclass 1对SYSREF到LMFC的相位关系要求极严如果SYSREF上叠加了噪声芯片偶尔能对齐偶尔不能表现就是时好时坏。查看多lane对齐状态。四路lane走到FPGA时长度不可能完全等长JESD协议就是靠buffer消除lane间延时差异如果缓冲不够或者SYSREF采错时刻lane间对齐就时好时坏。5.2 问题单条lane误码攒堆怎么定位PRBS测试最常见的异常是某一侧特定的lane误码率明显高于其他lane。这时候不要马上怀疑芯片先把时钟和走线排掉检查这条lane对应的参考时钟走线上是否有交叉。参考时钟串扰造成的误码点往往和相邻信号跳变强相关。检查过孔数量。同一组lane的差分对过孔数尽量一致我遇到过一次差分对内一个过孔一个不过孔结果眼图睁不开。用示波器探头实测这条lane的差分信号幅度。如果过冲或振铃明显考虑修改TX端预加重或者去加重系数。一个很实用的技巧把误码lane的TX预加重等级调大一档看误码是否改善。如果改善明显说明信号完整性确实在这条线上偏弱需要从走线匹配去解决如果完全没反应问题可能更靠近接收端或者参考时钟。5.3 问题PRBS31在高阶模式下误码率爆表低阶模式却很干净这种情况别急着怀疑芯片先看看是不是本地时钟抖动超标。PRBS31对低频抖动尤其敏感低阶PRBS翻转运密度低对抖动不敏感。我建议用频谱分析仪或高精度示波器测一下参考时钟端的相位噪声重点看1kHz到10MHz区间。如果测量条件不具备可以从配置上先切到PRBS23看看误码趋势。如果PRBS23也不错那基本确定链路高频抖动偏大如果PRBS23也开始爆表问题可能更严重比如电源纹波耦合到了PLL。5.4 一张速查表解决整个调试周期80%的疑问整理了一份我实际调试中频繁参照的速查表你截图存下来都行现象优先排查方向高效定位手段全部lane误码率高参考时钟、电源、PLL配置示波器测REFCLK相位噪声某一条lane误码率高PCB走线、过孔、预加重、连接器IBERT单lane扫描眼图PRBS低阶通高阶爆表抖动、码间干扰、通道高频损耗切换PRBS23/31对比PRBS通过JESD不同步JESD参数、SYSREF采样、LMFC对齐寄存器视图检查同步状态偶发误码时有时无热漂移、连接器松动、干扰源长时间监测温度环境测试双向正常但DAC输出异常JESD数据到DAC通路配置检查DAC FIFO空满状态5.5 两个容易忽略的细节差分极性复位和SYSREF复位顺序最后补充两个极易踩的坑。第一个是差分极性。PCB布线时差分对正负端偶尔会接反这在并行数据时代是个低级错误但在SERDES上表现得就很隐蔽——PRBS可以“通过”因为PRBS模式允许接收端配置极性反转但JESD协议层会因为符号位错乱导致数据全错乱。建议在初始化阶段就通过软件强制检查极性。第二个是复位顺序。ADRV9025的SERDES软复位和JESD链路复位必须严格按顺序执行如果复位顺序不对PRBS模块虽然能启动但误码计数器状态可能是脏的。我的经验是在启用PRBS前手动写一次误码计数器清零寄存器再启动测试确保看到的数据是本次测试期间的。6. 写在最后从PRBS跑通到系统稳定还有一段路PRBS全通只是拿到了一张物理层的合格证不代表整条JESD链路真的能高枕无忧。数据采集正常了还需要继续观察长时间运行下的稳定性、多板卡一致性、温度变化下的误码率趋势。尤其在批量生产的板卡上每一块PCB的走线阻抗不可能完全一样更建议把PRBS测试作为产线的基础测试项每块板子上电后先跑一轮PRBS31再进系统联调。这能在源头切掉很多信号完整性问题。我自己做完这个项目最大的感受是高速链路调试千万不要靠猜先用PRBS把物理层判个死刑或者无罪释放再去折腾协议层问题范围会小一大半。整套流程在ADRV9025平台上管用换到其他带SERDES的射频收发器像ADRV9009、ADI的新一代收发器思路也完全一样只是API和寄存器名字有差异。调链路这事慢就是快把每一步验证扎实了后面反而省时间。