3. RGMII 时钟与数据对齐方式

RGMII 接口最让人头疼的,往往不是速率,而是时钟和数据的对齐关系。你想想看,千兆以太网下时钟频率 125 MHz,DDR 模式下数据在上升沿和下降沿各采一次,实际数据速率 250 Mbps 每线——时序窗口就那么点。如果时钟相位没配对,眼图一闭,丢包就来了。

我刚开始调 RGMII 时,总以为只要把时钟连上、数据连上就能通。结果有一块板子死活跑不上千兆,百兆倒是稳。抓了信号才发现,时钟边沿正好压在数据跳变上——标准的 0° 对齐,但接收端却按 90° 去采,不丢才怪。后来我把 PCB 走线微调了一下,或者在 PHY 寄存器里把时钟相位切到 90°,问题就解决了。

3.1 RGMII 标准规定的两种对齐模式

RGMII 规范(IEEE 802.3 及相关 IP 核文档)明确给出了两种时钟与数据的对齐方式,概括起来就是:

  • 0° 模式(边沿对齐):时钟的上升沿和下降沿与数据跳变沿对齐。接收端直接用这个时钟去采数据,刚好采在跳变点上——这在高速设计中几乎不可能正确采样。
  • 90° 模式(中心对齐):时钟相对于数据相位偏移 90°(即四分之一周期)。时钟边沿落在数据眼图的中心,接收端能可靠地采样到稳定电平。

我个人的经验是,90° 模式才是真正能用的模式。0° 模式更多是作为理论参考,或者在某些特殊场景下配合内部 DLL 再做一次相移。

关键点:RGMII 发送端通常输出 0° 对齐的信号,接收端需要自行移相 90° 或依赖发送端在时钟上做 90° 相移。具体方案取决于芯片的 RGMII 实现版本(RGMII 1.0 / 2.0 / 3.0)。

3.2 时序偏差的来源与解决思路

为什么会出现时序偏差?说白了就是 PCB 走线延迟、芯片内部路径差异、以及温度电压变化造成的 skew。RGMII 时钟和数据线必须等长布线,但光等长还不够,时钟的相移方式也得正确。

对齐模式 时钟边沿与数据的关系 接收端采样可靠性 典型应用
0° 模式 边沿对齐(时钟跳变点 = 数据跳变点) 差(采样在跳变区域) 仅用于内部测试/特殊芯片
90° 模式 中心对齐(时钟跳变点 = 数据眼图中心) 好(最大时序裕量) 绝大多数量产设计

通常情况下,发送端 PHY 或 MAC 会提供两种选择:要么在时钟线上做 90° 相移输出,要么数据线相对于时钟直接中心对齐。你需要在原理图和驱动层确认芯片的 RGMII 模式配置。

避坑指南:我曾经遇到过一款交换芯片,它的 RGMII 输出时钟默认是 0° 对齐,且无法通过寄存器改成 90°。这时候必须在 PCB 上人工走蛇形线给数据线增加延迟,或者用外部 PLL 把时钟移相。嗯,最后还是加了 PLL,因为蛇形线太长反而引入串扰。

3.3 发送端与接收端的角色划分

弄明白谁负责移相,是面试常问的点。我习惯这样记:

  • 发送端:输出时钟和 DDR 数据。如果发送端支持 RGMII 2.0 及以上,它可以直接输出 90° 相移的时钟;否则输出 0° 时钟。
  • 接收端:负责采样数据。如果收到的是 0° 时钟,接收端必须内部做 90° 相移(通过 DLL 或 PLL);如果收到的是 90° 时钟,直接采样即可。

这里有个容易搞混的地方:RGMII 标准说的是“时钟与数据之间的相移应控制在 ±500 ps 以内”,但没说必须由发送端还是接收端来完成相移。所以不同芯片厂商的做法不同。我建议在设计时先确认 datasheet 里“TX_CLK delay”或“RX_CLK delay”寄存器是否存在。

// 伪代码示例:在 Linux 驱动中配置 RGMII 时钟相位
// 假设 PHY 地址为 0x01,寄存器 0x1F 为 RGMII 控制寄存器
// bit[5] = 1 表示 TX 时钟相对数据移相 90°
// bit[4] = 1 表示 RX 时钟相对数据移相 90°
phy_write(0x01, 0x1F, 0x0030);  // 同时使能 TX 和 RX 的 90° 相移

3.4 画一张图看明白

下面这张 SV G 图把 0° 和 90° 两种模式的关系画出来了。你一眼就能看出为什么 90° 模式更靠谱。

RGMII 时钟相位对齐方式(0° vs 90°) 发送端(TX) 0° 模式:边沿对齐 时钟跳变 与 数据跳变 采样点在跳变区 90° 模式:中心对齐 时钟相移 90° 采样点在眼图中心 接收端(RX)可靠采样 实际量产设计几乎全部使用 90° 中心对齐,0° 模式仅在芯片内部测试或兼容老 IP 时出现

3.5 面试常问的坑

面试官最喜欢问:“RGMII 的时钟相位到底是 0° 还是 90°?为什么?” 你如果只回答“90° 中心对齐更好”,那是基础分。要拿满分,你得说出以下几点:

  • RGMII 是 DDR 采样,时钟频率只有数据速率的一半,但边沿对齐采样点不稳定。
  • 实际芯片实现中,发送端可能输出 0° 时钟,接收端用内部 DLL 移相;也可能直接输出 90° 时钟。
  • PCB 走线时,时钟线和数据线必须等长(一般误差 ≤ 50 mil),否则相位偏移会超过标准允许的 ±500 ps。
  • 驱动层可能需要配置 PHY 寄存器来使能时钟延迟(RGMII TX/RX clock skew control)。

重要提醒:不要在时钟线上随意加 RC 延迟作为“移相”。我见过有人用 RC 低通移相,结果幅度衰减太大,接收端门限判断出错。可靠的移相必须用 PLL/DLL 或数字延迟链。

3.6 快速自查清单

当你拿到一个新板子的 RGMII 部分时,按这个顺序检查,可以省很多调测时间:

  1. 确认 PHY/MAC 的 RGMII 版本(1.0/2.0/3.0)。
  2. 查看芯片手册,找到 RGMII clock skew 相关寄存器(通常是页 0 寄存器 0x14 或 0x1F)。
  3. 用示波器测量 TX_CLK 和 TXD[0] 的边沿关系——如果是 0° 对齐,需要修改寄存器或添加外部延迟。
  4. 确保 RX_CLK 与 RXD 的时序同样满足中心对齐(有时 TX 和 RX 需要单独配置)。
  5. 检查 PCB 走线等长(时钟与每组数据线长度差 ≤ 15 mm)。

我个人习惯先把 PHY 的寄存器读出来,打印看看默认值。很多国产 PHY 默认是 0° 输出,不改的话板子只能跑百兆。