1. PCIe 链路训练概述
PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,它采用点对点串行连接方式,相比传统的并行PCI总线具有更高的数据传输速率和更好的扩展性。在PCIe系统中,链路训练(Link Training)是一个至关重要的初始化过程,它负责建立和优化两个PCIe设备之间的物理层连接。
链路训练的主要目的是:
- 确定链路的工作速率(Gen1/Gen2/Gen3等)
- 建立位锁定(Bit Lock)和符号锁定(Symbol Lock)
- 调整发送和接收端的均衡器设置
- 协商链路宽度(x1/x2/x4/x8/x16)
- 建立通道间的偏移补偿(Lane-to-Lane Deskew)
这个过程中,TS1(Training Sequence 1)和TS2(Training Sequence 2)是两种特殊的训练序列,它们在链路训练的不同阶段被设备交替发送,用于传递训练信息和协商参数。
注意:PCIe链路训练是一个自动化的过程,通常不需要用户干预,但理解其原理对于调试和故障排除非常有帮助。
2. TS1和TS2训练序列详解
2.1 训练序列的基本结构
TS1和TS2都是16个符号(Symbol)长的有序集(Ordered Set),每个符号由8b/10b编码或128b/130b编码(取决于PCIe版本)表示。它们的基本结构如下:
| 字段位置 | 字段名称 | 描述 |
|---|---|---|
| Symbol 0 | COM | 标识有序集开始的逗号字符(K28.5) |
| Symbol 1 | TS Identifier | 标识这是TS1(0x1E)还是TS2(0x2D) |
| Symbol 2-15 | 训练控制字段 | 包含链路训练所需的各种控制信息 |
在PCIe 3.0及更高版本中,由于采用了128b/130b编码,训练序列的结构有所变化,但基本功能保持不变。
2.2 TS1和TS2的主要区别
虽然TS1和TS2在结构上相似,但它们在链路训练过程中扮演不同的角色:
-
TS1序列:
- 主要用于初始链路检测和基本参数协商
- 包含链路号和通道号信息
- 用于速率协商和均衡调整
- 在训练早期阶段占主导地位
-
TS2序列:
- 用于确认和最终确定链路参数
- 包含更精确的均衡设置
- 用于验证链路宽度和速率
- 在训练后期阶段使用
提示:在实际调试中,通过观察TS1和TS2的交换模式可以判断链路训练所处的阶段。
2.3 训练序列中的关键字段
训练序列中的Symbol 2-15包含多个重要字段,以下是其中一些关键字段的说明:
-
Link Number和Lane Number:
- 用于多通道链路中识别特定通道
- 在x1链路中通常设为0
-
Rate ID:
- 表示设备支持的最高速率
- 用于速率协商(2.5GT/s, 5GT/s, 8GT/s等)
-
Equalization Control:
- 包含预加重和均衡设置
- 对于高速率(如Gen3及以上)尤为重要
-
Loopback:
- 用于启用环回测试模式
- 有助于隔离和诊断链路问题
-
Disable Link:
- 指示是否禁用链路
- 可用于强制重新训练
3. 链路训练的阶段与TS1/TS2的使用
PCIe链路训练分为几个明确的阶段,每个阶段TS1和TS2的使用模式不同:
3.1 Detect阶段
这是链路训练的初始阶段,主要目标:
- 检测对端设备是否存在
- 确定可用的通道
- 准备进入Polling阶段
在这个阶段,设备会发送特殊的电气空闲退出(Electrical Idle Exit)序列,但不会发送TS1或TS2。
3.2 Polling阶段
Polling阶段分为几个子阶段:
-
Polling.Active:
- 设备开始连续发送TS1序列
- 接收端尝试锁定到输入的TS1序列
- 建立位锁定和符号锁定
-
Polling.Configuration:
- 设备继续发送TS1,但开始协商链路参数
- 交换速率和能力信息
- 准备进入Configuration阶段
3.3 Configuration阶段
这是训练过程中最复杂的阶段,分为多个子状态:
-
Configuration.Linkwidth.Start:
- 设备开始发送TS1序列,协商链路宽度
- 确定实际可用的通道数量
-
Configuration.Linkwidth.Accept:
- 设备确认链路宽度
- 开始发送TS2序列进行验证
-
Configuration.Lanenum.Wait:
- 分配通道编号
- 处理通道间的偏移
-
Configuration.Complete:
- 完成所有参数协商
- 准备进入L0状态(正常工作状态)
3.4 Recovery阶段
当链路需要重新训练时(如速率改变或均衡调整),会进入Recovery阶段:
- 类似于Polling和Configuration的组合
- 可能涉及TS1和TS2的交换
- 用于动态调整链路参数
4. 调试与故障排除
理解TS1和TS2对于调试PCIe链路问题至关重要。以下是常见问题及排查方法:
4.1 链路训练失败的常见原因
-
电气问题:
- 阻抗不匹配
- 信号完整性差
- 电源噪声
-
协议问题:
- TS1/TS2序列错误
- 参数协商失败
- 超时问题
-
配置问题:
- 不兼容的速率设置
- 错误的链路宽度配置
- BIOS/UEFI设置冲突
4.2 使用工具观察训练序列
-
协议分析仪:
- 可以捕获和解码TS1/TS2序列
- 提供详细的训练过程可视化
-
BERT(误码率测试仪):
- 评估链路质量
- 测量误码率
-
示波器:
- 观察信号完整性
- 检查眼图质量
4.3 常见错误模式及解决方案
-
持续发送TS1但无法进入下一阶段:
- 检查对端设备是否响应
- 验证参考时钟是否稳定
- 检查通道极性设置
-
TS1/TS2序列中出现错误符号:
- 检查信号完整性
- 验证发送端预加重设置
- 检查接收端均衡设置
-
链路训练成功但性能不佳:
- 优化均衡设置
- 检查电源完整性
- 验证散热情况(高温可能影响信号质量)
5. 高级主题与最佳实践
5.1 不同PCIe版本的差异
-
PCIe 1.x/2.x:
- 使用8b/10b编码
- 训练序列相对简单
- 均衡要求较低
-
PCIe 3.x:
- 引入128b/130b编码
- 更复杂的均衡机制
- 新增均衡训练阶段
-
PCIe 4.x/5.x:
- 更高的速率带来更大挑战
- 更精细的均衡控制
- 新增前向纠错(FEC)支持
5.2 均衡训练详解
在高速PCIe版本(Gen3及以上)中,均衡训练是关键环节:
-
发送端均衡:
- 预加重(Pre-emphasis)
- 去加重(De-emphasis)
- 摆动控制(Swing)
-
接收端均衡:
- 连续时间线性均衡(CTLE)
- 判决反馈均衡(DFE)
均衡参数通过TS1/TS2序列中的特定字段交换和协商。
5.3 设计注意事项
-
PCB布局:
- 保持差分对长度匹配
- 控制阻抗一致性
- 避免过孔stub
-
电源设计:
- 提供干净的电源
- 适当的去耦电容
- 考虑电源序列要求
-
散热考虑:
- 高速信号对温度敏感
- 确保适当散热
- 监控工作温度
我在实际项目中遇到过多次PCIe链路训练问题,最常见的还是信号完整性问题。有一次,一个x8链路只能以x4宽度工作,经过仔细检查发现是因为一对差分线的长度不匹配超出了规范要求。通过重新设计PCB走线解决了这个问题。这提醒我们,在高速设计中对物理实现的细节必须给予足够重视。
