Training Sequences 概述
做高速串行协议分析这么多年,我碰到最多的一个问题就是:“为什么我的链路就是练不起来?” 很多人查遍寄存器、翻烂手册,最后发现——问题出在 Training Sequences 上。
Training Sequences,简称 TS。说白了就是一串预定义的比特流。链路刚开始建立的时候,发送端和接收端谁都不认识谁,TS 就是它们互相打招呼、做校准的工具。我习惯把它叫做“链路的握手信号”。
TS 是什么?长什么样?
不同协议里的 TS 格式不同。拿 PCIe 举例:TS1 和 TS2 各 16 个符号,包含 Ordered Set 头、链路号、通道号、速度标识、均衡控制等等。USB3.x 的 TS 更复杂,带极性反转、Scrambler 重置标志。但所有 TS 都有一个共同点——接收端能靠它判断链路状况、调整接收参数。
// PCIe TS1 Ordered Set 结构(我简化过的)
Symbol 0: COM (K28.5) // 控制字符
Symbol 1: Link Number // 链路编号
Symbol 2: Lane Number // 通道编号
Symbol 3-4: FTS / SKP 参数 // 快速训练序列
Symbol 5-15: 保留 & 均衡位 // 协商均衡系数
嗯,这里要注意:有些协议的 TS 是连续发的,有些只在特定阶段发。抓波形的时候如果没选对触发条件,很可能白抓一整天。
为什么需要 Training Sequences?
你想想看,一根高速差分线上跑的速率动不动就是几 Gbps,甚至几十 Gbps。信号经过 PCB、连接器、线缆,早就畸变得不成样了。这时候接收端内部有均衡器(CTLE、DFE),有 CDR(时钟数据恢复),有极性检测……这些模块都需要一个“理想参考信号”去训练自己。TS 就是那个参考信号。
我个人经验是,80% 的链路训练失败,都能在 TS 阶段找到征兆:
- TS 里出现 CRC 或 8b/10b 编码错误 —— 说明通道噪声太大
- TS 的振幅异常 —— 可能是发送端摆幅没设对
- TS 的边沿抖动超标 —— CDR 锁不住,后续数据全崩
典型应用场景
几乎所有主流高速串行协议都依赖 Training Sequences。下表列出了几种常用协议的 TS 特点:
| 协议 | TS 名称 / 阶段 | 关键作用 | 我踩过的坑 |
|---|---|---|---|
| PCIe(Gen2/3/4/5) | TS1 / TS2 / EQ TS | 链路号协商、速度协商、均衡系数训练 | Gen4 均衡训练阶段 TS 数量有限,误码率测试仪不够准 |
| USB 3.x | TSEQ / TS1 / TS2 | 极性检测、Scrambler 同步、均衡训练 | USB 3.2 Gen2x2 用双通道,TS 必须对齐,否则掉链路 |
| SATA / SAS | OOB + ALIGN | 带外信号握手、字节对齐、速率协商 | SATA 的 OOB 信号很弱,电压门限设错就检测不到 |
| DisplayPort | CP / EQ / CR 阶段 | 时钟恢复、通道均衡、链路配置 | DP 1.4 的 HBR3 速率训练常常卡在 EQ 阶段,需要看 TS 里的 Pattern 是否正确 |
一个实战技巧: 我建议你在协议分析仪里把 TS 的触发条件设定为“检测到任意 TS Ordered Set”,然后缓存一段时间深度(至少 1ms)。这样即使链路训练失败,你也能回放完整的训练过程。很多工程师只盯着 Link Up 状态,错过了 TS 阶段的异常。
TS 在整个链路训练中的位置
下面这张图是我自己画的,帮你把 TS 放到链路训练的全局里看。发送端先发 TS,接收端收到后做均衡和时钟恢复,然后反馈调整参数,循环直到链路稳定。
我的小习惯: 抓完 TS 后,我会第一时间查看接收端均衡系数的变化。如果系数在 TS 训练过程中一直不变,说明要么接收端没收到正确的 TS,要么均衡算法卡在局部最优。这时候我会去检查 TS 的振幅和边沿,而不是盲目改协议参数。
说了这么多,其实就一句话:Training Sequences 是高速串行链路的命门。懂它,你就抓住了链路分析的核心。抓 TS 不是盲抓,得知道它什么时间出现、长什么样、哪个字段管什么。