一、RGMII接口概述与板级验证挑战

做板级验证这些年,RGMII 这个接口我见得最多。说它简单吧,只有 12 根线;说它难吧,跑千兆时时序搞不定,板子愣是通不了。我刚开始接手这个接口时也吃过亏,后来才慢慢摸清它的脾气。

1.1 RGMII 到底是个什么东西

RGMII 的全称是 Reduced Gigabit Media Independent Interface。说白了,它就是芯片(MAC)和 PHY 之间传数据用的。你想想看,如果每个信号都单独拉一根线,那板子上得跑多少根线?所以它做了个减法。

对比项 GMII RGMII
数据引脚数 8 位 × 2(收发) 4 位 × 2(收发)
时钟方式 独立时钟 源同步 DDR
最大吞吐率 1 Gbps 1 Gbps
引脚总数 约 24 根 约 12 根

表格一对比你就明白了。RGMII 用 DDR(双沿采样)的方式,用一半的引脚干同样的活。但代价呢?就是时序变苛刻了。我在项目中遇到过一种情况:测试时功能都正常,量产时有一批板子死活不通——最后查出来就是时钟到数据的相位差了那么一两百皮秒。

1.2 接口的本质

其核心就是四个收发信号组:

  • TXD[3:0] — 发送数据,4 位宽
  • RXD[3:0] — 接收数据,4 位宽
  • TX_CLK — 发送时钟,由 MAC 提供
  • RX_CLK — 接收时钟,由 PHY 提供
  • TX_CTL — 发送控制信号
  • RX_CTL — 接收控制信号

这里有个坑——TX_CLK 和 RX_CLK 是各自独立产生的。发送时钟从 MAC 出来到 PHY,接收时钟从 PHY 出来到 MAC。两个时钟之间没有任何相位关系。嗯,这就是所有时序问题的根源。

关键点:RGMII 的时钟是源同步的。也就是说,数据跟着时钟一起走,谁发数据,谁就提供时钟。接收端只需要采数据,不需要自己产生时钟。

1.3 相位对齐的难题

RGMII 要求在千兆模式下,时钟的上升沿和下降沿都要采数据。这就是所谓的 DDR 传输。我回忆一下当时第一次做 RGMII 验证时的场景:示波器打上去,波形都有,就是 Ethernet 跑不起来。

为什么会这样?

因为 PCB 走线会有延迟。时钟走线和数据走线只要差几百 mil,相位就偏了。你想想看,数据在时钟沿采样的时刻,如果因为走线长度不一致导致数据正好在跳变沿上,那结果就是——不定态。

我个人习惯:做 layout 时,RGMII 的四根数据线一定要和时钟线等长。等长控制在 ±50 mil 以内,这是底线。如果不放心,可以放宽到 ±100 mil,但风险会大很多。

1.4 板级验证的三大挑战

我们在板级验证中,面对的挑战归归类,其实就三类:

  1. 电气特性挑战——信号完整性、振铃、过冲
  2. 时序挑战——建立时间、保持时间、延迟补偿
  3. 兼容性挑战——不同 PHY 对时序窗口的要求差异很大

电气特性这块我吃过亏。有一个项目,PHY 芯片离 MAC 将近 3 英寸远,信号到那边已经变形了。我用示波器一看,上升沿都变成缓坡了。后来串了 22 Ω 的电阻做端接才算搞定。

时序挑战就更头疼了。RGMII 的时序窗口只有 1 ns 左右(千兆模式下周期是 2 ns,因为 DDR 是双沿,所以每个沿的窗口只有 1 ns)。1 ns 是什么概念?就是一根走线多 6 英寸,你的时序就挂了。

挑战分类 典型表现 我的排查经验
电气特性 信号质量差,误码率高 看眼图,检查端接
时序窗口 丢包,CRC 错误 调相位,改 PCB 等长
兼容性 A 厂 PHY 能通,B 厂不行 查 datasheet,调驱动强度

注意:我曾经在调试时忽略了一个细节——PHY 手册里写的 setup/hold 时间是在某个特定测试条件下测的。实际板子上因为电源噪声、温度变化,这个窗口会缩小。所以不要卡着边界设计,要留余量。

1.5 为什么需要特殊的时序收敛方法

有人可能会问:FPGA 里面不都集成 RGMII IP 了吗?直接例化不就行了吗?

对,IP 能处理大部分问题。但它处理不了“板上的延迟”。PCB 走线、过孔、连接器——这些物理因素 FPGA 管不着。你得在板级验证中把这些因素测出来、收进去,才能保证量产稳定。

这也就是我做这个课程的初衷:把板级验证中那些“书本上不讲,实际却天天遇到”的时序问题,掰开揉碎了讲清楚。说白了,就是让你少走我当初走过的弯路。

接下来的章节里,我们会一步步拆解 RGMII 的时序约束怎么设、怎么测、怎么调。

RGMII 时序收敛知识体系(第1章核心结构) RGMII 接口概述 接口特性 信号定义 时序挑战 DDR 双沿采样 源同步时钟 TXD/RXD(4位数据) TX/RX 时钟与控制 PCB 走线延迟 相位对齐难题 板级验证三大方向 电气特性验证 → 时序验证 → 兼容性验证