RGMII 接口概述

RGMII 全称 Reduced Gigabit Media Independent Interface,说白了就是简化版的千兆媒体独立接口。它把原本 GMII 的 8 位数据线砍成 4 位,靠双沿采样把速率拉回一样,这样 PCB 走线能少一半。我最早接触它是在一个通信板卡项目上,当时觉得「4 根线跑千兆挺酷的」,结果被时钟相位折腾了一周——嗯,后面再细说。

提示:RGMII 接口工作在 125MHz 时钟下,数据在时钟的上升沿和下降沿各采样一次,等效于 250MHz 的 DDR 传输。

信号定义:就那么几根线

RGMII 的信号线不多,发送和接收各 6 根,一共 12 根。你记下这张表就够了:

信号名 方向 说明
TXD[3:0] MAC → PHY 发送数据总线(4 bit)
TX_CTL MAC → PHY 发送控制信号(TX_EN 与 TX_ER 编码)
TXC MAC → PHY 发送时钟(125MHz,与数据存在相位关系)
RXD[3:0] PHY → MAC 接收数据总线(4 bit)
RX_CTL PHY → MAC 接收控制信号(RX_DV 与 RX_ER 编码)
RXC PHY → MAC 接收时钟(125MHz,由 PHY 产生)

所有数据信号都是 DDR 双沿采样,除了时钟本身是单沿时钟。TX_CTL 和 RX_CTL 是两根控制线合二为一,在上升沿送使能,下降沿送错误标志。说起来简单,实际项目中很多人把 TX_CTL 和 TX_EN 搞混——我曾经见过一块板子直接把 TX_EN 连上去,结果 PHY 死活不 link up。

注意:RGMII 接口的 TX_CTL / RX_CTL 信号不是简单的使能信号,它在上下沿承载不同信息。如果只接 TX_EN 到 TX_CTL,PHY 侧会误判错误标志,丢包率直接飙到 30%。

时钟与数据关系:相位才是命门

RGMII 标准定义了两种时钟方案:

  • 内部延迟模式:MAC 侧把时钟相对于数据偏移 90°(约 2ns),这样 PHY 可以直接用上升沿采样数据。
  • 外部延迟模式:MAC 输出时钟和数据同相,由 PCB 走线或 FPGA 内部的 IDELAY 来提供延迟。

你想想看,为什么要有这 90° 偏移?因为 DDR 信号在跳变沿附近最容易出现建立/保持时间违例。标准规定数据在时钟边沿切换,如果接收端直接用同一个时钟沿采样,那就等于在数据正在变化的时候抓值,赌的就是运气。偏移 90° 后,采样点落在数据稳定的中间区域,这样就稳了。

关键点:RGMII 内部延迟模式要求 TXC 领先 TXD 约 2ns;接收方向 RXC 也要通过 PHY 或 MAC 内部延迟实现类似效果。延时校准偏差,说白了就是这 2ns 没给准。

这是我在项目中画过无数次的时序关系图,今天用 SVG 重现一下:

RGMII 发送时钟与数据相位关系 内部延迟模式 外部延迟模式 TXC TXD[3:0] D0 D1 D2 TXC TXD[3:0] D0 D1 D2 内部延迟模式特点 - 时钟边沿对齐数据跳变 - 采样点落在数据稳定区 - 默认 2ns 偏移 (90° @ 125MHz) - FPGA 内部用 IDELAY 调整 - Intel / Xilinx 都支持 我遇到过的坑: PHY 侧内部延迟没关,MAC 也开, 双重偏移直接丢包 90%+。 外部延迟模式特点 - 时钟与数据同相输出 - 延迟由 PCB 走线等长提供 - 采样点需靠接收端 PLL 对齐 - PCB 走线要求严格 - 高速设计常用 我遇到过的坑: PCB 走线没做等长,时钟比数据 晚了 300ps,100M 都跑不起来。

图里标得很清楚:左边内部延迟模式的采样点正好在数据窗口中间,右边外部延迟模式因为时钟和数据同相,采样点打在数据跳变沿上——这也是为什么外部延迟模式下 PCB 必须通过蛇形走线或者 FPGA 的 IDELAY 把时钟往前推一点。我当年第一次画原理图,就想当然地把 TXC 和 TXD 走成等长,结果 PHY 侧采到全是毛刺。

技巧:如果你用 Xilinx 的 7 系列 FPGA,可以直接在约束里设 `set_output_delay -clock [get_clocks clk125] -min -add_delay 0.5 [get_ports {txd[*]}]` 之类的来模拟内部延迟。但注意,不同厂商的 PHY 对延迟极性要求不一样,最好实战时用示波器量一下。

信号完整性对相位的影响

说了这么多,其实影响延时校准的最根本因素是 PCB 上走线的不对称、阻抗不连续、以及过孔带来的寄生效应。我见过一个案例:某板卡 6 层板,RGMII 走线在中间层,结果差分阻抗跑到 80Ω,信号反射导致时钟抖动大了 200ps。嗯,200ps 对于一个 2ns 的偏移窗口来说,基本就是10%的误差了,丢包率开始冒头。

所以后面我们专门讲《延时校准偏差导致 RGMII 丢包排查案例》的时候,会把这些场景一一拆开。今天这章是基础,你得把信号定义和相位关系刻在脑子里,后面排查才会快。