RGMII 接口概述:定义、信号线、时序要求与数据速率

什么是 RGMII?

RGMII 的全称是 Reduced Gigabit Media Independent Interface,也就是精简千兆媒体独立接口。说白了,它是一套连接 MAC(媒体访问控制器)和 PHY(物理层收发器)的芯片间通信协议。

我刚开始做硬件的时候,GMII 还在用十多根信号线,布线密度大不说,PCB Layout 走线还容易串扰。后来 RGMII 出来了,靠一句话就把信号线砍掉一半——数据与时钟沿对齐的调整,全部交由收发双方的内部延时逻辑来处理。你想想看,这对我们硬件工程师来说,省了多少走线空间和 BOM 成本。

我在项目中遇到过几次 RGMII 的时序问题,简单说,它的核心思想就是:用双沿采样(DDR)来提升数据速率,然后通过增加一个固定的 Skew 来保证采样窗口。听起来抽象?别急,我们一步步拆开看。

信号线定义

RGMII 的信号线总共就 12 根(如果算上管理接口 MDIO 的话是 14 根,但 MDIO 不是必须的)。我把它们分成三组:

分组 信号名 方向 说明
发送 TXD[3:0] MAC→PHY 发送数据总线,双沿采样,共 4 位
TX_CTL MAC→PHY 发送控制信号(结合 TX_EN 和 TX_ER)
GTX_CLK MAC→PHY 125 MHz 参考时钟(千兆模式)
接收 RXD[3:0] PHY→MAC 接收数据总线,双沿采样
RX_CTL PHY→MAC 接收控制信号
RX_CLK PHY→MAC 从 PHY 恢复的接收时钟,125 MHz
管理 MDC MAC→PHY 管理接口时钟,最大 2.5 MHz
MDIO 双向 管理数据线

嗯,这里要注意:GTX_CLK 和 RX_CLK 的频率。在 1000 Mbps 模式下,GTX_CLK 跑 125 MHz,数据在上升沿和下降沿各采样一次,等效数据速率就是 125 MHz × 2 = 250 MHz × 4 位 = 1000 Mbps。明白了吧?

时序要求——关键的数字游戏

RGMII 最令人头疼的地方在于它的时序规范。IEEE 802.3 标准规定:

  • 时钟到数据的 Skew(偏移) 应该在 1.0 ns 到 2.8 ns 之间(有些 PHY 厂商会放宽到 0.7 ns 到 2.8 ns)。
  • 数据与时钟的 建立时间(tSU) 和 保持时间(tH) 通常为 1.0 ns。

为什么要规定 1.0 ns 以上的 Skew?因为数据是在时钟的两个边沿采样的,如果时钟沿和数据沿完全对齐,接收端根本分不清该采哪个边沿。所以 RGMII 故意引入了一个固定的相位偏移——让数据比时钟早一点点或者晚一点点到达。

关键理解: RGMII 的 Skew 补偿不是事后补救,而是协议本身主动制造的。MAC 端发送数据时,TXD 相对于 GTX_CLK 提前 1.0~2.8 ns 翻转;PHY 端接收数据时,也要用相同的逻辑处理。如果两边匹配不好,就会出问题。
我的一点实践经验: 很多新人在画原理图时只管连信号,忽略 PCB 上时钟和数据的等长控制。我曾经在一款交换机项目里,GTX_CLK 比 TXD 短了 500 mil(约 12.7 mm),结果 FPGA 里的 IDELAY 怎么调都锁不住。后来用示波器一看,Skew 已经超出 3 ns 了。最后不得不割线加蛇形绕线才救回来。

数据速率与工作模式

RGMII 支持三种速率模式,对应的时钟频率和采样方式如下表:

速率模式 GTX_CLK / RX_CLK 采样方式 数据总线宽度 线速率
10 Mbps 2.5 MHz 上升沿采样 4 bit 10 Mbps
100 Mbps 25 MHz 上升沿采样 4 bit 100 Mbps
1000 Mbps 125 MHz 双沿采样 (DDR) 4 bit 1000 Mbps

注意,10/100 模式下其实只用了上升沿,相当于 4 位并行 × 2.5/25 MHz = 10/100 Mbps。而千兆模式必须用双沿才能把速率拉上去。我见过有人把 1000 Mbps 模式的 PCB 当成了 100 Mbps 来布,时钟线走得很长也不管等长,结果千兆根本不通——这就是忽略了 DDR 对信号质量的严苛要求。

RGMII 时序结构图

下面我用一张图把 RGMII 的核心架构和时序关系画清楚。注意看数据相对于时钟的相位偏移:

RGMII 接口架构与典型时序关系 MAC 发送方 TXD[3:0], TX_CTL GTX_CLK PHY 接收方 RXD[3:0], RX_CTL RX_CLK MAC 接收方 时钟与数据相位关系 (发送端视角) GTX_CLK: 0 T 2T 3T 4T TXD (滞后 ~1.5 ns): Skew ≈ 1.0~2.8 ns (数据比时钟沿晚到) △t 需要补偿的调整点 1. MAC 发送:通过 IDELAY / ODELAY 调整 TXD 相对 GTX_CLK 的 Skew 2. PHY 接收:PHY 内部通常有默认的 2.0 ns 延时,可通过寄存器微调

为什么要关注 Skew 补偿?

RGMII 本身只定义了信号和时序,但实际 PCB 上的走线长度差异、芯片工艺偏差、温度漂移都会改变 Skew。如果 Skew 超出标准范围,接收端采样就会出错,轻则丢包,重则通信完全不通。

我曾经在一个 10 层板的设计里,由于 MAC 和 PHY 分属两块板卡通过 FPC 连接,导致 TX_CLK 的走线长度比数据线长了 2 英寸,Skew 直接跑到 4 ns。当时 PHY 端死活不 Link Up,排查两天才发现是 Skew 超标。后来在 FPGA 侧加了动态相位调整,才算解决问题。

特别注意: 很多 FPGA 厂商(Xilinx、Intel)的 RGMII IP 核默认假设时钟与数据同相(Skew = 0),而实际 PHY 芯片需要 2.0 ns 的 Skew。这时你必须使能 FPGA 内部的 ODELAY / IDELAY 来补偿。忘了这一步,就是最常见的“RGMII 不工作”原因。

本章核心要点

  1. RGMII 信号线少——12 根信号线,适合高密度布线。
  2. 双沿采样——千兆模式下 125 MHz 时钟配合 DDR 达到 1 Gbps。
  3. Skew 是故意的——数据与时钟之间必须保持 1.0~2.8 ns 的相位偏移。
  4. 补偿是必须的——PCB 走线、芯片工艺、温度都会破坏这个偏移,需要用延时单元(ODELAY/IDELAY)来纠正。