第4节:RGMII与传统GMII/MII的区别归纳总结
好,我们前面花了三节课,把RGMII的时钟、数据、控制信号以及内部的校准机制都过了一遍。这节我打算做个系统的梳理,把RGMII和它前面的两位“老前辈”——GMII和MII,拎出来做个对比。
说白了,就是要让你看清楚,RGMII到底“改”在哪儿了,“省”了什么东西,又引入了什么新麻烦。搞懂这些,你才能明白为什么我们需要花这么大功夫去做时序校准。
4.1 为什么要拿它们仨比?
MII和GMII都是MAC与PHY之间的标准接口。MII是100M时代的产物,GMII是1000M时代的。到了千兆普及,大家就觉得GMII信号线太多了(想想看,25根线!),板子布起来费劲,成本也高。所以,RGMII的初衷就是为了“减线”。
我记得我做的第一个千兆项目,用的就是GMII接口。那时候板子空间还比较充裕,没觉得有什么问题。后来做一款消费类产品,对尺寸和成本抠得特别严,GMII那种“张牙舞爪”的走线方式就完全没法接受了。所以RGMII可以说是一种“向成本妥协但向性能看齐”的产物。
4.2 核心差异:信号线数量
这是最直观的区别。我们直接看表格:
| 接口类型 | TX信号线数量 | RX信号线数量 | 时钟/控制线 | 总计(约) |
|---|---|---|---|---|
| MII | 4位数据 + 1位使能 + 1位错误 | 4位数据 + 1位有效 + 1位错误 | TX_CLK, RX_CLK, CRS, COL | 16 ~ 18根 |
| GMII | 8位数据 + 1位使能 + 1位错误 | 8位数据 + 1位有效 + 1位错误 | GTX_CLK, RX_CLK, CRS, COL | 24 ~ 26根 |
| RGMII | 4位DDR数据(等效8位) | 4位DDR数据(等效8位) | TX_CLK, RX_CLK, TX_CTL, RX_CTL | 12根 |
看到没?GMII到RGMII,信号线数量直接砍了一半多。怎么做到的?两个核心手段:
- DDR双沿采样:MII和GMII都是单沿采样(一个时钟周期送一次数据)。RGMII在时钟的上升沿和下降沿都送数据,所以4位线就干了8位线的活。
- 控制信号复用:GMII的TX_EN和TX_ER是分开的两根线。RGMII把它们并到一根TX_CTL上,用不同的编码来区分“正常数据”和“错误标志”。
个人小习惯:拿到一块新板子,我第一件事就是用示波器看RGMII的时钟和数据线。如果看到时钟频率只有125MHz,而不是250MHz,那说明PHY内部已经把DDR的数据处理好了,时序相对好调。要是看到250MHz的时钟,心里就要打个问号了——这通常意味着板级或PHY内部的延迟补偿可能还没到位。
4.3 时钟与数据的关系:从“源同步”到“中心对齐”
这个点,我觉得是RGMII最核心的变化,也是所有时序问题的根源。
- GMII/MII:时钟和数据是“源同步”。意思是MAC送数据的同时,也把时钟送过去。PHY在接收时,直接用这个时钟去抓数据。时钟沿对准的是数据窗口的边沿,本身就留了半个周期的建立保持时间余量。换句话说,“你从哪来,我就用哪的时钟抓你”,天然对齐,几乎不需要额外校准。
- RGMII:为了减少信号线,RGMII要求时钟沿对准数据窗口的中心。这就麻烦了!为什么?因为数据从MAC飞线到PHY,会有传输延迟。时钟也有延迟。这两者的延迟还不一定相等。结果就是:时钟沿可能完全不在数据窗口的中心,甚至跑到了边沿上。
为什么会这样?因为RGMII假定了时钟和数据在芯片内部已经做到了“中心对齐”,然后通过PCB走线等长来保持这个关系。但这只是理想情况。我曾经遇到一个案子,PCB Layout已经严格做了等长,RGMII还是跑100M都费劲。最后查出来是PHY内部的延迟路径和MAC的驱动能力不匹配,导致数据信号比时钟慢了好几百皮秒。这就是“中心对齐”假设在现实中崩坏的例子。
4.4 时序模型:一个天一个地
我们用一个简单的SVG图来展示这种差异。我把它画成了一个对比框架,左边是GMII/MII,右边是RGMII。
4.5 PCB设计要求的差异
这一点也很有意思。很多人觉得RGMII线少,PCB更好布。其实恰恰相反。
- GMII/MII:信号线多,但时序要求宽松。时钟和数据走个等长,差一两个厘米问题不大。你想想看,线的数量虽然多,但Layout工程师“犯错”的空间很大。
- RGMII:线少,但对等长要求极其苛刻。我见过的最严要求是,TX_CLK到TXD[3:0]的延迟差不能超过50ps。这是什么概念?在FR-4板材上,1英寸(约2.5厘米)的走线,延迟大约是170ps。50ps的失配,换算成走线长度,只有不到8毫米!
我曾经在一款四层板项目上,就因为一个RGMII的时钟走线绕了三个过孔,而数据线走了两个过孔,导致时序怎么调都调不过去。最后不得不把PCB的回流焊扒开,飞了一根线才解决问题。嗯,那次之后我学乖了:RGMII的等长,必须先算过孔延迟。
| 对比项 | GMII/MII | RGMII |
|---|---|---|
| 信号线数量 | 多(24~26根) | 少(12根) |
| 时序裕量 | 大(半周期余量) | 小(依赖中心对齐) |
| PCB走线要求 | 宽松 | 极严(ps级等长) |
| 抗PVT能力 | 强(源同步) | 弱(需要校准补偿) |
| PHY寄存器配置 | 基本不需要 | 必须精心配置(延迟Tap值) |
4.6 对驱动能力的要求
这里有个隐形的差异,很多资料不会提。RGMII的数据是在时钟的上升沿和下降沿都采样的。时钟信号本身必须同时是“高速”和“低抖动”的。
- 对于GMII,时钟抖动大一点,问题不大。因为数据只在上升沿采,你可以通过调整数据发送时间来躲开时钟的抖动带。
- 对于RGMII,时钟抖动直接影响两个数据眼图的质量。如果时钟抖动太大,上升沿采的数据和下降沿采的数据,其窗口中心位置可能是错开的。这就导致你没法用一个全局的延迟值同时满足上升沿和下降沿的时序。
避坑指南:我曾经在一个项目中,PHY用的是某品牌的低端型号。它的时钟输出抖动规格是±80ps。对于1000BASE-T来说,这个值本身并不大。但问题在于,这个抖动是随机的,无法用寄存器校准消除。结果就是:无论我怎么调TXCLK的延迟,总是要么上升沿数据采错,要么下降沿数据采错。最后只能换了一颗更高精度的PHY才解决。所以,选型阶段就要确认PHY的时钟抖动规格,别指望寄存器能包治百病。
4.7 总结:为什么需要RGMII内部寄存器校准
做完这个对比,你应该能明白一个核心逻辑了:
- GMII/MII用信号线的数量,换取了时序的“先天性”稳定。
- RGMII用信号线的数量,换取了成本和PCB面积的降低。
- 代价就是:时序稳定性从“先天”变成了“后天”,必须靠PHY内部的数字延迟线(IDELAY)和寄存器配置来“找补”。
所以,第4节讲这么一大通,无非是想让你记住一句话:RGMII的时序校准,本质上是工程上的“妥协之术”——用线少,就得用代码和寄存器来凑。后面的章节,我们就会深入这个“代码和寄存器”的世界,看看里面到底是怎么一回事。