1. 链路训练概述:定义、目的、基本流程
1.1 为什么我们需要“链路训练”?
先聊点实在的。你想象一下,一条高速串行链路——比如 PCIe、USB 或 SATA——两端芯片一上电,它们之间有什么?
什么都没有。没有时钟对齐,没有数据边界,连差分电平都可能处于乱七八糟的状态。
核心矛盾:发送端用几百毫伏的差分包在 PCB 上跑,接收端必须从噪声中精确恢复数据。不发一段“握手信号”建立基本通道,后续的高速率传输全是纸上谈兵。
我十多年前第一次调 PCIe Gen2 的板卡时,就遇到过链路死活 Link Up 不上的情况。信号完整性问题、Rx 端均衡参数没设对……最后发现是训练序列没按规范发。从那以后,我养成了一个习惯:先保证链路训练过程能走完,再谈性能。
1.2 链路训练的定义
说白了,链路训练就是两端物理层在正式传用户数据之前,互相对齐、协商并建立一个稳定、可用的电气与协议层面通道的过程。
它不是一个简单的“hello”,而是一套有状态机、有时间跳转、有参数协商的完整流程。
| 维度 | 解释 |
|---|---|
| 电气层 | 消除 DC 偏移、校准均衡器、确定接收灵敏度 |
| 时间层 | 从比特流中恢复时钟,找到位边界 |
| 协议层 | 交换链路宽度、数据速率、Preset/系数等配置信息 |
1.3 链路训练的目的
归纳起来,训练要完成四件事:
- 检测对端存在:确保物理连接正常,对端芯片已上电。
- 恢复时钟与数据:接收端通过 CDR 电路锁定发送端 Bit 时钟。
- 均衡与 Preset 配置:发送端输出合适的幅值与预加重,接收端配置 CTLE/DFE。
- 协商链路参数:宽度、速率、模式等——最终双方一致,给出 Link Up 信号。
一个小经验:我曾遇到一块板卡,在低温下训练失败,高温却正常。后来发现是接收端 CDR 环路的锁定阈值太靠近信号眼图的闭眼点——训练时 Preset 没选对。所以很多实验室都强制在 -40℃ 和 85℃ 下各跑一遍训练流程。
1.4 基本流程:三大阶段
虽然不同协议(PCIe、USB3、SATA)细节有差异,但宏观流程大同小异。我习惯把它分成三个阶段:
- 电气空闲退出与检测:发送端由电气空闲状态切换为发送训练序列(TS)的状态。接收端检测到信号幅度变化,启动 CDR。
- 位锁定与符号锁定:接收端 CDR 锁定比特时钟,然后通过搜索训练序列中的特殊码型(如 COM 符号)找到 8b/10b 或 128b/130b 的符号边界。
- 训练序列交互与参数协商:双方互发带 Preset 与系数请求的训练集(TS1/TS2),调整发送参数,最终确认一致,进入 L0 状态(正常工作状态)。
容易踩坑的地方:我见过不少新手把“链路训练”简化为“发几个 Pattern 收回来就完了”。实际上,每个阶段都有超时计数器、状态跳转条件、错误重试机制。PCIe 的 LTSSM(链路训练与状态机)就有十多个子状态。
1.5 训练序列中的 Preset 与 Coefficient
既然咱们课程标题就是这个,我先提一句:Preset 本质上是发送端预定义的几组幅值/预加重/去加重组合。Coefficient 则是更精细的抽头调整参数,用于在训练过程中微调信号质量。
后面章节我会展开讲它们怎么在训练序列里协商、怎么用硬件寄存器配置。这里先记住一句话:
链路训练的最终目标,就是让接收端看到一扇足够明亮的“眼图”。Preset 和 Coefficient 就是帮你把眼图从“闭眼”调到“睁开”的两把扳手。
1.6 小结
- 链路训练是高速串行通信的“前戏”,没它后面什么都干不了。
- 三大阶段:电气空闲检测 → 位/符号锁定 → 训练序列协商。
- Preset 和 Coefficient 是发送端调整信号质量的核心手段,贯穿整个训练过程。
嗯,这一章就是个开胃菜。后面每一章都会落到具体的寄存器、时序、案例分析上。咱们下周见。