第三章:Polling 状态详解——位锁定、符号锁定与 Compliance

进入 Polling 状态,说明链路已经从 Detect 阶段走出来,物理层开始认真干活了。我个人觉得,Polling 是整个 LTSSM 里最容易出问题的环节之一,因为这里要同时完成两个硬同步:位锁定和符号锁定。很多板子卡在 Polling 不动,十有八九是这两步没走通。

核心结论:Polling 状态的任务就是让接收端恢复出正确的时钟、定位到数据流的 bit 边界,然后再找到 10-bit 字符的起始位置。做完这些,才能进入 Configuration 开始链路宽度协商。

3.1 位锁定(Bit Lock)——从模拟到数字的第一步

链路一开始只是差分的模拟信号,接收端要先恢复出时钟,然后用这个时钟采样数据。位锁定,说白了就是接收端的 CDR(时钟数据恢复)电路找到了采样点,能正确区分每个 bit 是 0 还是 1。

实际经验:我曾经遇到一款 FPGA,CDR 的环路带宽设得太窄,导致位锁定时间超过 20ms,直接把 LTSSM 超时踢回了 Detect。后来把带宽调大一档,问题消失。

位锁定需要特定的训练序列。Gen1/Gen2 发的是 TS1/TS2 中的 COM 字符吗?不,COM 是符号同步用的。位锁定其实靠的是 连续的 Electrical Idle Exit 后的差分信号 或者 特定的 40-bit 序列(比如 Gen3 的 Equalization Sequence)。不过对于 Gen1/Gen2,Polling 一开始发送的是 TS1 Ordered Set,但接收端首先需要锁定到 bit 对齐,然后才能解析出 COM。

所以实际流程是这样的:

  1. 发送端发送连续的 TS1 Ordered Set(Gen1/2)或特定的训练序列(Gen3)。
  2. 接收端 CDR 尝试锁定到位时钟。
  3. 锁定后,接收端开始按 1 bit 间隔滑窗检测 COM 字符。
  4. 位锁定成功后,进入符号锁定阶段。

注意:如果链路信号质量差(ISI、串扰),CDR 可能锁定到错误的相位上。一个常见现象是位锁定看起来成功了(CDR 输出有数据),但符号锁定一直失败——说明采样点不对,误码率很高。

3.2 符号锁定(Symbol Lock)——找到 10-bit 的边界

PCIe 是 8b/10b 编码(Gen1/2)或 128b/130b 编码(Gen3)。符号锁定就是要找到 10-bit(或 130-bit)字符的起始位置。接收端在连续的比特流里寻找 COM(K28.5) 字符,它的 10-bit 模式是 1100000101(加上 Running Disparity 有正负两种)。一旦检测到 COM,就知道后面每个 10-bit 的边界了。

我记得有一次调试,RX 眼图很好但就是锁不上符号。查了很久发现是发送端 TS1 里的 COM 被预加重过度削平了,导致高带宽的接收端把 COM 误识别成了普通数据字符。嗯,这里要注意:预加重的设置不能过度,尤其是在背板场景。

符号锁定的判定条件很简单:连续收到 两个有效的 COM 字符(中间间隔一个符号位),就认为符号锁定成功。然后状态机从 Polling.Active 进入 Polling.Configuration。

3.3 Polling.Active vs Polling.Compliance——两个完全不同的分支

很多人混淆这两个子状态。看名字好像 Active 是正常干活,Compliance 是合规测试。其实在逻辑上,它们并行的两个去向:

子状态触发条件行为退出条件
Polling.Active正常进入 Polling发送 TS1/TS2,等待位锁定+符号锁定符号锁定成功 → Polling.Configuration;超时 → Detect
Polling.Compliance硬件特定位置位(如 Compliance 模式引脚)或无法完成位锁定后的备选发送特定的 Compliance Pattern(重复的 K28.5-/D10.2 )接收端检测到 Compliance Pattern 后进入 Loopback 或等待退出

实际项目中,绝大多数情况只会进入 Polling.Active。Polling.Compliance 主要给测试仪器用,或者当链路无法正常建立时,作为“诊断模式”强制输出固定图案。我建议调试时不要直接按 Compliance 模式测试,因为它跳过了正常的 TS 交换,很难定位是哪个环节出问题。

3.4 Gen1/2/3 的差异——Polling 阶段的大区别

不同代的 PCIe,Polling 阶段做的事情差不多,但细节参数差很多。我用一个表格把关键差异列出来:

