3. SGMII 链路建立流程总览
说实话,SGMII 这个接口看着简单,就一对差分发送、一对差分接收,外加一个时钟。但真要把它调通,尤其是第一次上板时,很多人会卡在“链路怎么也建不起来”这个坑里。
我记得最早接手一个项目,FPGA 和 PHY 对接,板子回来后死活 ping 不通。硬件同事说“是软件问题”,软件同事说“肯定是硬件没焊好”。最后我一查,AN(Auto-Negotiation)状态机根本没跑完。从那以后,我养成了一个习惯——先不看协议栈,先拿示波器看 AN 脉冲,再看寄存器状态。
这一章我把 SGMII 链路建立的完整流程拆开讲。你跟着捋一遍,以后碰到类似问题,心里就有谱了。
3.1 链路建立的三段式
SGMII 的链路建立,说白了就是三个大阶段:
- 物理层同步——让 SerDes 收发器对齐 bit 边界,得到稳定的码流。
- 自动协商(AN)——两端交换能力信息,协商出工作模式(速度、双工)。
- 链路确认与数据使能——MAC 和 PHY 握手完成,开始传实际数据。
每个阶段都有明确的“完成标志”,我一般叫它 checkpoint。你只要盯住这几个 checkpoint,调试效率能翻倍。
核心思维: 不要把链路建立看成一个黑盒。你要知道此刻状态机停在哪个步骤,然后对症下药。
3.2 总览流程图
下面这张图,是我自己总结的 SGMII 链路建立流程。每次调试时我都把它打印出来贴在工位上。你照着走一遍,基本不会漏。
3.3 每个阶段的关键点
3.3.1 上电与复位
这步看起来最简单,但翻车最多。我曾经遇到过板上 PHY 的复位引脚被电容拉太慢,导致 FPGA 都配完了,PHY 还没就绪。你想想看,链路怎么可能建得起来?
- 复位时序: 确保 PHY 的复位释放时间满足 datasheet 要求,一般至少几十 ms。
- 时钟稳定: 参考时钟(通常 125MHz)要等 PLL 锁定后再开始操作。
- 寄存器初始化: 有些 PHY 需要预配置,比如强制模式、LED 配置等,必须在 AN 开始前写好。
我的习惯: 复位后先读 PHY 的 ID 寄存器,能读回正确 ID,说明 MDIO 通路正常,这是第一步自检。
3.3.2 SerDes 同步(CDR 锁定)
SGMII 用的是源同步方式,时钟嵌入在数据流中。接收端依靠 CDR(时钟数据恢复)从串行数据里提取时钟。CDR 锁定的标志是 RX_CLK 稳定输出。
我记得有一次,PCB 走线太长导致信号衰减,CDR 总是锁定又失锁。后来在 PHY 端加大了接收均衡(EQ)才搞定。
- 检查 RX_CLK: 示波器看时钟频率是否准确(625MHz 或 312.5MHz,取决于速率)。
- 信号质量: 眼图是否张开?如果眼图闭合,先调 EQ 或检查 PCB 阻抗。
- 寄存器状态: 很多 PHY 有“Signal Detect”或“Link Status”位,可以先读。
注意: 有些 FPGA 的 SerDes 需要先手动复位接收端,再释放。顺序错了,CDR 可能永远锁不上。
3.3.3 自动协商(AN)流程
AN 是 SGMII 链路建立的核心。两端通过发送/接收 /C/ 码(配置码)来交换能力。协商过程大致是:
- 发送能力指示(速度、双工)。
- 接收对方的能力,并进行匹配。
- 双方确认后,进入“Acknowledge”状态。
- 最终切换为 /I/ 码(空闲码),表示协商完成。
这里我给大家一个避坑指南:
- 两端必须都支持 SGMII 的 AN 协议,否则需要强制设置主从模式。
- 如果一端是 PHY,另一端是 MAC(比如 FPGA 内部实现的 PCS),MAC 侧要扮演“PHY 的伙伴”,正确响应能力字。
- 我曾经遇到过 FPGA 实现的 PCS 没有正确解析 /C/ 码,导致协商永远卡在“能力交换”阶段。后来用逻辑分析仪抓到码流,才发现是字节序反了。
| 寄存器 | 地址 | 作用 |
|---|---|---|
| BMCR | 0x00 | 控制位,包括 AN 使能、重启 AN |
| BMSR | 0x01 | 状态位,包括 AN 完成、链路状态 |
| ANAR | 0x04 | 本端能力广播 |
| ANLPAR | 0x05 | 对端能力(协商结果) |
3.3.4 协商成功与数据使能
AN 完成后,PCS 状态机从“Config”状态进入“Data”状态。此时链路已建立,MAC 和 PHY 之间开始传输正常数据包。
但有个容易忽略的点:
- 延迟补偿: SGMII 要求两端测量并补偿线路延迟。这个一般在 AN 完成后通过交换特定的 /A/ 码完成。
- 特殊码: 在数据模式下,空闲时发送 /I/ 码(0xFB),错误时发送 /E/ 码(0xFE)。
终极检查: 当链路建立后,你可以发送一个已知的测试包(比如全 0x55),看接收端能否正确还原。这是验证整个通路最简单有效的方法。
3.4 时序调试的思维框架
我个人调试 SGMII 链路时,始终遵循一个三步法:
- 看时钟: 所有时钟(参考时钟、RX_CLK、TX_CLK)频率是否正确,抖动是否在范围内。
- 看状态: 读 PHY/PCS 的状态寄存器,确认当前状态机停在哪个阶段。
- 看码流: 用示波器或逻辑分析仪抓取 SerDes 线上的码型,确认是否在发 /C/ 码或 /I/ 码。
你想想看,如果第二步看到“AN 完成”位已经置 1,但链路还是不通,那问题大概率不在 PHY 侧,而在 MAC 侧的数据通路。这就是分开排查的好处。
嗯,这一章对流程总览的梳理就到这里。后面几章我们会深入到每一个阶段的具体时序和调试方法。你可以先把这张流程图存下来,下次调试时直接对照着走一遍,能省不少时间。