2. PCIe基础回顾

要理解PCIe均衡参数为什么会影响性能,必须先回到PCIe协议本身。PCIe不是一条“插上就能全速跑”的简单总线,而是一套分层、可协商、可训练的高速串行互连协议。均衡(Equalization)并不是孤立存在的可调参数,它是在链路训练过程中被协商、被写入、被验证的链路能力的一部分。本节从协议层次、链路训练、LTSSM状态机、速率演进四条线索出发,说明均衡是在什么背景下被引入的。

一、PCIe协议层次:均衡发生在物理层内部

PCIe采用典型的三层结构,并在软件视角上叠加事务层与数据链路层的语义。真正与均衡直接相关的是物理层(Physical Layer),它又分为逻辑物理层和电气物理层。

  • 事务层(Transaction Layer):负责TLP的组装与解析,处理Memory、IO、Config、Message等请求,关注的是“读写什么地址、返回什么数据”。
  • 数据链路层(Data Link Layer):负责DLLP、ACK/NAK、重传与流控信用,保证TLP可靠传输。
  • 物理层(Physical Layer):负责字节条带化、加扰、编码、串并转换、发送与接收,以及链路训练和均衡。均衡参数(如Tx Preset、Tx FFE、Rx CTLE/DFE)都在这一层生效。

因此,当我们在系统里看到“链路速率降级”“误码率升高”“训练失败”时,问题往往不在事务层,而在物理层的信号完整性。均衡参数正是物理层为补偿信道损耗而设置的“预加重/去加重”和“接收均衡”组合。

二、链路训练:从检测到均衡的协商过程

PCIe链路不是上电即用的,而是通过链路训练(Link Training)逐步建立。训练的核心目标是:确认链路宽度、确认链路速率、确认比特锁定与符号锁定,并在高速率下完成发送端与接收端的均衡协商。

链路训练大致经历以下阶段:

  1. 检测(Detect):检测对端是否存在,确认接收端有终端匹配。
  2. 轮询(Polling):交换TS1/TS2有序集,确认链路宽度和基本能力。
  3. 配置(Configuration):协商链路号、通道映射,确定Link Width。
  4. 恢复(Recovery):在速率切换或错误恢复时重新进入,完成比特锁定与符号锁定。
  5. L0:进入正常工作状态,开始传输TLP/DLLP。

在Gen3及以上速率中,Recovery阶段会进一步进入均衡协商子状态。发送端和接收端通过TS1/TS2中的Preset、Coefficient等字段交换能力,接收端评估眼图,发送端调整FFE系数,直到双方达成可接受的链路质量。这个过程不是一次性的,链路在速率切换、错误恢复、电源状态变化后都可能重新训练。

关键点:均衡参数不是“配置一次就固定”的静态值,而是链路训练过程中动态协商的结果。训练失败或协商到不合适的Preset,会直接导致链路降速或反复重训。

三、LTSSM状态机:均衡协商发生在哪些状态

LTSSM(Link Training and Status State Machine)是PCIe物理层的核心状态机。它定义了链路从Detect到L0、再到L1/L2/L3等低功耗状态的完整迁移路径。与均衡最相关的是Recovery状态及其子状态。

下面用一张状态关系图展示LTSSM的主要状态与均衡协商的位置。图中突出Recovery下的均衡子状态,以及它与L0、Configuration、Detect之间的迁移关系。

LTSSM 主要状态与均衡协商位置 Detect 检测对端 Polling 交换TS1/TS2 Configuration 协商宽度/通道 Recovery 比特/符号锁定 速率切换与均衡协商 L0 正常工作,传输TLP/DLLP L1 低功耗待机 L2 / L3 深度低功耗/关闭 Recovery 下的均衡协商子状态(Gen3+) Phase 0 交换Preset能力 Phase 1 发送端FFE调整 Phase 2/3 接收端评估眼图 均衡协商结果:Preset / Coefficient 写入链路配置,决定后续误码率 训练成功 速率切换/错误恢复 协商完成回到Recovery

从图中可以看到,均衡协商并不是独立于LTSSM之外的过程,而是Recovery状态内部的一个子流程。链路只有在均衡协商完成后,才能稳定进入L0。如果协商结果不理想,链路可能停留在Recovery反复重试,表现为“链路反复掉速”或“训练超时”。

四、速率演进与均衡引入背景

PCIe速率演进是均衡被引入的直接驱动力。随着速率提升,单位UI(Unit Interval)变短,信道损耗、反射、串扰和抖动对信号的影响急剧放大。

代际 速率 编码方式 均衡需求
Gen1 2.5 GT/s 8b/10b 基本无需均衡,信道裕量充足
Gen2 5.0 GT/s 8b/10b 开始关注去加重,Tx Preset初步使用
Gen3 8.0 GT/s 128b/130b 强制引入Tx FFE与Rx均衡,均衡协商成为训练必需环节
Gen4 16.0 GT/s 128b/130b 均衡系数更精细,Preset组合更多,对信道要求更高
Gen5 32.0 GT/s 128b/130b 均衡成为链路能否工作的关键,DFE/CTLE/FFE联合优化

可以看到,Gen3是一个分水岭。Gen1/Gen2时代,信道损耗相对较小,发送端简单的去加重就能满足需求;到了Gen3,Nyquist频率升高,PCB走线、连接器、过孔带来的插入损耗显著增加,接收端眼图几乎闭合。此时必须通过发送端FFE(前馈均衡)和接收端CTLE/DFE共同补偿,才能打开眼图。均衡参数因此从“可选优化”变成“链路能否建立”的必要条件。

理解这一点很重要:均衡参数影响性能,不是因为它改变了协议语义,而是因为它决定了物理层眼图是否张开、误码率是否足够低。眼图闭合时,链路会通过重传和降速来维持连接,性能自然下降。

五、常见误区与复盘

  • 误区一:均衡参数只影响信号质量,不影响带宽。实际上,均衡协商失败会导致链路降速或反复重训,直接损失有效带宽。
  • 误区二:Preset越大越好。Preset需要与信道损耗匹配,过补偿会引入额外抖动和串扰,反而恶化眼图。
  • 误区三:链路训练一次成功就永远稳定。温度变化、电源噪声、插拔和速率切换都会触发重新训练,均衡参数需要在整个工作范围内保持鲁棒。
  • 复盘建议:遇到链路降速时,先确认LTSSM是否稳定在L0,再检查Recovery阶段的均衡协商日志,最后结合信道损耗和Preset配置定位问题。
# 查看PCIe链路速率与宽度(Linux示例)
lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"

# 典型输出关注点:
# LnkCap: Speed 32GT/s, Width x16
# LnkSta: Speed 16GT/s, Width x16   <-- 实际降速,需排查均衡/信号完整性

总结来说,PCIe协议层次决定了均衡发生在物理层,链路训练决定了均衡何时被协商,LTSSM的Recovery状态是均衡协商的舞台,而速率演进则是均衡被强制引入的根本原因。只有把这几条线索串起来,后续讨论均衡参数对性能的具体影响时,才能准确判断问题出在训练、信道还是参数配置上。