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° 模式更靠谱。
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 部分时,按这个顺序检查,可以省很多调测时间:
- 确认 PHY/MAC 的 RGMII 版本(1.0/2.0/3.0)。
- 查看芯片手册,找到 RGMII clock skew 相关寄存器(通常是页 0 寄存器 0x14 或 0x1F)。
- 用示波器测量 TX_CLK 和 TXD[0] 的边沿关系——如果是 0° 对齐,需要修改寄存器或添加外部延迟。
- 确保 RX_CLK 与 RXD 的时序同样满足中心对齐(有时 TX 和 RX 需要单独配置)。
- 检查 PCB 走线等长(时钟与每组数据线长度差 ≤ 15 mm)。
我个人习惯先把 PHY 的寄存器读出来,打印看看默认值。很多国产 PHY 默认是 0° 输出,不改的话板子只能跑百兆。