4. Training Pattern概念
说到训练模式,也就是 Training Pattern,很多刚接触高速链路设计的朋友会觉得这玩意儿有点抽象。坦白讲,我刚开始做 FRL 相关项目的时候,也觉得这只是个“握手信号”。直到有一次硬件调不通,查了三天才发现是训练序列没选对。嗯,从那以后我再也不敢轻视它了。
训练模式,说白了就是发送端和接收端在正式传数据之前,先发一段特定的序列,用来做链路的“热身运动”。这个热身过程有几个很重要的目的:调整均衡器参数、锁定时钟、对齐数据通道。你想想看,高速信号在 PCB 上跑,损耗、反射、串扰一堆问题,如果没有训练序列直接上业务数据,那大概率会出错。
训练模式的核心作用: 在实际数据传输之前,通过发送特定已知序列,使发送端与接收端完成物理层参数配置,包括但不限于均衡器系数、时钟数据恢复(CDR)锁定、通道对齐等。
4.1 训练模式到底在干嘛?
我个人习惯把训练模式比作“两人对暗号”。发送端说“我发个 101010 你先看看”,接收端收到后,根据这个已知序列去算自己的均衡器该调多少,时钟该往哪移。调好了,接收端回个“OK”,然后才开始正式传数据。
实际项目中,训练模式做得不好,最常见的问题就是链路建立失败,或者建链时间过长。我记得有一次调试 FRL 4-lane 链路,其中一条 lane 的均衡参数怎么都配不对,后来发现是训练序列长度不够,接收端还没来得及收敛就被中断了。避坑指南:我曾经在某个项目中,把训练序列的重复次数设成了最小值,导致高温下链路不稳定。后来改成了协议推荐的中等值,问题就解决了。
训练模式主要做三件事:
- 时钟恢复锁定: 接收端通过训练序列的边沿信息锁定时钟相位。
- 均衡器自适应: 根据训练序列的幅度和抖动信息,调整 CTLE、DFE 等参数。
- 通道间对齐: 多通道链路中,各通道的训练序列需要同步对齐,保证数据重组正确。
我的建议: 在系统级测试时,不要只看建链是否成功,还要关注建链时间。训练时间过长,会影响用户体验;过短,均衡可能没收敛。建议用协议推荐值的两倍作为初始配置,稳定后再根据实测结果调整。
4.2 常见训练序列类型
训练序列不是随便一串比特就行的,它需要具备一定的统计特性和结构。常见的训练序列主要有三种:PRBS、JTAG-like、特定协议模式。下面这张表能帮你快速了解它们的差异:
| 类型 | 描述 | 特点 | 典型应用 |
|---|---|---|---|
| PRBS | 伪随机二进制序列,PRBS7、PRBS9、PRBS15、PRBS31 等 | 频谱近似白噪声,能模拟真实数据的随机性 | 误码率测试、均衡器训练 |
| JTAG-like | 基于 JTAG 状态机结构的确定性序列 | 可重复、可预测,便于调试和边界扫描 | 链路初始化、故障定位 |
| 特定协议模式 | 根据协议规范定义的特殊码型,如 FRL Training Pattern 1/2/3 | 与协议强相关,包含控制信号和同步码字 | 协议协商、通道对齐 |
PRBS: 这是我最常用的序列,尤其是 PRBS7 和 PRBS31。PRBS7 周期短,适合快速测试;PRBS31 周期长,能模拟更复杂的数据样式。我在项目中遇到过,用 PRBS7 测试均衡器没问题,但换成 PRBS31 就出错了,因为 PRBS31 的长连 0 或长连 1 对 CDR 和均衡器的压力更大。所以,我建议至少用 PRBS15 做最终验证。
JTAG-like: 这种序列的特点是非常“规整”,它其实借鉴了 JTAG 的 TAP 状态机,按固定顺序切换状态。它的优势是可重复性极好,调试的时候你能复现每一步的状态。不过,它的统计特性和真正的业务数据差别较大,所以不适合做均衡器的精确训练,更多用于链路初始化的握手阶段。
特定协议模式: 这类序列是 FRL 标准里直接定义的。比如,Training Pattern 1 通常用于重建时钟,Training Pattern 2 用于均衡器训练,Training Pattern 3 用于通道对齐。这些序列的长度、码型、重复次数都在协议文档里写得清清楚楚。我的习惯是先照着协议规格把序列写出来,再用示波器抓实际波形比对,确认发送端和接收端的序列一致。
注意: 某些协议对训练序列的起始时间和持续时间有严格的时间要求。例如,FRL 要求在 Hot Plug Detect 之后很短时间内就要发送第一个训练序列,否则链路会陷入超时状态。我曾经因为初始化代码里多加了一个延时,导致链路训练失败,查了整整一个下午。
// 伪代码示例:训练序列选择逻辑
if (phase == INIT) {
send_sequence(JTAG_LIKE); // 先发握手
} else if (phase == EQ_TRAIN) {
send_sequence(PRBS15); // 再发 PRBS 做均衡
} else if (phase == ALIGN) {
send_sequence(PROTOCOL_TP); // 最后发协议序列对齐
}
4.3 我怎么选训练序列?
选训练序列没有固定的答案,但有几点经验可以考虑:
- 看链路速率: 速率越高,对训练序列的随机性要求越高。低速链路可以用较短的 PRBS,高速链路建议用 PRBS15 以上。
- 看协议约定: 如果设备需要符合某个标准(比如 DP、HDMI、USB),那训练序列必须按协议走,不能自己随便定。
- 看测试目的: 如果只是为了验证硬件能不能建链,用 JTAG-like 就行,简单可靠;如果要测试误码率,必须上 PRBS。
- 考虑兼容性: 多厂商互联时,最好使用协议中规定的特定序列,避免因为序列不匹配导致建链失败。
下面的 SVG 图展示了训练模式的核心流程,包括了三种常见序列在链路建立过程中扮演的角色:
从这张图里能看出来:发送端先生成训练序列,然后根据链路阶段选择具体的码型。接收端拿到序列后开始做均衡调整,调好了链路才算真正建立。
避坑提示: 不要把所有种类都跑一遍,那样太慢了。我的经验是:先跑一个短的 JTAG-like 确认链路能通,再跑 PRBS 做精细均衡,最后用协议模式做对齐。三步搞定,高效又可靠。