RGMII 接口简介与挑战归纳总结

各位同学好,我是老张。搞嵌入式通信这么多年,RGMII 是我打交道最多的接口之一。说白了,它就是以太网 MAC 和 PHY 之间那条“高速公路”。标准用 4 根数据线加一根时钟线,在时钟双沿采样,硬生生把跑 125MHz 的 DDR 接口推到 1000Mbps。听起来简单,实际调试时踩过的坑……嗯,我慢慢讲。

1.1 RGMII 是什么?

RGMII(Reduced Gigabit Media Independent Interface),名字里带着 Reduced,就是因为它比前辈 GMII 少了一半信号线。GMII 用 8 位数据线 + 时钟单沿采样,RGMII 只用 4 位数据线,靠时钟上升沿和下降沿各送一个字节,数据速率直接翻倍。我第一回看这个时序图时,心想“这不就是 DDR 吗?” 没错,它的电气特性跟 DDR 内存很相似。

关键信号就这几根:

  • RXC — 接收时钟,由 PHY 提供,通常 125MHz ±50ppm
  • TXC — 发送时钟,由 MAC 提供,同样是 125MHz
  • RXD[3:0] — 接收数据,双沿采样
  • TXD[3:0] — 发送数据,双沿采样
  • RX_CTL / TX_CTL — 控制信号,包含 DVALID 和 SOP/EOP 编码

下面这张图是我这些年总结的 RGMII 接口信号结构,方便你一眼看清数据走向。

RGMII 接口信号结构 MAC 处理器/FPGA 侧 PHY 物理层 芯片 TXC(发送时钟) TXD[3:0](发送数据) TX_CTL(控制) RXC(接收时钟) RXD[3:0](接收数据) RX_CTL(控制) 所有信号均为双沿时钟(上升沿 + 下降沿)

1.2 时序挑战 —— 为什么需要延时校准?

RGMII 的规格书里明确写着:时钟与数据之间的相对 skew 应控制在 ±0.5ns 以内。你想想看,125MHz 的时钟周期才 8ns,一个 bit 的窗口只有 4ns(因为双沿),0.5ns 已经占了 12.5%。一旦 PCB 走线长了、过孔多了、温度变了,skew 很容易超限,直接导致数据采样错位。

我在一个 4 层板的项目里就吃过亏。PHY 芯片和 FPGA 之间走线差了 2 英寸,以为没事,结果以太网连 100M 都跑不稳。后来用示波器一看,RXD 相对于 RXC 的边沿偏移了将近 1.2ns——妥妥的误码。

常见的时序问题汇总如下:

问题 根因 典型表现
时钟偏斜(Clock Skew) PCB 走线长度不等、过孔阻抗不连续 链路能协商但丢包严重
建立/保持时间违规 PHY 内部 delay 不够或 MAC 端 setup/hold margin 不足 数据采样到相邻 bit,产生 CRC 错误
温度/电压漂移 芯片工艺偏差、环境变化导致 IO 延时变化 早上通下午不通,冷机通热机不通
PCB 串扰 数据线和时钟线间距不足,耦合噪声 偶尔出现 runt 脉冲
⚠️ 我曾经踩过的坑: 有块板子为了节省成本,把 RGMII 信号从顶层绕到内层又回到表层,各条线长度差控制在 ±10mil 以内,结果还是跑不了千兆。排查到最后发现——PHY 芯片有一个内部延时模式(TX delay / RX delay)默认是关闭的,而 MAC 那边没有启用片内 IDELAY。两边都没有补偿,skew 直接翻倍。

1.3 延时校准的两种主流思路

既然信号走线和芯片都会引入不确定的延时,那怎么保证 RXC 正好采到 RXD 的眼图中心?行业内目前就两条路:

  1. PCB 走线等长 + 外部电阻/电容延迟——老派做法,靠物理长度调相位。调试极其痛苦,换一次 PCB 就重来。
  2. 内部可编程延时单元(IDELAY / ODDR 等)——现代 FPGA 和 PHY 都支持。通过配置寄存器,把时钟或数据移动几十到几百皮秒,精度可以做到 50ps 步进。这也是我这套课程重点讲的方法。

我自己的习惯是:优先用 FPGA 硬核 IDELAY,配合示波器或者 Eye Scan 工具,边测边调。如果 PHY 也支持 RX DLL 模式,那就两边一起动,总有一组配置能让眼图张开最大。

🔧 一个实用经验: 很多 PHY(比如 Realtek RTL8211、Marvell 88E1512)的寄存器 0x1F 或 0x15 里藏着 RX 和 TX 延时调整位。调试时先读 datasheet,不要上来就改 FPGA 代码。我见过有人花了三天改 FPGA 逻辑,最后发现 PHY 寄存器 bit4 拨一下就好了。

1.4 延时校准的核心指标

做延时校准,你得盯住下面几个参数。我每次调试都会在调试日志里记下它们:

参数 典型值 测量方式
Tskew (Clock to Data) 目标 ≤ 0.5ns 示波器测 RXC 与 RXD 边沿差
IDELAY 步进 一般 50ps ~ 78ps 查 FPGA 或 PHY 手册
眼图张开宽度 ≥ 2ns(≥ 50% UI) 使用 Eye Scan 或 IBERT
PRBS 误码率 ≤ 1e-12 长时间 PRBS 测试

💡 个人小贴士: 别只看示波器。示波器看到的边沿位置是平均结果,实际芯片还要受抖动和串扰影响。我自己的流程是:示波器粗调 → 眼图扫描精调 → PRBS 跑 30 分钟最终验证。三步缺一不可。

1.5 本章小结

好了,第一章节我们就聊这些。RGMII 接口的本质是高速 DDR 信号,延时不匹配是千兆以太网调不通的头号杀手。核心挑战就三个字:skew 大。解决办法就是引入可调的延时,把采样点拉到眼图中心。