4. 链路训练初始化流程:从 Detect 到 L0 的完整握手过程
PCIe 链路训练状态机(LTSSM)是物理层最核心的控制逻辑,负责将两条独立的 PCIe 端口从电气隔离状态逐步推进到全速数据通信状态(L0)。本章详细拆解从 Detect 到 L0 的完整握手过程,并深入分析电气空闲序列(EIOS)和训练序列(TS1/TS2)的格式与作用。
4.1 LTSSM 状态机总览
LTSSM 共包含 11 个主要状态,链路训练初始化阶段涉及从 Detect 到 L0 的 6 个关键状态。下表列出各状态的核心任务与退出条件:
| 状态 | 核心任务 | 退出条件 |
|---|---|---|
| Detect | 检测对端设备是否存在 | 检测到接收器存在(Rx Detect) |
| Polling | 建立位锁定和符号锁定 | 成功接收 8 个连续的 TS1 或 TS2 序列 |
| Configuration | 交换链路宽度、速率、通道编号等配置信息 | 完成链路宽度协商,接收 8 个连续的 TS2 序列 |
| L0 | 正常数据包传输 | 进入 L0s/L1/L2 或 Recovery |
实战提示: 在 Agilex 调试中,超过 80% 的链路训练失败发生在 Polling 到 Configuration 的过渡阶段。重点监测 TS1/TS2 序列的接收计数和符号锁定状态。
4.2 从 Detect 到 L0 的完整握手流程
下图展示了 LTSSM 从 Detect 到 L0 的完整状态转换路径,以及每个阶段发送的关键序列:
4.3 电气空闲序列(EIOS)的格式与作用
电气空闲序列(Electrical Idle Ordered Set, EIOS) 是 PCIe 物理层用于指示链路进入电气空闲状态的特定序列。它在链路训练初始化阶段扮演关键角色。
4.3.1 EIOS 格式
EIOS 由以下 4 个符号组成:
| 符号序号 | 符号名称 | 编码 (8b/10b) | 说明 |
|---|---|---|---|
| 1 | COM | K28.5 | 逗号字符,用于符号对齐 |
| 2 | EIE | K28.7 | 电气空闲进入标识符 |
| 3 | EIE | K28.7 | 电气空闲进入标识符 |
| 4 | EIE | K28.7 | 电气空闲进入标识符 |
关键作用: EIOS 用于在 Detect 状态之前将链路置于电气空闲状态,确保接收器能够正确检测到对端的存在。在 Agilex 调试中,EIOS 发送失败会导致 Detect 状态无法退出,链路卡死在初始阶段。
4.3.2 EIOS 在训练流程中的位置
- Detect 进入前: 发送 EIOS 确保链路进入电气空闲,接收器开始检测对端。
- Polling 退出后: 发送 EIOS 指示链路准备进入 Configuration 阶段。
- 进入 L0s 省电状态: 发送 EIOS 通知对端进入电气空闲省电模式。
4.4 训练序列 TS1/TS2 的格式与作用
训练序列有序集(Training Sequence Ordered Set, TS1/TS2) 是链路训练过程中最重要的握手消息。它们承载链路配置信息,实现位锁定、符号锁定、链路宽度协商和通道编号分配。
4.4.1 TS1/TS2 通用格式
每个 TS1 或 TS2 序列由 16 个符号组成,格式如下:
| 符号索引 | 字段名称 | 编码 | 说明 |
|---|---|---|---|
| 0 | COM | K28.5 | 序列起始标识 |
| 1 | STS | K28.2 (TS1) / K28.3 (TS2) | 序列类型标识 |
| 2 | TS_ID | D0.0 ~ D31.7 | 训练集标识符(链路号) |
| 3 | TS_ID | D0.0 ~ D31.7 | 训练集标识符(链路号) |
| 4 | Lane Number | D0.0 ~ D31.7 | 当前通道编号 |
| 5 | Lane Number | D0.0 ~ D31.7 | 当前通道编号 |
| 6 | FTS | D0.0 ~ D31.7 | 快速训练序列计数 |
| 7 | FTS | D0.0 ~ D31.7 | 快速训练序列计数 |
| 8 | Data Rate | D0.0 ~ D31.7 | 数据速率标识 |
| 9 | Data Rate | D0.0 ~ D31.7 | 数据速率标识 |
| 10 | Training Control | D0.0 ~ D31.7 | 训练控制字段(TS1 特有) |
| 11 | Training Control | D0.0 ~ D31.7 | 训练控制字段(TS1 特有) |
| 12 | Reserved | D0.0 ~ D31.7 | 保留字段 |
| 13 | Reserved | D0.0 ~ D31.7 | 保留字段 |
| 14 | CRC | D0.0 ~ D31.7 | 循环冗余校验 |
| 15 | CRC | D0.0 ~ D31.7 | 循环冗余校验 |
4.4.2 TS1 与 TS2 的区别
| 特性 | TS1 | TS2 |
|---|---|---|
| STS 编码 | K28.2 | K28.3 |
| 主要用途 | 位锁定、符号锁定、链路宽度协商 | 确认链路宽度、通道编号分配完成 |
| 训练控制字段 | 包含链路宽度协商信息 | 保留或置零 |
| 发送阶段 | Polling 状态 | Configuration 状态 |
| 退出条件 | 接收 8 个连续 TS1 或 TS2 | 接收 8 个连续 TS2 |
4.4.3 TS1/TS2 在握手过程中的作用
- 位锁定与符号锁定: 接收器通过检测 COM 字符实现符号对齐,通过连续接收 TS1 序列确认位锁定稳定。
- 链路宽度协商: TS1 的训练控制字段携带链路宽度信息,对端通过比较自身宽度与接收到的宽度确定最终链路宽度。
- 通道编号分配: TS1/TS2 中的 Lane Number 字段用于为每个通道分配唯一的编号,确保多通道链路的数据对齐。
- 速率协商: Data Rate 字段标识当前链路速率,对端确认是否支持该速率。
常见故障点: 在 Agilex 调试中,TS1/TS2 的 CRC 校验失败是最常见的训练失败原因之一。通常由信号完整性(SI)问题引起,如通道间 skew 过大、参考时钟抖动超标或 PCB 走线阻抗不连续。建议在 Configuration 状态使用 Agilex 的 Eye Viewer 工具检查每个通道的眼图质量。
4.5 完整握手过程的时序要求
下表列出从 Detect 到 L0 各阶段的关键超时参数,这些参数在 Agilex 的 PHY 寄存器中可配置:
| 阶段 | 参数名称 | 典型值 | 超时后果 |
|---|---|---|---|
| Detect | Detect 退出超时 | 12 ms | 链路卡死在 Detect |
| Polling | Polling 超时 | 24 ms | 进入 Recovery 或 Polling.Compliance |
| Configuration | Configuration 超时 | 24 ms | 进入 Recovery |
| L0 | L0 退出超时 | 无(持续运行) | N/A |
4.6 实战调试要点
- 使用 Agilex 的 Link Training Monitor: 实时查看 LTSSM 当前状态、TS1/TS2 接收计数和错误计数。
- 检查 EIOS 发送: 在 Detect 阶段前使用示波器或逻辑分析仪确认 EIOS 序列是否正常发送。
- 验证 TS1/TS2 的 CRC: 读取 PHY 寄存器中的 CRC 错误计数器,若持续增长则表明信号质量存在问题。
- 对比对端设备: 使用 PCIe 分析仪捕获训练序列,对比本端和对端发送的 TS1/TS2 内容,确认链路宽度和速率协商是否一致。
Agilex 特有功能: Agilex 的 PHY 支持 自适应链路训练 功能,可在训练失败后自动调整参数(如去加重、摆幅)并重试。建议在调试初期关闭此功能,以便捕获原始失败信息。