拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

ZYNQ PS-MAC EMIO RGMII网口不通?排查IO电平标准错误

ZYNQ PS-MAC EMIO RGMII网口不通?排查IO电平标准错误 1. 一个让人抓狂的薛定谔网口现象如果你在用 ZYNQ 做板子大概率遇到过这种场景PS 端的 GEM 控制器配好了MDIO 能读到 PHY 的 IDifconfig也能看到eth0但就是 ping 不通或者丢包率高得离谱ethtool -S一看全是 CRC 错误和 alignment error。更诡异的是有时候换一块板子、换一批 PHY 芯片现象又变了——有的能通有的不通有的通一会儿就断。我最近就踩了这么一个坑。项目用的是 ZYNQ-7000 系列PS 端 GEM0 通过EMIO引到 PL 侧再接到外部 PHY接口是RGMII。硬件同事画完板子软件这边把设备树、时钟、pinmux 都配好了结果网口数据异常ping 大包必挂小包偶尔能过。查了整整两天最后发现根因简单到让人想砸键盘RGMII 的 IO 电平标准给错了。这篇文章就把整个排查链路、原理分析、以及最后怎么定位到电平问题完整地复盘一遍。如果你也在用 ZYNQ 的 PS-MAC PL-EMIO 方案做网口尤其是 RGMII 接口这篇内容应该能帮你省下至少一天的时间。先明确一下适用人群你需要对 ZYNQ 的 PS/PL 架构有基本了解知道什么是 EMIO、什么是 MIO用过 Vivado 做 block design能看懂设备树。如果你是纯软件出身、第一次碰 ZYNQ 网口建议先把 UG585 里 GEM 那一章翻一遍再往下看。2. 先搞清楚 PS-MAC 走 EMIO 到 PL 这条路到底经过了什么2.1 EMIO 不是延长线它是跨时钟域的路径很多人对 EMIO 的理解有偏差觉得 EMIO 就是把 PS 的引脚延伸到 PL 而已。实际上 EMIO 是 PS 和 PL 之间的一组专用信号通道信号从 PS 出来之后要经过 PL 侧的 IO buffer 才能到物理引脚。这就意味着PS 端配置的 IO 标准和 PL 侧实际约束的 IO 标准是两回事。在 MIO 模式下GEM 的 RGMII 信号直接走 MIO bankIO 电平由 MIO bank 的MIO_Config决定一般跟着 VCC 走。但一旦你把这些信号通过 EMIO 引到 PL信号就进入了 PL 的 IO bank这时候电平标准由PL 侧的 IOSTANDARD 约束决定跟 PS 那边没关系了。这是整个问题的核心前提。我见过太多人包括我自己在 Vivado 里配好了 PS 的 GEM就以为万事大吉完全忽略了 PL 侧 IO 约束这一环。2.2 RGMII 的信号组成与时序特征RGMII 全称 Reduced Gigabit Media Independent Interface是 GMII 的简化版。它把 GMII 的 8 位数据线砍到 4 位通过DDR双沿采样的方式在时钟的上升沿和下降沿都传数据从而在 125MHz 时钟下实现 1000Mbps 速率。具体信号包括信号名方向位宽说明TXD[3:0]MAC→PHY4发送数据DDRTX_CTLMAC→PHY1发送控制DDR承载 TXEN 和 TXERRTXCMAC→PHY1发送时钟125MHzRXD[3:0]PHY→MAC4接收数据DDRRX_CTLPHY→MAC1接收控制DDR承载 RXDV 和 RXERRRXCPHY→MAC1接收时钟125MHzMDCMAC→PHY1管理时钟MDIO双向1管理数据关键点在于RGMII 是 2.5V 或 1.8V 的接口标准具体用哪个电压取决于你的 PHY 芯片和硬件设计。而 ZYNQ PL 侧的 IO bank 电压是由硬件上给 bank 供电的 VCCO 决定的。如果 VCCO 和 PHY 期望的电平不匹配就会出现信号幅度不对、采样错误、CRC 大量报错的现象。2.3 为什么能读到 PHY ID但数据不通这是最迷惑人的地方。MDIO/MDC 是低速信号一般 2.5MHz 以下对电平容限比较宽即使电平标准配错只要大致在阈值附近MDIO 通信往往还能正常工作。所以你能读到 PHY ID、能协商出 1000M 全双工看起来一切正常。但 RGMII 的数据线是 125MHz DDR等效 250Mbps 的翻转率对电平标准、驱动强度、slew rate 都非常敏感。电平给错轻则眼图闭合、采样窗口不够重则完全无法识别。这就解释了为什么管理接口正常、数据接口异常。3. 排查链路从网口不通到电平给错的完整过程3.1 第一步确认软件配置没问题遇到网口异常我的习惯是先排除软件层。这一步的目的是确认不是驱动、设备树、时钟的问题把范围缩小到硬件或 IO 层面。具体操作# 查看网口是否识别 ifconfig -a # 查看 PHY 协商状态 ethtool eth0 # 查看统计信息重点看错误计数 ethtool -S eth0如果ethtool eth0显示Speed: 1000Mb/s、Duplex: Full、Link detected: yes说明 MDIO 通信和自协商是正常的。然后看ethtool -S的输出重点关注意这些计数rx_crc_errors接收 CRC 错误rx_align_errors对齐错误rx_length_errors长度错误tx_underrun发送下溢我当时看到的是rx_crc_errors和rx_align_errors持续增长tx方向相对正常。这个现象很典型接收方向有问题发送方向基本正常。这提示问题可能出在 PHY→MAC 的 RXD/RXC 路径上。3.2 第二步用 ILA 抓 PL 侧的 RGMII 信号既然怀疑是 PL 侧的问题那就得上 ILA。ZYNQ 的好处是 PS 和 PL 在同一个芯片里你可以把 EMIO 引出来的 RGMII 信号在 PL 侧打一拍接到 ILA 上观察。具体做法在 Vivado block design 里把 GEM0 的 EMIO 接口引出来之后在 PL 侧加一个 ILA IP把 RXD、RX_CTL、RXC 这些信号接进去。注意 ILA 的采样时钟要用一个稳定的时钟比如 100MHz 的 PL 时钟不要用 RXC 本身。抓波形的结果让我很意外RXC 时钟是有的频率也对但 RXD 上的数据跳变沿非常软上升时间明显偏长而且高电平只有 1.6V 左右。正常 2.5V 的 RGMII 信号高电平应该在 2.3V 以上。提示ILA 抓 RGMII 信号时要注意 ILA 本身的输入延迟和采样率。125MHz 的 DDR 信号ILA 采样时钟至少要到 250MHz 才能看清细节否则会漏掉窄脉冲。3.3 第三步回头查约束文件里的 IOSTANDARD看到波形幅度不对我第一反应是去查 XDC 约束。打开约束文件一看果然# 错误的约束 set_property IOSTANDARD LVCMOS18 [get_ports {gmii_rxd[*]}] set_property IOSTANDARD LVCMOS18 [get_ports {gmii_rxc}]而硬件上这个 IO bank 的 VCCO 是 2.5VPHY 也是 2.5V 的 RGMII 接口。约束写的是 LVCMOS18实际 bank 供电是 2.5V。这就是根因。这里要解释一下为什么约束写错还能工作Vivado 在实现时如果 IOSTANDARD 和 VCCO 不匹配通常会报 warning 甚至 error。但有些情况下比如约束是在某个中间版本加的或者 bank 电压被其他信号带偏了工具可能不会严格阻止。结果就是 IO buffer 工作在非预期状态输出幅度和驱动能力都不对。3.4 第四步修正约束并验证把 IOSTANDARD 改成LVCMOS25之后重新综合、实现、生成 bitstream下载后网口立刻正常了。ethtool -S里的 CRC 错误不再增长ping 大包也稳了。修正后的约束# 正确的约束 set_property IOSTANDARD LVCMOS25 [get_ports {gmii_rxd[*]}] set_property IOSTANDARD LVCMOS25 [get_ports {gmii_rxc}] set_property IOSTANDARD LVCMOS25 [get_ports {gmii_rx_ctl}]同时对于 RGMII 的时序还需要加IDELAY或者ODELAY来调整采样点。这部分内容后面会详细讲。4. RGMII 电平标准的选择逻辑与常见误区4.1 电平标准由谁决定VCCO、PHY、还是约束这是一个三方博弈的问题必须三者一致硬件 VCCOPCB 上给这个 IO bank 供的电压是物理事实改不了除非改板。PHY 芯片的接口电平PHY 的 datasheet 里会写明 RGMII 接口支持的电平常见的有 2.5V、1.8V、1.5V有些还支持 3.3V。XDC 约束里的 IOSTANDARD这是你告诉 Vivado 的期望值必须和前两者匹配。三者的关系是VCCO 决定了 IO buffer 能输出的最大电压PHY 决定了它期望的输入电压IOSTANDARD 告诉工具怎么配置 buffer。如果 IOSTANDARD 写低了比如 VCCO 是 2.5V 却写 LVCMOS18buffer 会以 1.8V 的逻辑去驱动输出幅度不够如果写高了VCCO 是 1.8V 却写 LVCMOS25工具可能直接报错或者 buffer 工作异常。4.2 一个容易被忽略的细节bank 电压是共享的ZYNQ PL 侧的 IO bank 是按 bank 分组的同一个 bank 里的所有 IO 共享一个 VCCO。这意味着如果你这个 bank 里还有其他信号它们的电平标准必须和 RGMII 一致。我见过一个案例有人把 RGMII 信号和一个 1.8V 的 SPI 信号放在同一个 bank结果 VCCO 只能给 1.8V但 PHY 是 2.5V 的怎么调都不通。最后只能改板把信号分到不同 bank。所以画板子的时候RGMII 信号所在的 bankVCCO 一定要和 PHY 的电平匹配并且这个 bank 里不要混其他不同电压标准的信号。4.3 LVCMOS 和 SSTL 的选择RGMII 一般用 LVCMOS 系列具体是 LVCMOS25、LVCMOS18 还是 LVCMOS15取决于电压。有些设计会用 SSTL 系列但 RGMII 标准里并没有强制要求用 LVCMOS 就够了。这里有个经验如果你的 PHY 支持多种电平优先选和 VCCO 一致的那个。比如 VCCO 是 2.5VPHY 支持 2.5V 和 1.8V那就选 2.5V这样 IO 时序余量最大。5. 除了电平RGMII 还有哪些坑在等着你5.1 IDELAY/ODELAY 与采样窗口电平修对之后网口能通了但不代表时序就完美了。RGMII 的 DDR 采样对时序要求很高尤其是接收方向PHY 发出的 RXC 和 RXD 之间的 skew 可能导致采样点落在数据跳变沿上。ZYNQ 的 PL 侧 IO 支持 IDELAY输入延迟和 ODELAY输出延迟可以用来微调采样点。具体做法是在 Vivado 里给 RXD 信号加IDELAYE2原语或者用set_input_delay约束配合工具自动调整。我的经验是先用 ILA 抓波形看 RXD 的跳变沿和 RXC 的边沿关系然后手动调 IDELAY 的 tap 值。一般 tap 值在 0~31 之间每个 tap 约 78ps具体看器件和速度等级。调到数据跳变沿正好在 RXC 边沿的中间位置眼图最开。5.2 时钟约束不能少RGMII 的 RXC 是 PHY 送过来的 125MHz 时钟TXC 是 MAC 送出去的 125MHz 时钟。这两个时钟都需要在 XDC 里做约束否则工具不知道它们的频率和关系时序分析会不准。# 接收时钟约束 create_clock -name rgmii_rxc -period 8.000 [get_ports gmii_rxc] # 发送时钟约束 create_clock -name rgmii_txc -period 8.000 [get_ports gmii_txc] # 输入延迟约束 set_input_delay -clock rgmii_rxc -max 2.0 [get_ports {gmii_rxd[*]}] set_input_delay -clock rgmii_rxc -min 1.0 [get_ports {gmii_rxd[*]}]这些约束的具体数值要根据 PHY 的 datasheet 和 PCB 走线来定不能照抄。我一般会留足够的余量然后靠 IDELAY 来补。5.3 EMIO 的引脚分配与 pinmux用 EMIO 引 GEM 的时候Vivado 里需要在 ZYNQ Processing System 的配置里把 GEM0 的接口设为 EMIO。然后在 block design 里这些信号会以接口的形式出现在 PS 的引脚上你需要把它们引出到顶层再分配到具体的 PL 引脚。这里有个容易错的地方EMIO 引出的信号名和 MIO 模式下不一样。MIO 模式下你看到的是MIO引脚号EMIO 模式下看到的是GEM0_*这样的信号名。分配引脚时别搞混了。6. 一套可复用的 RGMII 调试检查清单踩完这个坑之后我整理了一份 RGMII 调试的检查清单每次新板子 bring up 都按这个顺序过一遍能省不少时间。检查项检查方法常见问题VCCO 电压万用表量 bank 供电与 PHY 电平不匹配IOSTANDARD 约束查 XDC 文件写错电压等级MDIO 通信ethtool eth0PHY 地址错、MDC 频率过高自协商结果ethtool eth0速率/双工不匹配错误计数ethtool -S eth0CRC/align 错误指向电平或时序ILA 波形Vivado ILA幅度、跳变沿、时钟频率IDELAY 调整手动调 tap 值采样窗口不对时钟约束查 XDC缺少 create_clock这份清单的核心逻辑是先确认软件层没问题再用 ILA 看物理层最后回头查约束。顺序不要乱否则容易在软件层浪费时间。7. 关于 ZYNQ 网口调试的一些个人体会做 ZYNQ 的网口调试最忌讳的就是想当然。PS 端配好了不代表 PL 端没问题MDIO 通了不代表 RGMII 通了能 ping 通小包不代表大包没问题。每一个环节都要用工具去验证而不是靠猜。另外硬件和软件的边界在 ZYNQ 上特别模糊。一个网口不通可能是驱动问题、设备树问题、时钟问题、约束问题、电平问题、PCB 问题。排查的时候要有层次从软件到硬件从低速到高速逐步缩小范围。最后说一个我自己的习惯每次新板子 bring up我都会先用 ILA 把关键接口的信号抓一遍存成波形文件。这样后面出问题的时候有对比的基准能快速判断是一直就不对还是后来变坏了。这个 RGMII 电平的坑说到底就是一句话EMIO 引出来的信号电平标准由 PL 侧的 IOSTANDARD 决定必须和 VCCO、PHY 三者一致。记住这句话能帮你避开很多类似的坑。
返回列表