ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ZYNQ RGMII电平失配排查:从EMIO到PHY的千兆网口调试实战

ZYNQ RGMII电平失配排查:从EMIO到PHY的千兆网口调试实战 1. 网口上不了线的真实表现调试台的荒诞三小时先说一个结论ZYNQ 的 PS 侧千兆 MACGEM本身非常稳PS-MAC 通过 PL-EMIO 引出 RGMII 接口也属于官方支持的典型方案真正让工程师翻车的往往不是逻辑而是看起来无所谓的电平匹配。我这次就是在板卡回板后的联调阶段被 RGMII 电平狠狠上了一课。板子是自己团队设计的主控是 Xilinx ZYNQ-7020PHY 用的是 Marvell 88E1512。硬件上把 PS 的 GEM0 配置成 RGMII 模式通过 EMIO 引到 PL 侧再接 PHY 的 RGMII 管脚。第一版投板时想着 PS 端 EMIO 是 1.8V/1.5V 可配PL 端 BANK 电压刚好也是 1.8V就直接把 PHY 的 VDDIO 接到了 1.8V当时觉得两边都是 1.8V肯定没问题。结果板卡回来后U-Boot 起来ping 网关直接丢包 100%链路指示灯倒是亮的PHY 寄存器也能通。这个状态最迷惑人——不是完全不通而是时通时断。用逻辑分析仪抓 RGMII 时钟和数据线能看到数据翻转但翻转幅度始终不对味。那会儿我一度怀疑是 PCB 走线等长没做好或者是 GEM 的时序约束不对压根没往 PHY 的 VDDIO 和 ZYNQ EMIO 的电平标准上去想。后来把 VDDIO 从 1.8V 改成 2.5V内部 LDO 跳线改完PHY 寄存器读到 VALARM 丢失再用示波器量 RXD 线上的高电平幅值只有 1.35V 左右才意识到问题出在哪。观测项异常表现正常预期链路指示灯常亮或闪烁看起来正常常亮/闪速有节奏PHY 寄存器访问可以读取ID 识别正常可正常访问Ping 网关初时几个包能通后面全丢稳定零丢包RXD 高电平幅值约 1.35V应接近 PHY VDDIO 或 ZYNQ 供电电平大数据吞吐速率极低或者直接 Rx error 计数暴涨线速无错误统计这个能通一点但不是真通的状态是 RGMII 接口电平失配的典型症状。电平不对不是直接把信号削没了而是给接收端的判别电路留出了太大的噪声空间和时序裕量损失。接下来我把整个排查链路和根因逻辑拆开讲里面有大量细节值得回看。2. 从 PS-MAC 到 PL-EMIO为什么这个拓扑容易出电平坑2.1 ZYNQ GEM 的接口不是想怎么引就怎么引ZYNQ-7000 系列的 PS 内部有多个 GEMGigabit Ethernet MAC这些 GEM 对外接口有两种引出路径固定 MIO 引脚或者走 EMIO 到 PL。走 MIO 的时候IO 电平由 MIO 所在的 BANK 电压决定通常是 1.8V 或 3.3V走 EMIO 的时候信号进入 PL 的可编程逻辑再由 PL 的 IO 引脚也就是普通的 FPGA IO送出去给外部 PHY。这里有个极其关键、但特别容易被忽略的细节EMIO 引出的接口在 PL 侧并没有自带电平转换你要用哪个 BANK 的 IO 引脚就得保证这个 BANK 的 VCCO 与对端器件电平兼容。更麻烦的是PS 侧 GEM 的 EMIO 管脚分配是有讲究的。GEM0 的 RGMII 信号在 EMIO 上有固定映射你可以通过引脚约束把它们分配到 PL 的任意 BANK。一旦分配到了某个 BANK该 BANK 的 IO 标准就必须适配 RGMII 的电平需求。2.2 RGMII 电平标准VDDIO 决定一切RGMII 是 4 位收发数据加源同步时钟的接口数据在时钟的双沿采样。它的信号电平没有强制规定必须是 1.8V 或 2.5V而是跟随 PHY 侧 VDDIOIO 供电设置。常见的 PHY 芯片88E1512、RTL8211、KSZ9031 等VDDIO 可以在 1.5V、1.8V、2.5V、3.3V 之间选择。而 ZYNQ PL BANK 的 VCCO 也有多种配置。理论上只要两边 VCCO 一致电气上就是兼容的。问题往往出在两边电压值一致标准类型不一致。比如我这个案例PHY 的 VDDIO 和 PL BANK VCCO 都设置了 1.8V但 ZYNQ PS 侧 GEM 的 EMIO 输出驱动能力、输入阈值是按 PS 的 IO 标准LVCMOS18设计的PL BANK 的 IO 标准虽然在约束里写了 LVCMOS18。听起来都是 1.8V但双方电路的输出阻抗、输出窗口、跳跃速率slew rate存在差异在对外 PHY 的 VDDIO 给错实际上是 PHY 手册推荐的 VDDIO 范围里没覆盖这一档时异常就出来了。2.3 走 EMIO 的隐性风险布线延迟和双沿采样裕量RGMII 本身就是源同步双沿接口走 PL 内部逻辑后信号从 PS 内部被搬到 PL 的 FF触发器上再由组合逻辑/IO 输出路径延迟比硬核直连 MIO 要长得多。这意味着时钟到数据的关系必须重新做时序约束如果不约束布线工具随机布局时钟路径和数据路径的偏差可能会超过一个数据有效窗口。RGMII 的数据线与时钟线哪怕是十几 mil 的走线长度差在 1Gbit/s 速率下都可能消耗掉很大一部分建立/保持时间预算。我当时其实做了一部分时序约束但没重点检查 IO 电平。后来才明白时序裕量不足可以用约束补救但电平标准错了约束写得再漂亮也没用。这里顺便提醒一句走 EMIO 时如果 PHY 芯片的 RGMII 接口还支持 ID 模式内部延迟时钟或数据务必确认 PHY 的延迟模式配置和 FPGA 侧的 IDELAY 是否叠加。延迟叠加错了也会出现低速通、高速不通的奇怪现象。3. 逐步缩小嫌疑圈的完整排查链路3.1 第一轮怀疑 U-Boot 配置和 PHY 地址板卡回来后我先是把 PS 侧的 GEM0 配置检查了一遍确认是 RGMII 模式、MDIO 能够正确枚举到 PHY 地址 0x1188E1512 可根据管脚配置落在不同地址。U-Boot 里mdio list能看到 PHY说明 MDIO 接口没问题。又查了 PHY 的寄存器 0x1状态寄存器读到 LINK 为 up。这时候 PHY 认为链路线有信号这是第一层假象。排查思路既然 MDIO 通驱动初始化流程大概率没跑偏问题可能在数据通路。开始测 RGMII 信号。3.2 第二轮示波器看 RGMII 波形的陷阱直接用示波器探针点 RGMII 数据线。点上去时要注意长地线夹子和 10x 探头在高频信号下会引入振铃测出来的波形不够真实。我一开始看到波形幅值低、上升沿不干净还以为是走线阻抗不连续的问题差点去改 PCB 走线了。后来换了差分有源探头虽然 RGMII 是单端信号但 1G 速率下单端测量对探头带宽要求很高并且把探头接地线缩短到几毫米数据才可信RXD[0] 的高电平大概 1.35VVOH 明显低于 1.8V 的预期值。3.3 第三轮查 ZYNQ BANK 电压和 PHY VDDIO用万用表量 PL BANK 的 VCCO确实有 1.8V。再量 PHY 的 VDDIO 引脚发现只有 1.35V 左右。这是一个非常关键的时刻——电源标称 1.8V实际到了 PHY 引脚却只有 1.35V说明电源路径上存在显著的压降或者 PHY 内部有区域供电异常。这里有个坑PHY 的 VDDIO 和 VDD核心供电通常是不同引脚如果设计时把 VDDIO 接到了某个 LDO 输出但灌电流能力不足实测电压就会被拉低。我查了原理图外部的 1.8V 电源确实给了 PHY 的 VDDIO但 PCB 上滤波磁珠的直流电阻偏高且 PHY 的 IO 驱动电路灌流较大整体压降超出预期。3.4 第四轮查阅 88E1512 数据手册发现电平等级问题当 VDDIO 实测只有 1.35V 时已经低于 1.8V LVCMOS 的输入高电平门槛。但为什么 100M/10M 还能偶尔通几个包因为低速率下时序裕量大即便信号劣化偶尔还能撞进有效窗。翻数据手册时我注意到 88E1512 对 RGMII 接口的 VDDIO 范围严格分为 1.5V、1.8V、2.5V、3.3V 档位相应的接口电平等级I/O standard不同。实际测到 1.35V 电压明显低于最低档 1.5V 的标准ZYNQ PL 侧虽然在约束里写了 LVCMOS18但实际电平已经退化到接近 LVCMOS15 甚至更低两边电平窗口交集变小接收端判别翻转不可靠。3.5 真正的根因VDDIO 不是简单的接上就行回头看根因是 RGMII 电平给错了而不是接口逻辑错误。我给 PHY 的 VDDIO 虽然设计目标是 1.8V但更本质的问题是 ZYNQ EMIO 侧的 RGMII 接口根本没有按理想 1.8V 输出加上 PCB 压降最终出现电平失配。这个给错了包含两层第一层是原理图设计时没有核对 PHY 的 VDDIO 与 FPGA BANK 电压和 IO 标准的关系第二层是调试期间没有意识到 1.35V 的真实测量值和 1.8V 的标称值之间已经跨越了电平标准的边界。4. 根因落地RGMII 电平等级对收发时序的杀伤机制4.1 为什么电平低一点就数据异常而不是完全不通数字接口的电平规范包括 VOH、VOL、VIH、VIL 四个指标。正常工作时驱动端输出的高电平必须大于接收端的 VIH低电平必须小于 VIL。如果驱动端的 VOH 只有 1.35V而接收端 VIH 大约是 0.7 × VDDIO不同器件有差异在 VDDIO1.8V 时 VIH 约为 1.26V理论上 1.35V 是能够超过 VIH 的为什么还是出错因为 RGMII 是双沿采样时钟的上升沿和下降沿都要锁存数据。信号的压摆率slew rate不够快时数据在时钟沿附近的电压可能正处于过渡区。虽然直流上超过了 VIH但动态情况下信号可能还在转换区域接收端的输入缓冲输出不确定锁存结果就是错误的。同时电磁干扰和串扰在 1GHz 带宽下更容易叠加到电压余量本就不足的信号上。4.2 数据线上的有效窗口被压缩用眼图的语言描述RGMII 数据信号在时钟采样点至少要满足建立时间和保持时间同时电压摆幅必须在接收端的有效窗口内。当电平从 1.8V 掉到 1.35V相当于眼图垂直方向的眼睛变小叠加反射和串扰之后睁开度更差。时钟线上同样是低压摆时钟边沿的抖动和噪声相对更大最终表现在数据链路上就是随机丢包、CRC 错误暴增。这个现象和信号完整性问题非常像但根因不同。信号完整性问题是布线或阻抗不连续导致波形劣化电平失配问题是驱动端与接收端电气标准没有对应。两者可以同时存在但必须先区分开——否则你会花大量时间去改布局布线结果毫无改善。4.3 100M 能通、1000M 不通的典型误判1000M 工作时 RGMII 时钟为 125MHz双沿采样等效数据率 250Mbps每线时序预算按纳秒级算。100M 工作时时钟 25MHz双沿采样等效数据率 50Mbps时序裕量大了 5 倍。这就是为什么低速模式下偶尔能通几个包高速模式直接报废。遇到这种100M 凑合能通、1G 完全不行的情况先查电平等级再查时序约束。这里再分享一个技巧把 PHY 速率强制到 100M 和 10M 分别测试如果 10M 稳定、100M 不稳定、1000M 彻底不行基本可以判定为模拟域问题电平、摆率、信号完整性而不是 MAC 配置问题。反之如果 10M 也不通那就要检查链路建立过程了。5. 修复方案与验证细节5.1 首先解决 VDDIO 电压从根上把电平给对把 PHY 的 VDDIO 供电从原 1.8V 轨调整为 2.5V并且确保 PL 对应 BANK 的 VCCO 同步设置为 2.5V同时更新引脚约束文件的 IO standard 为 LVCMOS25。为什么选 2.5V 而不是重新把 1.8V 做扎实因为 88E1512 手册上 2.5V 档的接口电平余量更好而且我们的电源板本身就有 2.5V 输出调整成本最低。改动点原理图/PCBPHY VDDIO 连线从 1.8V 电源改用 2.5V 电源去掉不必要的磁珠或降低磁珠阻抗。FPGA 约束set_property IOSTANDARD LVCMOS25 [get_ports rgmii_*]确认 PHY 的 RGMII 接口 VDDIO 与 PHY 核心供电 VDD通常 1.0V 或 1.15V分离互不影响。5.2 核对 PHY 驱动电流和终端电阻RGMII 信号线上的串联端接电阻值也需要跟着 VDDIO 变化调整。驱动器输出阻抗与 PCB 走线阻抗匹配一般串联 22Ω-33Ω。改电压后重新测量信号质量如果过冲超限适当调整端接电阻。我用示波器复位测量修改后的 RXD 波形高电平到了 2.4V 以上上升沿变得陡峭干净。再检查 RXC 时钟线边沿单调无振铃眼图睁开度明显改善。5.3 Vivado 里重新做时序约束电平标准改了之后IO 延迟参数也跟着变。时序约束方面重点约束 RGMII 源同步接口的 input delay 与 output delay。set_input_delay -clock [get_clocks {rgmii_rxc}] -min -max -add_delay ...实际操作中我用了gen_clk约束 RXC将数据线以 RXC 为参考设置 input delay 根据 PCB 走线长度计算。这里强调一点走线长度和时钟走线长度的差要算到约束里不能只写一个固定值。如果不知道精确长度先按等长设计再微调。改完约束后重新综合实现时序报告里 setup/hold 均为正裕量。5.4 链路级验证从 U-Boot 到 Linux 双端测试我验证的顺序是U-Boot 阶段mdio list识别 PHYping 192.168.1.1连续 100 个包全通。Linux 内核起来后网卡 eth0 链路 upethtool eth0看到 Speed: 1000Mb/sDuplex: Full。iperf3 打流TCP 吞吐稳定在 940Mbps 左右几乎打满千兆线速。长时间压力测试跑 12 小时连续双向流量ifconfig eth0统计值里 RX errors 和 RX dropped 均为 0。打流这一步特别能暴露电平问题。很多情况下 ping 全通、iperf 却发现吞吐只有 300Mbps也是电平/时序问题在特定数据图案下被激发。6. 防止同类坑的工程固化清单踩过一次坑之后我把检查流程固化成清单后续做 ZYNQ 外部 PHY 的板子都按这个走。这里也分享给各位。检查项具体内容说明电平标准匹配PS EMIO 引脚所属 PL BANK VCCO 必须与 PHY VDDIO 一致且符合器件手册档位不要只按电压值相等要看具体标准识别电源路径压降测量 PHY VDDIO 引脚上的实际电压而不是只量电源模块输出磁珠/走线/过孔压降可能吃掉几百 mV输出 IO StandardVIVADO 约束中必须明确设置 IOSTANDARD不能默认自动默认可能走了 LVCMOS33 或 LVCMOS15RGMII 延迟模式PHY 的 TX/RX delay 配置与 FPGA IDELAY 不能叠加冲突一般都由 PHY 内部 delay 或 FPGA 位于 IDELAY二选一时序约束完备对 RGMII 源同步时钟和数据进行 set_input_delay / set_output_delay缺了约束工具会乱布线PCB 走线等长RGMII 组内数据/时钟长度差尽量控制在 50mil 内1G 速率下走线差直接影响裕量除此之外设计阶段一定要想清楚一个问题你选的 PHY VDDIO 档位是否真的与 ZYNQ 的 EMIO 所挂 BANK 的 VCCO 在要连接的速率下拥有足够的信号完整性余量如果条件允许给 VDDIO 电源留出调压跳线或者多个 LDO 输出选项方便第一版板卡调试时直接改电压——这个习惯帮我省了很多事。再补充一个容易忽略的细节ZYNQ PS 侧 GEM 的 MDIO 时钟MDC最高速率限制和上拉电阻阻值。MDIO 的上拉电阻一般在 1kΩ-10kΩ如果 VDDIO 改了MDIO 的上拉电源也要跟着改否则 MDIO 电平同样会漂移到阈值附近表现就是 PHY 寄存器读取偶发失败。这次虽然 MDIO 一直正常但如果我们没改它迟早会成为第二个坑。最后说回我的体会RGMII 电平失配这类问题排查时最怕被表面现象牵走。链路能起来、寄存器能读、偶尔能通包就会不停地怀疑软件或时序。但只要你记得验证链路中每一个器件的实际 IO 供电电平和信号实测幅值这个坑完全可以快速定位。希望这篇复盘能帮你少走弯路。
返回列表