特性Gen1 (2.5 GT/s)Gen2 (5 GT/s)Gen3 (8 GT/s)
编码方式8b/10b8b/10b128b/130b
位锁定方式CDR 锁定到 2.5 GHz 时钟CDR 锁定到 5 GHz 时钟CDR 锁定 + 专用 Equalization 序列
符号锁定参考COM (K28.5) 字符,需连续 2 个COM (K28.5) 字符,需连续 2 个EIEOS 块 + 128b/130b 块同步序列
Polling 帧结构TS1 Ordered Set(每 16 符号重复)TS1(与 Gen1 相同)EIOS + 训练序列 TS1/TS2(以 EQ 序列开头)
位锁定超时最大 20ms(训练时间)12ms24ms(含 Equalization 时间)
Compliance PatternK28.5-/D10.2 重复同 Gen18 GHz 时钟下的调制图案,符合 Gen3 电气规范

这里有一个我踩过的坑:Gen3 的位锁定其实包含了 Equalization 过程,接收端需要发 EQ 序列让发送端调整去加重和摆率。而 Gen1/Gen2 不需要 Equalization。所以如果你拿 Gen3 的 Root Complex 去接 Gen2 的 Endpoint,Link 会自动降速,但 Equalization 仍然会在 Gen3 的 Training 阶段做一遍(虽然对方不支持,会忽略)。这个交互很容易导致 LTSSM 卡在 Polling,因为 Gen3 设备等 EQ 回应,Gen2 设备根本不发。

调试技巧:当链路降速不成功时,抓一下 Polling 阶段的 TS 数据。如果看到 Gen3 的 Root Complex 在发 EQ 序列,而 Endpoint 回的是 TS1(Gen2 的行为),说明两边对 bit 率的认知不一致。强制锁定 Gen2 速率再测,通常能快速定位。

3.5 Polling 状态机流程图——一眼看懂所有分支

Polling 状态机子状态流程图 Polling 状态机子状态流程图 Polling.Entry 自动进入 Polling.Active 进行位锁定 + 符号锁定 发送 TS1/TS2 符号锁定 OK Polling.Configuration 位锁定超时 Polling.Compliance 超时/退出 Detect 总超时

这张图把 Polling 内部的分支画清楚了。注意 Active 有两个出口:成功去 Configuration,失败去 Compliance 或直接回 Detect。超时阈值在 Gen 之间有差异,但原理都一样——别死等。

3.6 实际调试 checklist

我把平时在实验室排查 Polling 问题的步骤整理出来,希望对你有用:

  • 第一步:检查电气信号——用示波器看差分幅度、上升时间、抖动是否符合对应的 Gen 规范。我见过很多弱信号导致 CDR 无法锁定。
  • 第二步:抓包看 TS 序列——用协议分析仪捕获 Polling 阶段的原始数据。确认发送端在发 TS1(COM 开头),接收端是否有回复 TS1/TS2。如果一方不发,那肯定是状态机逻辑错误。
  • 第三步:计算超时时间——LTSSM 每个状态都有超时计数器。从进入 Polling 开始计时,如果超过规格值(比如 24ms for Gen3)没跳到 Configuration,就回 Detect。用逻辑分析仪看这个超时标志位。
  • 第四步:强制降速测试——如果上一步发现超时,可以强制把链路限制到低一代速率。比如 Gen3 链路改 Gen2 再试。如果 Gen2 成功,说明问题在于 Equalization 或 8GHz 的时序裕量。
  • 第五步:检查 Compliance 模式触发器——某些板卡的 Compliance 引脚被意外拉高,导致 LTSSM 进入 Compliance 而不是 Active。量一下对应 pin 的电压。

我的个人习惯:做 Polling 调试时,先看位锁定,再看符号锁定。怎么测位锁定?很多示波器有 CDR 锁定指示,或者直接观察恢复的时钟信号是否有稳定频率。如果位锁定没问题,但符号锁定失败,那大概率是 8b/10b 编码解码器没对上,或者 COM 字符被噪声破坏。

3.7 小结

Polling 是个复杂度适中的状态,但细节多。核心是 位锁定 + 符号锁定 两步走,以及 Compliance 模式的分支。Gen 之间的差异主要体现在编码方式、时钟频率和 Equalization 过程。记住:如果 Polling 卡住,先看电气信号是否达标,再抓协议数据,最后再怀疑 LTSSM 设计。