速度协商机制:Gen1 / Gen2 / Gen3 / Gen4

这一章咱们聊聊速度协商。说白了,就是PCIe链路从最慢的Gen1开始,一步步往上握手,直到双方能支持的最快速度。这个过程要是出了问题,Polling阶段就会卡住。

我个人习惯把速度协商拆成两层看:硬件握手(Link Training)和 协议层确认(Data Rate Negotiation)。前者由LTSSM状态机控制,后者靠TS1/TS2训练序列里的速率ID字段。你想想看,要是哪位工程师只盯着协议分析仪,却不看SerDes的EQ参数,那多半要踩坑。

硬件握手:LTSSM里的速度状态

LTSSM基础流程里,Polling之后就是Configuration、Recovery。速度升级其实就发生在这些阶段。我遇到过好几次,Polling卡住就是因为链路直接跳到了Recovery,却没能完成速度变更。

以下是各代速度协商的核心差异:

代际 编码方式 单通道带宽 实际数据速率 EQ过程是否需要
Gen1 (2.5 GT/s) 8b/10b 250 MB/s 80% 有效 否
Gen2 (5 GT/s) 8b/10b 500 MB/s 80% 有效 否
Gen3 (8 GT/s) 128b/130b ~984.6 MB/s 98.5% 有效 是(Receiver EQ)
Gen4 (16 GT/s) 128b/130b ~1969 MB/s 98.5% 有效 是(更复杂的EQ)

看到没有?从Gen3开始,编码变了,效率上去了,但也带来了接收端均衡(EQ)的硬性需求。这可是Polling卡顿的高发区。

训练序列(TS)和速率ID

每次LTSSM状态切换,两端会互发TS1或TS2。TS里有个Link Data Rate字段,决定了下个状态要协商到的速度。举个例子,当链路从Configuration进入Recovery时,发送端会在TS里带上自己支持的速度集合。

// 伪代码逻辑:速度协商的TS字段解析
if (TS.Header.RateID == Gen3) {
    // 如果不是Gen3速度,跳回Gen2
    next_state = Config.Linkwidth;
} else {
    // 触发EQ过程
    start_equalization();
}

我遇到过一个问题:上游设备TS里RateID一直发Gen2,但下游EP只能支持Gen3。结果链路不停在Configuration和Recovery来回跳,Polling超时。嗯,这种问题要看链路层Log,光看物理层波形根本找不到根因。

Gen3 / Gen4 的 EQ 过程

从Gen3开始,接收端必须通过EQ调整CTLE、DFE、VGA等参数。这个过程涉及8个Phase(Phase 0 ~ Phase 3,然后Repeat 2次)。每个Phase里,发送端发Preset,接收端回给Coefficient。说白了,就是互相校准信号。

核心要点:EQ过程的失败往往表现为Polling状态卡在Polling.Active或Polling.Compliance。我曾经在Gen4项目里见过,因为接收端的DFE收敛太慢,直接导致系统里所有x16槽位都跑到Gen3去了。

以下是Gen3/Gen4 EQ过程的基本步骤:

  1. 进入Recovery.Eq0:发送端开始发Preset
  2. Phase 0:接收端用默认参数尝试,并请求更新
  3. Phase 1/2/3:逐步调整CTLE、DFE tap系数
  4. Repeat阶段:再次检查参数是否稳定
  5. 如果EQ成功,回到Recovery.RcvrLock,正式锁定Gen3/Gen4

EQ的一个关键点:Preset值不对。很多主板上的PCIe Slot走线很长,但Preset是按short channel预设的。结果EQ过程中接收端收不到合格的preset信号,只好回退到Gen2。

踩坑经验:我曾经调过一块FPGA的PCIe IP,EQ过程里它总是报EQ Phase 2 time-out。最后发现是参考时钟抖动超标。时钟一稳,EQ就过了。所以,Polling阶段卡顿千万别只盯着SerDes,先看看时钟质量。

速度协商流程图

下面这张图展示了从硬件复位到最终完成速度协商的完整路径。注意,一旦某一步失败,链路会回退到Gen1重试。

PCIe速度协商原理流程图 速度协商流程(Gen1→Gen4) 复位(硬件复位 / 上电) Detect / Polling → Gen1 强制锁定 Configuration / Recovery(解析RateID) Gen2 仅支持 Gen3 / Gen4 锁定 Gen2 进入 EQ 过程 Phase 0~3,Repeat 2次 锁定 Gen3/Gen4 EQ失败,回退到Gen1 备注: Gen1/Gen2不需要EQ,直接锁定;Gen3/Gen4必须经过Receiver EQ才能建立稳定链路。 Polling阶段卡顿经常源于EQ失败导致链路回退到Gen1重训。

不同代际在Polling阶段的常见卡顿点

我把自己的排查经验总结成了一张表,你Debug的时候可以对照着看一下:

速度代际 常见Polling卡顿现象 个人遇到过的主要原因
Gen1 Polling一直检不到正向/反向时钟锁 参考时钟丢失、差分阻抗不对
Gen2 Polling成功后进Configuration速度协商失败 Tx预加重没配好(我在某Arm开发板上就遇到过这个)
Gen3 进入Recovery后EQ Phase 0卡死 Preset参数不是本地最佳值(建议查板级走线长度再重新算)
Gen4 EQ Phase 2/3反复失败 接收端DFE适应性不够,或通道损耗超标

排查小技巧:我习惯在逻辑分析仪上抓取Polling到Configuration的LTSSM状态跳变。如果看到链路从Polling直接跳到Recovery,再返回Detect,那基本就是速度协商不成功。下一步就是看TS里的RateID对不对,EQ Phase Log里有没有报错。

实践排查思路

当你怀疑是速度协商导致的Polling卡顿,我会按以下步骤来:

  1. 确认初始速率:用逻辑分析仪看Polling阶段是否锁在Gen1(2.5GT/s)上。如果不是,先查物理层时钟和数据锁定。
  2. 捕获TS序列:看TS1/2里的RateID字段。如果一直走Gen2但设备本应支持Gen3,查一下软件/固件有没有设置正确的最高速率。
  3. 检查EQ过程:对于Gen3/Gen4,用协议分析仪捕获EQ Phase 0到Phase 3的所有Preset/Coefficient交换。Preset值是不是0xFF?Coefficient有没有超范围?
  4. 回退机制验证:如果链路反复回退到Gen1,检查一下是不是Tx/Rx的预加重或均衡参数配置冲突。

嗯,说到回退,我记得在某次Xeon平台上遇到过系统只认Gen1。最后发现是BIOS里某个PCIe Gen Speed选项被锁定在1.0了。更新BIOS后一切正常。这种跟速度协商有关的坑,你别只顾着看硬件,BIOS和BSP里的参数同样关键。

总结一下我的个人习惯:

  • 先做物理层眼图,确保Gen1就能把信号送通
  • 再抓TS序列,确认RateID协商逻辑
  • 最后死磕EQ参数,尤其是Gen4的DFE收敛速度

好,这一章我们重点讲了Gen1到Gen4的速度协商差异。EQ不再是可有可无的选项,而是Gen3以上链路的必经之路。下次遇到Polling卡住,别忘了先看速率升级失败的那一步。