2. 链路训练的意义与基本流程

各位好。今天我们来聊聊链路训练——这个在高速串行链路里至关重要、却又容易被人忽略的环节。

我先说个真事。
几年前我调试一块PCIe 4.0的板子,链路死活上不了16GT/s。信号在示波器上看,眼图都快闭了。后来查了半天,发现是接收端的DFE tap系数压根没初始化到位,训练阶段就没通过。嗯,从那以后,我对链路训练的每个细节都特别上心。

2.1 为什么需要链路训练?

简单说,高速信号从发送端到接收端,会经过PCB走线、过孔、连接器、电缆……这些东西都会把信号搞“脏”。

主要问题有:

  • 反射:阻抗不连续,信号弹来弹去
  • 码间干扰(ISI):前一个bit的影响没消散,串到后一个bit上
  • 抖动:时钟与数据不同步,采样点飘移

所以我们需要均衡器——比如CTLE、DFE。但问题是,均衡器要调多大力度?DFE那几级tap给什么系数?信道特性不一样啊。同样一根线,接不同设备、不同温度,衰减都不一样。没法出厂写死。

链路训练就是干这个的:
在正式传数据之前,发端和收端先“握个手”,发一段已知的训练序列,收端根据收到的信号质量,自动调整均衡参数,直到眼图够亮,再进入正常通信。

核心意义:链路训练是自适应均衡的前提。没有它,接收端不知道信道长什么样,DFE就等于瞎子摸象。

2.2 链路训练的基本流程

不同协议(PCIe、USB3、SATA、以太网)的训练细节有差异,但骨架是一样的。我个人习惯把它拆成5个阶段:

  1. 启动初始化:两端上电/复位后,进入训练状态。电器参数先设成缺省值。
  2. 发送训练序列:发送端按协议要求,发出特定码型(比如PRBS、有序集)。
  3. 接收评估与调节:接收端分析收到的信号,看眼图质量、误码率。然后调节CTLE增益、DFE tap系数。
  4. 收敛判定:接收端发反馈给发送端,告诉它“好了”或“再来一轮”。双方来回几次,直到误差小于阈值。
  5. 锁定并切换:训练成功,锁定额外参数,进入正常数据传输模式。

注意,有些协议里还有“预加重/去加重”调节,本质也是训练的一部分。

链路训练基本流程图 1. 启动初始化 2. 发送训练序列 3. 接收评估 & 调节均衡 收敛? 未收敛,继续调节 5. 锁定 & 正常通信 注意:收敛判断通常 基于误码率或眼图 指标,不只有1轮。

实际项目里,这个循环可能跑几十次甚至上百次才收敛。
我曾经在一条长走线(30英寸+)的PCIe链路上,看到训练过程反复了20多轮才稳定。别惊讶,这是正常的。

2.3 训练过程中的关键角色

整个训练不是一个人在战斗,收端、发端、协议层都在参与:

角色 干啥
发送端 产生训练序列,根据反馈调节预加重/去加重
接收端 采样、评估信号质量,调节CTLE、DFE等均衡器
协议控制器 管理状态机,控制训练进度,处理超时/重试

2.4 训练序列怎么选?

训练用的码型不是随便拍的。常用的是伪随机序列,比如PRBS-7、PRBS-31。为什么?

  • PRBS频谱接近真实数据,能激发各种频率损耗
  • 统计特性已知,接收端可以计算误码率
  • 便于检测低频/高频响应,帮助均衡器精准调节

有些协议(如PCIe)用特定的有序集(Ordered Set)来做训练帧,比如TS1、TS2。它们比纯PRBS多了握手和配置信息。

坑:训练序列长度不能太短,否则统计不够,均衡参数偏了。但也不能太长,训练超时会卡在初始化阶段。
我记得有次优化一个USB3.0的板子,就是训练帧长度设得太短导致DFE系数误判,后来加长到512个符号就稳了。

2.5 训练失败怎么办?

不是你调一次就能成功的。实际板上可能遇到:

  • 信号太差:连基本锁相都不行,训练直接超时
  • 噪声干扰:接收端误判训练序列,朝错误方向调参数
  • 协议不匹配:两端版本或协商速率不对

遇到这种情况,我一般先检查通道损耗,再看供电纹波,最后看焊接或连接器问题。软件层可以增加训练重试次数,但治标不治本。

一句话总结:链路训练是高速接口的“起跑器”——没它,后面跑得再快也白搭。理解这个基本流程,你调起DFE来才能心里有数。