1. SGMII 协议概述

各位工程师朋友,咱们要开始聊 SGMII 了。很多刚接触这个接口的同事,总觉得它就是个“高速串行口”,其实没那么简单。我个人习惯把 SGMII 看作是 GMII 的“串行化分身”。它保留了 GMII 的所有功能,但换了一种更节省管脚、更抗干扰的物理形式。

说白了,SGMII 就是 Serial Gigabit Media Independent Interface 的缩写。它只用了 4 根信号线(一对发送、一对接收),就实现了千兆以太网 MAC 和 PHY 之间的通信。你想想看,GMII 可是需要 20 多根线的。所以,SGMII 在布线密度、引脚数上都占了优势。

1.1 为什么要有 SGMII?

我个人理解,这是芯片封装和 PCB 布线给逼出来的。我记得刚入行时,调试一块千兆交换芯片,MAC 和 PHY 是分开的。那时候还是用 GMII 接口,走线密密麻麻,尤其是时钟和数据线的等长约束,让人头大。后来 SGMII 一出来,吉比特信号只用两对差分线,布线简单太多了。

小提示: SGMII 不是凭空冒出来的。它本质上是 SerDes(串行器/解串器) 技术在以太网接口上的应用。你可以把 MAC 侧的并行数据(GMII 的 8 位宽)在发送时串行化,在接收时解串回去。这个转换过程,就是 SGMII 的核心。

1.2 SGMII 的信号定义

嗯,这里有个细节要讲清楚。SGMII 虽然没有 GMII 那么多信号线,但它的信号定义其实更“聪明”。我们来看一下它的信号线,我把它总结成下面这个表格:

信号名称 方向 功能简述
TXP / TXN MAC → PHY 发送差分对。从 MAC 到 PHY 的串行数据流。
RXP / RXN PHY → MAC 接收差分对。从 PHY 到 MAC 的串行数据流。
GTX_CLK MAC → PHY 参考时钟。MAC 提供给 PHY 的 125MHz 时钟。注意,这是 源同步 时钟。

你看,只有三个信号组。但你别看少,它承载的信息量可不小。SGMII 在串行数据流里,不仅嵌入了数据,还嵌入了 数据控制信号(TX_EN、TX_ER) 和 链路状态。比如,当 PHY 检测到远端链路未建立时,它会在接收数据流中插入特殊的“码组”,告诉 MAC:“伙计,连不上呢。”

避坑指南: 我曾经在项目中踩过一个坑。板子上 MAC 和 PHY 间用的 SGMII 接口,但 GTX_CLK 的时钟质量不过关。抖动稍微大了点,链路就是不能稳定协商。后来换了高精度晶振,问题才解决。
所以,时钟抖动 是 SGMII 链路调试中的“隐形杀手”。你在布局布线时,一定要给 GTX_CLK 提供干净的时钟源,走线也要做阻抗匹配。

1.3 SGMII 的链路建立流程

好了,信号线知道了,那这些线是怎么“握手”建立起链路的呢?这个流程非常重要,是后面所有调试工作的基础。下面这张图,是我根据实际调试经验画的。它展示了 SGMII 链路建立的核心过程:

SGMII 链路建立核心流程 MAC 侧 PHY 侧 步骤1: 上电&高速链路复位 步骤2: 时钟数据恢复 (CDR) & IDLE 码交换 步骤3: 链路能力协商 (速度/双工/流控) 步骤4: 链路确认激活 关键说明 1. 上电后,CDR 锁定到 1.25Gbps 的串行码流上。 2. 双方发送 /C/ 和 /I/ 码组维持 同步。 3. 在 Idle 码的间隙,插入 /C/ 码 传递配置信息。 4. 协商完成后,PHY 会锁存 “link_ok” 状态。 5. 双方都看到“link_ok”后, 数据通道才正式激活。

这个流程你记住四个字:先同步,后协商。上电后,双方的 SerDes 要先通过 CDR(时钟数据恢复)电路锁定到对方的码流上。这一步如果没完成,后面都是白搭。我记得以前调试一块 PHY 时,波形上看 CDR 一直锁定不了,最后发现是供电纹波太大,干扰了内部的 PLL。

核心知识点: SGMII 的协商过程是在 Idle 码 和 Config 码 之间完成的。它不像 GMII 那样有单独的握手信号线,而是把这些信息编码进了串行数据流里。具体来说,PHY 会从接收到的 Idle 码中提取出 /C/ 码组,解析出对方的能力。然后双方达成一致后,链路才宣告建立。

1.4 速度协商与双工模式

SGMII 的另一个优势是它支持 速度协商。千兆、百兆、十兆,它都能自适应。怎么做到的?说白了就是改变 SerDes 的速率。千兆是 1.25Gbps,百兆时降低到 125Mbps,十兆则是 12.5Mbps。你想想看,PHY 是怎么知道该用哪个速率?

答案就在 Idle 码中。PHY 在与 MAC 协商时,会通过码组告诉 MAC:我的以太网口支持什么速率。MAC 收到后,再把自己的能力发回去。两边一对比,选一个大家都支持的最高速率。这个过程中,数据线上的线速率其实是不变的(1.25Gbps),但是 PHY 内部会通过插入额外的 Idle 码来“降速”。

实际速率 SGMII 线速率 数据编码
10 Mbps 1.25 Gbps 每 8 个数据码中插 7 个 Idle 码
100 Mbps 1.25 Gbps 每 10 个数据码中插 9 个 Idle 码
1000 Mbps 1.25 Gbps 不插任何 Idle 码,全数据模式

这个表很直观吧?所以你看,SGMII 的线缆上始终跑着 1.25Gbps 的信号,但是有效数据率却不同。我在调百兆模式时,经常发现逻辑分析仪抓到的码流里,大部分都是 Idle 码。这时候你千万别觉得链路坏了,其实是正常的。

注意事项: 有些 FPGA 实现的 SGMII MAC 核,对于百兆和十兆的 Idle 码插入有严格的要求。比如,MAC 必须正确识别并丢弃接收到的 Idle 码,否则数据会错位。我曾经遇到一个 case,百兆时丢包严重,最后发现是 MAC 的设计里没有对 Idle 码做有效的过滤。

好了,咱们把 SGMII 的协议基础捋了一遍。从为什么会有它,到信号定义,再到链路建立的全流程。这个过程其实是后面所有调试工作的“地图”。只要地图画对了,定位问题就像顺着河流找源头一样清晰。