2. 链路训练状态机(LTSSM)详解
PCIe 链路训练状态机(LTSSM, Link Training and Status State Machine)是物理层(PHY)的核心控制逻辑,负责管理端口之间的链路初始化、宽度协商、速率协商、电源状态转换以及错误恢复。LTSSM 定义了 11 个主要状态,每个状态对应一组特定的电气行为、有序集(Ordered Set)交换规则和定时器约束。本章将逐状态解析其转换条件与工程含义。
2.1 LTSSM 状态总览与状态图
LTSSM 的状态转换遵循有限状态机(FSM)模型,状态之间的跳转由硬件检测到的有序集、超时事件或软件请求触发。下图展示了 LTSSM 的核心状态及其主要转换路径。
2.2 Detect 状态
Detect 是 LTSSM 的初始状态,也是链路复位后的默认入口。该状态的目标是检测对端设备是否存在,并确定链路的初始宽度。
2.2.1 状态行为
- 发送行为:发送端在 TX 上发送 Detect 信号(电气空闲退出序列,EIEOS),并周期性切换所有 Lane 的 TX 共模电压,检测 RX 端是否产生阻抗变化。
- 接收行为:RX 端检测 TX 共模电压变化,判断对端是否在位。
- 宽度发现:通过逐 Lane 检测,确定哪些 Lane 存在对端设备,从而确定初始链路宽度。
2.2.2 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| Detect | Polling | 至少检测到 1 条 Lane 存在对端 | 进入 Polling 开始有序集交换 |
| Detect | Detect (Quiet) | 12ms 内未检测到任何 Lane | 进入低功耗 Detect 循环,周期性唤醒 |
| Detect | Disable | 软件设置链路禁用 | 直接跳转到 Disable 状态 |
2.3 Polling 状态
Polling 状态负责建立 Lane 级别的符号对齐和位锁定,并交换训练序列(TS1/TS2)以协商链路参数。
2.3.1 状态子状态
- Polling.Active:发送 TS1 有序集,接收端进行符号锁定和位锁定。
- Polling.Compliance:如果链路进入 Compliance 模式,发送端发送特定的 Compliance Pattern 用于测试。
- Polling.Configuration:交换 TS2 有序集,确认 Lane 对齐和极性反转。
2.3.2 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| Polling.Active | Polling.Configuration | 成功接收 8 个连续的 TS1 有序集 | 符号锁定完成 |
| Polling.Configuration | Configuration | 成功接收 8 个连续的 TS2 有序集 | Lane 对齐完成 |
| Polling | Detect | Polling 超时(24ms) | 训练失败,回退到 Detect |
| Polling | Recovery | 检测到电气空闲退出序列(EIEOS)异常 | 进入 Recovery 尝试重新训练 |
2.4 Configuration 状态
Configuration 状态是链路训练的核心阶段,负责完成链路宽度协商、Lane 极性反转、Lane 到 Lanes 的映射以及链路编号分配。
2.4.1 关键操作
- 宽度协商:通过 TS1 和 TS2 有序集中的 Link Number 和 Lane Number 字段,双方协商最终工作的链路宽度(x1/x2/x4/x8/x16)。
- 极性反转:如果 PCB 走线导致 P/N 极性颠倒,在此阶段通过 TS1 中的 Polarity 位进行修正。
- Lane 反转:允许 Lane 顺序重映射,以补偿 PCB 布线时的 Lane 交换。
- 均衡系数交换:在 Gen3/Gen4 速率下,Configuration 阶段开始交换预加重和去加重系数。
2.4.2 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| Configuration | L0 | 所有 Lane 完成宽度协商,收到 8 个连续的 TS2 且 Link/Lane Number 匹配 | 链路训练成功,进入正常操作状态 |
| Configuration | Recovery | 宽度协商失败或超时 | 尝试降低宽度或重新协商 |
| Configuration | Detect | 严重错误或软件复位 | 完全重新训练 |
2.5 L0 状态
L0 是链路正常操作状态,此时链路可以传输 TLP(事务层包)和 DLLP(数据链路层包)。L0 状态下的链路功耗最高,性能也最高。
2.5.1 状态特征
- 数据流:TLP 和 DLLP 可以在所有激活的 Lane 上并行传输。
- SKP 有序集:每 1000 个符号插入一次 SKP 有序集,用于补偿发送端和接收端之间的时钟频率差异(Gen4 下为 1000 个符号插入 2 个 SKP)。
- 电气空闲:当链路空闲时,可以进入电气空闲状态以降低功耗。
2.5.2 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| L0 | L0s | 链路空闲且进入电气空闲 | 快速进入低功耗状态 |
| L0 | L1 | 软件请求或 ASPM 策略 | 更深度的低功耗状态 |
| L0 | Recovery | 检测到错误(CRC 错误、链路退化、接收端缓冲区溢出) | 尝试恢复链路 |
2.6 L0s 状态
L0s 是 L0 的低功耗子状态,允许链路在空闲时快速进入低功耗模式,并在需要发送数据时快速恢复到 L0。
2.6.1 状态行为
- 进入条件:链路空闲且发送端进入电气空闲状态。
- 退出条件:发送端需要发送数据时,发送 EIEOS 退出电气空闲,接收端检测到后恢复时钟和数据同步。
- 延迟:L0s 退出延迟通常为几十纳秒,远小于 L1 的退出延迟(微秒级)。
2.6.2 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| L0s | L0 | 发送端退出电气空闲,接收端检测到 EIEOS | 快速恢复数据流 |
| L0s | Recovery | 退出电气空闲后符号锁定失败 | 链路需要重新训练 |
2.7 L1 状态
L1 是更深度的低功耗状态,此时链路的主时钟可能被关闭,接收端进入低功耗模式。L1 的退出延迟比 L0s 长,但功耗更低。
2.7.1 状态子状态
- L1.0:标准 L1 状态,主时钟关闭,但 PLL 保持锁定。
- L1.1:进一步关闭部分 PLL,退出延迟更长。
- L1.2:关闭所有 PLL 和时钟,仅保留唤醒逻辑,退出延迟最长。
2.7.2 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| L0 | L1 | 软件写入 L1 请求或 ASPM L1 策略触发 | 进入 L1 需要双方握手 |
| L1 | L0 | 发送端发送 EIEOS 退出电气空闲 | 接收端检测到后恢复时钟 |
| L1 | Recovery | 退出 L1 时符号锁定失败 | 需要重新训练 |
2.8 Recovery 状态
Recovery 状态是 LTSSM 的错误恢复机制,当链路在 L0/L0s/L1 状态下检测到错误时,进入 Recovery 尝试重新建立链路而不需要完全复位。
2.8.1 进入 Recovery 的常见原因
- 比特错误率(BER)超标:接收端检测到 CRC 错误或符号错误。
- 链路退化:某条 Lane 的信号质量下降,需要降低链路宽度。
- 速率变更:软件请求改变链路速率(如从 Gen4 降速到 Gen3)。
- 均衡重协商:温度或电压变化导致均衡参数失效。
2.8.2 Recovery 子状态
- Recovery.RcvrLock:接收端重新锁定符号边界和位时钟。
- Recovery.RcvrCfg:重新交换 TS1/TS2 有序集,协商链路参数。
- Recovery.Idle:等待双方完成协商,准备进入 L0。
2.8.3 转换条件
| 当前状态 | 目标状态 | 转换条件 | 说明 |
|---|---|---|---|
| Recovery | L0 | 成功完成符号锁定和参数协商 | 恢复成功 |
| Recovery | Configuration | 需要改变链路宽度或 Lane 映射 | 回退到 Configuration 重新协商 |
| Recovery | Detect | Recovery 超时(24ms) | 完全重新训练 |
| Recovery | Hot Reset | 接收到 Hot Reset 有序集 | 进入复位状态 |
| Recovery | Disable | 软件请求禁用链路 | 进入 Disable 状态 |
2.9 其他状态
2.9.1 Hot Reset
Hot Reset 状态用于对下游设备进行复位,而不需要关闭主电源。发送端发送 TS1 有序集且所有 Lane 的 Link Number 和 Lane Number 都设为 0。下游设备接收到 Hot Reset 后,其 LTSSM 会跳转到 Detect 状态重新开始训练。
2.9.2 Disable
Disable 状态用于软件禁用链路。进入 Disable 后,发送端停止所有活动,接收端忽略所有输入。退出 Disable 需要软件重新使能链路,LTSSM 会跳转到 Detect 状态。
2.9.3 Loopback
Loopback 状态用于测试和调试。进入 Loopback 后,接收端将接收到的数据直接回送到发送端,用于验证物理层和数据链路层的功能完整性。
2.10 LTSSM 状态转换汇总表
| 源状态 | 目标状态 | 触发条件 | 典型场景 |
|---|---|---|---|
| Detect | Polling | 检测到对端设备 | 上电初始化 |
| Polling | Configuration | 符号锁定完成 | 正常训练流程 |
| Configuration | L0 | 宽度协商成功 | 训练成功 |
| L0 | L0s | 链路空闲 | 低功耗管理 |
| L0s | L0 | 数据到达 | 快速唤醒 |
| L0 | L1 | ASPM 策略或软件请求 | 深度睡眠 |
| L1 | L0 | 唤醒事件 | 退出睡眠 |
| L0/L0s/L1 | Recovery | 错误检测或速率变更 | 错误恢复 |
| Recovery | L0 | 恢复成功 | 恢复正常操作 |
| Recovery | Configuration | 需要宽度重协商 | 链路退化处理 |
| Recovery | Detect | 恢复超时 | 完全重新训练 |
| Recovery | Hot Reset | 接收到 Hot Reset TS1 | 系统复位 |
| Recovery | Disable | 软件请求 | 链路禁用 |
| Hot Reset | Detect | 复位完成 | 重新初始化 |
2.11 LTSSM 与 Gen4 速率的关系
Gen4(16 GT/s)相比 Gen3(8 GT/s)在 LTSSM 中引入了以下关键差异:
- 均衡阶段增加:Gen4 在 Configuration 和 Recovery 阶段需要完成 Phase 1(预设系数)、Phase 2(发送端均衡)和 Phase 3(接收端均衡)三个阶段的均衡协商。
- SKP 有序集调整:Gen4 每 1000 个符号插入 2 个 SKP,而 Gen3 插入 1 个 SKP。
- 电气空闲检测阈值:Gen4 的电气空闲检测阈值更低,对噪声更敏感。
- Recovery 时间要求:Gen4 的 Recovery 时间窗口更严格,因为更高的速率要求更快的符号锁定。