硬件接口:RGMII / SGMII / QSGMII 接口原理与电气特性
拿到一块 PHY 板子,第一步不是看寄存器,而是搞清楚 MAC 和 PHY 之间走的是什么接口。RGMII、SGMII、QSGMII 这三种,我几乎每个项目都碰过。说真的,接口选错了,后面怎么调都白搭。
RGMII —— 最经典也最“烦”的并行接口
RGMII 全称 Reduced Gigabit Media Independent Interface,当年为了省引脚而设计的。它只有 12 根信号线:TXD[3:0]、RXD[3:0]、TX_CLK、RX_CLK、TX_CTL、RX_CTL。时钟频率 125 MHz,用 DDR 双沿采样,等价于 1 Gbps 数据率。
个人习惯:调试 RGMII 时,我第一件事就是看 TX_CLK 和 RX_CLK 的相位关系。Marvell 的很多 PHY 芯片内部有内置延迟(ID),可以调 TX_CLK 或 RX_CLK 的延迟,文档里叫 RGMII Timing Select。默认值不一定适合你的 PCB 走线,大概率要改。
电气特性上,RGMII 用的是 1.8V / 2.5V / 3.3V 的 CMOS 电平,属于单端信号。长距离走线容易串扰,而且对等长要求苛刻。我记得有一块板子,TX_CLK 比 TXD 长了 200 mil,结果 1000M 死活不通。后来加了 clk delay,同时割线绕了一下,才搞定。
重要提醒:RGMII 的 TX_CTL 信号在发送端是 TX_EN 和 TX_ER 的混合编码,接收端需要解码。很多工程师忽略了这个细节,直接用示波器看 CTL 波形,发现和预期不一样就怀疑 PHY 坏了——其实不是,是编码规则导致的。
SGMII —— 串行简化,但别忘了 AC 耦合
当 PCB 面积受限或者要走更远距离时,SGMII 就登场了。它只有一对 TX 差分线和一对 RX 差分线,每对 1.25 Gbps 的串行数据,幅度 800~1200 mV(CML 电平)。
避坑指南:我曾经在一个项目中,SGMII 链路始终无法建立。查了两天,最后发现 AC 耦合电容放到了靠近 MAC 端,可 PHY 要求必须靠近连接器一侧。Marvell 的建议是耦合电容尽量靠近发送器,但有些器件反过来。一定要看 datasheet 的 Layout Guidelines。
SGMII 自带自协商功能,通过 /C/ 码和 /I/ 码来传递速率和双工状态。我记得刚学这个的时候,以为只要链路连上就自动协商好了,结果抓包发现 IDLE 信号根本不对。后来用 PHY 的 debug 寄存器读 AN status,才看到远端没回应。
电气上,SGMII 还支持 100BASE-FX 和 10BASE-T 的串行化,不过现在主流都固定 1G。调试的时候,示波器看差分信号摆幅,峰峰值低于 400 mV 基本就废了。
QSGMII —— 4 路合一,调试难度翻倍
如果你手里只有一对差分线,但需要接四个 SGMII 端口,QSGMII 就是答案。它把 4 个 SGMII 的 PCS 层数据复用到一个 5 Gbps 的串行链路上,链路速率是 5 Gbps(含 8B/10B 编码)。
QSGMII 的电气特性和 SGMII 基本一致,也是 CML 电平、AC 耦合,但眼图更窄,抖动要求更严格。我调试过一个带 8 口交换芯片的板子,QSGMII 跑了 5G,回环测试能过,但接上光模块就丢包。
最后发现是 PHY 端 QSGMII 的 TX amplitude 软件配置太低(默认 800 mV),而 Marvell 芯片建议至少 1000 mV for 5G。我把相关寄存器从 0x3 调到 0x7,眼图睁开了,问题解决。
QSGMII 的链路建立过程比 SGMII 复杂:先做 CDR 锁定,再做同步码字对齐,最后才交换自协商信息。实际调试中,我习惯先用示波器看 5G 时钟恢复锁相环的输出,如果抖动大,优先检查参考时钟的 clean 度。
三种接口的对比
| 参数 | RGMII | SGMII | QSGMII |
|---|---|---|---|
| 信号总数 | 12(单端) | 4(差分) | 4(差分) |
| 速率 | 125MHz DDR (1G) | 1.25Gbps(每对) | 5Gbps(复用) |
| 电平标准 | 1.8V/2.5V/3.3V CMOS | CML(0.8~1.2V) | CML(0.8~1.2V) |
| 耦合方式 | 直连 | AC 耦合(0.1uF) | AC 耦合(0.1uF) |
| 自协商 | 通过 MDIO 管理 | 线速自协商 | 先链接后协商 |
| 典型距离 | ≤ 2 inch(PCB) | ≤ 50 cm(PCB) | ≤ 30 cm(PCB) |
| 调试难点 | 时钟时序、等长 | AC 耦合位置、眼图 | CDR 抖动、5G 信号完整性 |
你看表格就知道,RGMII 引脚多但简单,SGMII 线少但要注意差分设计,QSGMII 适合端口密度高的场景但调试门槛最高。
硬件调试的三板斧
不管哪种接口,我调试的套路差不多:
- 用示波器量时钟和数据:RGMII 看 TX_CLK 和 TX_CTL 的关系;SGMII/QSGMII 看差分对的幅度和抖动。
- 读 PHY 状态寄存器:Marvell 的 1.21 版本常用的 status 寄存器有
0x11(Link Status)、0x10(AN Status)、0x1A(铜缆诊断)。SGMII 可以读0x4000附近的 SerDes 状态。 - 做回环测试:先在 MAC 侧内部回环通,再设 PHY 的 Digital Loopback,最后才是外部回环。一步步排除。
我踩过的坑:回环测试时,RGMII 的 Internal Loopback 模式会影响 TX 时钟相位,导致误判。你最好用外部环回线代替。
下面这张图总结了三种接口的物理连接结构,帮助你快速理解 MAC 与 PHY 之间的信号流:
嗯,图里的箭头表示了数据流向。你可以看到 RGMII 走的是并行总线,SGMII 和 QSGMII 走的是高速串行,差别一目了然。
实战两句话
- RGMII 遇到问题先查时钟相位和 PCB 等长,别急着动寄存器。
- SGMII / QSGMII 遇到问题先查 AC 电容位置、参考时钟干净度,再调发送幅度。
这个接口知识看着基础,但我在不少项目里看到有人把 RGMII 的差分时钟当普通时钟量,或者把 SGMII 的耦合电容焊反了极性。你想想,要是能先花十分钟确认这些硬件细节,后面能省多少排查时间。