3. 链路训练概念:自动协商与链路训练的区别,链路训练目的
好,咱们进入第3章。说实话,很多人一上来就把「自动协商」和「链路训练」混为一谈。我刚开始接触RGMII时也犯过这个错。两个概念确实有关系,但干的活完全不同。
今天咱们就把这事掰扯清楚。搞明白它们各自管什么,以及链路训练到底要解决什么核心问题。
3.1 自动协商——老把式,管的是「能不能通」
自动协商是什么?说白了,是两个PHY芯片见面之后的第一次握手。它负责回答一个问题:咱俩以什么速度、什么双工模式来通信?
你想想看,一块百兆网卡和一块千兆交换机连在一起,总得有个商量。自动协商就是干这个的。
具体到RGMII场景,自动协商完成以下几件事:
- 确定链路速度(10/100/1000 Mbps)
- 确定双工模式(半双工/全双工)
- 确定流控能力(是否支持PAUSE帧)
- 基于 Clause 28 标准,通过MDI/MDIX接口发快速连接脉冲(FLP)
好了,到此为止。自动协商的工作就结束了。它不管信号延时,不管时钟相位,不管数据对齐。它只负责搭起一座桥,至于这座桥具体怎么走——那是别人的事。
3.2 链路训练——精细活,管的是「通得好不好」
好,现在链路物理上是通了。但问题来了——信号在PCB走线上、在连接器上、在电缆上,会有延时。这个延时如果你不处理,接收端采样时就会采到错误的比特。
链路训练就是干这个精细活的。它不关心速率(那个自动协商已经定好了),它只关心每个焊盘、每个比特的延时校准。
| 对比维度 | 自动协商 | 链路训练 |
|---|---|---|
| 目的 | 建立物理链路,确定速率和双工模式 | 校准信号延时,保证数据正确采样 |
| 工作阶段 | 链路建立前期 | 链路建立后、数据传输前 |
| 处理对象 | 速率、双工、流控 | 时钟相位、数据对齐、延时偏差 |
| 触发方式 | 硬件自动或软件手动触发 | 通常由MAC或PHY的寄存器控制 |
| 执行时间 | 毫秒级(几百ms) | 微秒级到毫秒级 |
| 标准支持 | IEEE 802.3 Clause 28 | RGMII v2.0 / v2.1 或自有协议 |
看到没有?一个管宏观,一个管微观。我特别喜欢这个类比:自动协商好比两个人确定用中文聊天,链路训练则是调整麦克风的音量、消除回音,让每个字都听得清楚。
3.3 链路训练到底要干什么?三个核心目的
说到这,你应该已经猜到链路训练的目的了。但为了严谨,咱们还是列清楚:
- 消除焊盘延时偏差
每根数据线(D0~D3,还有控制线)的PCB走线长度不可能完全相等。就算你画等长线,过孔、连接器、阻抗突变也会引入微小差异。链路训练就是一组一组地测,把每个焊盘的附加延时找出来。 - 锁定时钟与数据的相位关系
RGMII双沿采样,对时钟边沿要求很严格。如果时钟到达接收端的时刻正好落在数据跳变沿上,那就直接GG。链路训练会微调时钟相位,保证采样点落在数据眼的正中间。 - 补偿温度和电压波动
这是很多人忽略的。设备运行一段时间后,温度升高,或者电源电压轻微波动,走线的延时都会变。链路训练可以周期性地重新校准,让延时补偿一直有效。
核心一句话:链路训练的目的,就是让每个比特在正确的时间被正确的电路采样到。 其他所有动作都是为这个目标服务。
3.4 一张图看懂:自动协商 + 链路训练的协作关系
下面这张SVG图,把刚才讲的两个概念在链路中的作用位置画出来了。你一看就知道谁先谁后、各自管什么。
3.5 避坑指南:我踩过的坑
我曾经在一个FPGA驱动RGMII PHY的项目中,把自动协商的完成当成链路可用的标志。结果呢?PHY显示链路Up了,但MAC发出去的包收不到正确响应。
查了三天。最后发现是链路上的数据位D2比D0多走了半英寸,导致采样出错。那时候FPGA内部没有做链路训练,问题就是解决不了。
这个坑的关键在于:很多人想当然地以为RGMII是同步接口,时钟和数据天然对齐。实际上走线延时、器件延时都会破坏这个对齐。链路训练就是专门来弥补这个缺陷的。
3.6 本章小结
这一章没有复杂公式,但概念层级非常重要。我习惯用一句话帮自己记忆:
自动协商决定「能不能通」,链路训练保证「通得稳」。
这两个阶段一前一后,缺一不可。自动协商搞定后,链路训练才开始干活——校准每一个比特的延时,消除误差,让RGMII在高速下还能稳定工作。