RGMII 接口概述与时序要求

RGMII(Reduced Gigabit Media Independent Interface)是千兆以太网里用得最多的接口之一。它把 MAC 和 PHY 连起来,信号线一共就 12 根——相比 GMII 少了一大半。我当年第一次画 RGMII 布局时,心想“线这么少,肯定好走”。结果板子调了三天,千兆死活 link 不上,抓波形才发现数据采样窗口偏移了将近 1.2 ns。说白了,RGMII 的时序容限很窄,PCB 上一丁点偏差都会导致数据出错。

1.1 信号分组与双沿采样

RGMII 把原来的 8 位数据总线压缩成 4 位,利用时钟的上升沿和下降沿各传 4 bit,这样就把 TXD[3:0] 和 RXD[3:0] 两根总线用了起来。再加上 TXC(发送时钟)、RXC(接收时钟)、TX_CTL、RX_CTL,一共 12 个信号。我习惯把 RGMII 信号分成三组:

  • 时钟组:TXC、RXC。频率 125 MHz,周期 8 ns。由 MAC 或 PHY 提供,取决于具体实现。
  • 数据组:TXD[3:0]、RXD[3:0]。上升沿传低 4 bit,下降沿传高 4 bit。
  • 控制组:TX_CTL、RX_CTL。组合了 GMII 中的 TX_EN、TX_ER 等信号,同样在双沿采样。
个人习惯:在原理图里,我会把 TX 方向信号和 RX 方向信号分开标注,比如用“(T)”和“(R)”后缀。这样布局时一眼就能看出相对时钟源的方向,避免把发送时钟和接收时钟搞反。

1.2 时序参数与容限

RGMII 的时序核心在于:数据必须在时钟边沿附近保持稳定,且 skew(数据与时钟之间的相对延迟)不能超过规定值。IEEE 802.3 对 RGMII 的时序要求如下(我常用的一组典型值):

参数 符号 最小值 典型值 最大值 单位
时钟周期(125 MHz) Ttcyc 7.98 8.0 8.02 ns
数据与时钟 skew Tskew -1.0 0 +1.0 ns
建立时间(接收端) Tsetup 1.0 — — ns
保持时间(接收端) Thold 1.0 — — ns
输出延迟(发送端) Tod 0.5 0.8 1.2 ns

你仔细看这个表,skew 范围只有 ±1 ns。而一个 125 MHz 周期是 8 ns,建立/保持要求各 1 ns,意味着实际有效窗口只有 6 ns 左右。如果 PCB 走线长度不一致,造成数据与时钟的延迟差超过 1 ns,时序就崩了。

我曾经踩过的坑:有一款 PHY 芯片要求数据信号相对于时钟的延迟必须控制在 0.5~1.5 ns 之间(即正 skew 范围),而另一款 MAC 则要求 -0.5~+0.5 ns。两个芯片的时序窗口方向完全不同!所以 不能只对标标准,一定要看具体芯片的 datasheet。

1.3 内部延迟 vs PCB 等长

为了补偿 PCB 走线造成的 skew,很多 MAC 和 PHY 内部都集成了可编程延迟(IDELAY / ODELAY)。我一般在 RGMII 数据线上串联 0 Ω 电阻,调试时先用内部延迟,若不够再调整 PCB 长度。下面这张图示意了 RGMII 信号在 PCB 上的典型连接关系:

RGMII 接口信号连接与时钟关系 MAC (TXC, TXD[3:0], TX_CTL) PHY (RXC, RXD[3:0], RX_CTL) TXC (125 MHz) TXD[3:0] + TX_CTL 时钟源:多数由 PHY 提供 双沿采样:上升沿→低4bit 下降沿→高4bit

1.4 PCB 布局对 skew 的直接影响

为什么说 RGMII 的时序偏差根源在 PCB 布局?我直接说结论:走线长度差是 skew 的主要来源。FR4 板材上信号传播速度大约为 170 ps/inch(约 6.7 ps/mm)。如果同一组中最长与最短的走线差了 150 mil,skew 就差了将近 1 ns,正好凑到极限值。所以:

  1. 等长布线:同一组内所有信号(时钟 + 数据 + 控制)走线长度差控制在 ±50 mil 以内。我自己的设计规则是 ±25 mil。
  2. 参考连续地平面:信号必须有完整的参考层,否则阻抗不连续会产生额外的延迟抖动。
  3. 远离高频干扰:时钟线尽量不与其它高速线平行走超过 500 mil。
实战经验:某次改版,我把 TXC 和 TXD 的走线长度差控制在 20 mil 以内,但 PHY 端依然出现偶发 CRC 错误。最后发现是 TX_CTL 走线绕了弯路,比其它线长了 120 mil,导致控制信号采样出错。从此我在规则里加入了 每根控制线必须与对应的数据组一起等长 的约束。

1.5 典型时序偏差源总结

下面这个表格列出了我调试 RGMII 时序时验出来的常见偏差源,以及它们的量级:

偏差源 典型量级 应对策略
PCB 走线长度差(100 mil) ~0.7 ns 手动等长,蛇形线补偿
过孔数量差异(每多 1 个过孔) ~30 ps 同类信号使用相同过孔数
封装引脚差异(BGA vs QFN) 50~200 ps 芯片选型时检查封装延时数据
内部 IDELAY 量化步长 50~100 ps/step 调试阶段预留配置寄存器接口
温度漂移(-40°C~+85°C) ~150 ps 留出足够设计余量,至少 300 ps

这些偏差单个看都不大,但叠加起来就容易超过 ±1 ns 的容限。我通常把 PCB 走线引入的 skew 控制在 ±0.4 ns 以内,这样即使温度变化和芯片离散性加起来,总 skew 也能保持在 0.9 ns 以下,留出 0.1 ns 的安全边。