硬件接口: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 适合端口密度高的场景但调试门槛最高。

硬件调试的三板斧

不管哪种接口,我调试的套路差不多:

  1. 用示波器量时钟和数据:RGMII 看 TX_CLK 和 TX_CTL 的关系;SGMII/QSGMII 看差分对的幅度和抖动。
  2. 读 PHY 状态寄存器:Marvell 的 1.21 版本常用的 status 寄存器有 0x11(Link Status)、0x10(AN Status)、0x1A(铜缆诊断)。SGMII 可以读 0x4000 附近的 SerDes 状态。
  3. 做回环测试:先在 MAC 侧内部回环通,再设 PHY 的 Digital Loopback,最后才是外部回环。一步步排除。

我踩过的坑:回环测试时,RGMII 的 Internal Loopback 模式会影响 TX 时钟相位,导致误判。你最好用外部环回线代替。

下面这张图总结了三种接口的物理连接结构,帮助你快速理解 MAC 与 PHY 之间的信号流:

硬件接口对比 —— MAC 到 PHY 的信号路径 MAC RGMII TXD[3:0], RXD[3:0] TX_CLK, RX_CLK TX_CTL, RX_CTL PHY 12 线 SGMII TXP/TXN(差分) RXP/RXN(差分) AC 电容(0.1uF) 2 对差分 QSGMII 一对 TX 差分 一对 RX 差分 5Gbps,含 4 个端口 2 对差分 PHY 根据配置 选择接收路径 不同接口的信号线数量与电气特性差异很大 调试前务必确认 PHY 的接口模式寄存器配置

嗯,图里的箭头表示了数据流向。你可以看到 RGMII 走的是并行总线,SGMII 和 QSGMII 走的是高速串行,差别一目了然。

实战两句话

  • RGMII 遇到问题先查时钟相位和 PCB 等长,别急着动寄存器。
  • SGMII / QSGMII 遇到问题先查 AC 电容位置、参考时钟干净度,再调发送幅度。

这个接口知识看着基础,但我在不少项目里看到有人把 RGMII 的差分时钟当普通时钟量,或者把 SGMII 的耦合电容焊反了极性。你想想,要是能先花十分钟确认这些硬件细节,后面能省多少排查时间。