RGMII接口概述:它是什么,为什么非要延时补偿
各位好,欢迎来到这门课。咱们开篇第一个话题,就是RGMII这个接口本身。
RGMII,全称Reduced Gigabit Media Independent Interface,翻译过来就是“简化吉比特介质独立接口”。你想想看,名字里带“简化”,那它肯定是为了替代谁而生的。没错,它要替代的是GMII——那个用了24根数据线的“老大哥”。RGMII只用12根线,就把千兆以太网的数据给搞定了。怎么做到的?说白了,就是用双沿采样(DDR),一个时钟周期内,在上升沿和下降沿各采一次数据。
我刚开始接触这个接口的时候,也觉得挺巧妙。但实际用起来,就会发现一个很头疼的问题——时序裕量不够用。这也是咱们整个课程要解决的核心矛盾。
核心要点: RGMII通过DDR技术将数据线减半,但代价是对时钟和数据的相对相位关系极其敏感。PCB走线长度、芯片内部延迟、温度电压变化,都会破坏这个脆弱的时序关系。
RGMII信号细节:聊聊那12根线
先捋一下这12根信号线具体是干什么的。我把它们分成三组来记,这样不容易乱。
| 信号组 | 信号名 | 方向 | 说明 |
|---|---|---|---|
| 发送(MAC→PHY) | TX_CLK | MAC→PHY | 125MHz参考时钟 |
| TXD[3:0] | MAC→PHY | 数据总线,上升沿发低4位,下降沿发高4位 | |
| TX_CTL | MAC→PHY | 控制信号,上升沿发TX_EN,下降沿发TX_ER | |
| 千兆模式下,时钟频率125MHz,双沿采样等效速率250MHz | |||
| 接收(PHY→MAC) | RX_CLK | PHY→MAC | 125MHz参考时钟,由PHY恢复产生 |
| RXD[3:0] | PHY→MAC | 数据总线,采样规则与发送端相同 | |
| RX_CTL | PHY→MAC | 控制信号,上升沿采RX_DV,下降沿采RX_ER | |
| 注意:接收时钟和数据之间的相位关系,取决于PHY内部的延迟配置 | |||
这里有个细节我得多说一句。千兆模式下,时钟是125MHz。但因为用了双沿采样,数据率实际上是250Mbps每根线。这个速度下,信号的建立时间(setup time)和保持时间(hold time)窗口已经非常窄了,我算过,理想情况下也只有大约2纳秒。要是走线稍长一点,或者芯片内部延迟变了,这个窗口就没了。
为什么需要延时补偿?核心矛盾在这里
好,现在咱们来回答这个问题——为什么RGMII非要做延时补偿?
原因其实就一句话:MAC和PHY芯片内部的时钟-数据路径延迟不匹配。
具体来说,问题出在发送端。RGMII标准要求MAC送出去的时钟(TX_CLK)和数据(TXD/TX_CTL)之间,存在一个90度(约2ns)的相位偏移。你可以理解成,时钟的边沿应该正好落在数据眼的中间,这样PHY才能稳定地采到数据。
理想很丰满,现实很骨感。我曾经在一个项目里就被这个坑过。
- PCB走线延迟:时钟线和数据线长度不一样,延迟差个几百皮秒很正常。
- 芯片内部延迟:MAC和PHY的I/O buffer、内部逻辑路径延迟,不同厂商、不同批次的芯片都不一样。
- PVT变化:温度一高,电压一低,延迟就跟着跑,时序裕量本来就紧张,这下直接崩了。
注意: 不是所有板子都能靠纯走线等长解决问题。尤其在高速信号频率125MHz、边沿速率在几百皮秒的今天,等长走线只是基础,真正的决胜点在寄存器级别的延迟微调上。这就是本门课程要教你的核心技能。
延时补偿的方式:两种主流思路
解决这个延迟不匹配的问题,业界主要就两招。我按自己的习惯给它们起了个名字:“Mac自己扛”和“Phy帮你调”。
-
MAC端调整(Source-Synchronous with Delay)
MAC自己负责把TX_CLK延迟一个固定的相位。很多FPGA或者高端MAC芯片内部都有可编程延迟单元。这样你只需要在MAC软件里配个参数就行了。但缺点是,你得确认MAC芯片是否支持,而且延迟精度可能不够。
-
PHY端调整(PHY Internal Delay)
这是咱们这门课的重头戏。PHY芯片内部往往集成了延迟锁定环(DLL)或延迟链。你可以通过修改PHY的寄存器,来微调TX_CLK(发送时钟)或RX_CLK(接收时钟)的延迟。好处是灵活,而且很多PHY都支持,调一次基本上就稳了。
我个人更喜欢用PHY端调整这种方式。为什么?因为MAC端的延迟配置通常比较固化,一旦板子做好了,想再改就比较麻烦。而PHY寄存器配置,你可以通过I²C或MDIO随时改,调试阶段特别方便。我做过的一个项目,一开始相位怎么也调不对,最后发现是PHY的TX delay寄存器默认值是0,而我需要的值是7。调完之后,眼图立马张开,那个爽快感,你懂的。
SVG图:RGMII时钟-数据相位关系与补偿目标
下面这张图,我用SVG画了一下RGMII发送端理想的相位关系,以及不补偿和补偿后的对比。你可以看着这张图,理解为什么90度偏移这么重要。
经验之谈: 如果你在调试RGMII时,发现Link能起来,但是经常丢包或者校验错误,99%的可能性是时序没调好。别急着怀疑芯片坏了,先查查PHY的TX/RX delay寄存器配置对不对。我调试时习惯先用示波器看一下TX_CLK和TXD之间的相位关系,看一眼就心里有数了。
什么时候你该来上这门课?
如果你正在做这样的板子——用的是RGMII接口的交换机芯片、FPGA或者SoC,而且你已经遇到了以下现象之一:
- Link能建,但pin通pin不通,或者网速跑不到线速
- 示波器一看,数据眼图闭合得不行
- 换一个温度环境或者换一根网线,问题就复现了
- 怀疑是PCB走线问题,但板子已经投了,不想再改板
嗯,那你来对地方了。这门课会带你逐个寄存器地看,每个配置位是干什么的,怎么调才能把眼图张开。