系列文章目录
PCI Express 体系结构导读摘录(一)
PCI Express 体系结构导读摘录(二)
PCI Express 体系结构导读摘录(三)
PCI Express 体系结构导读摘录(四)
PCI Express 体系结构导读摘录(五)
文章目录
- 系列文章目录
- 第 8 章 PCIe 总线的链路训练与电源管理
- 8. 1 PCIe 链路训练简介
- 8. 1. 1 链路训练使用的字符序列
- 8. 1. 2 Electrical Idle 状态
第 8 章 PCIe 总线的链路训练与电源管理
PCIe 链路的初始化过程较为复杂。 PCIe 总线进行链路训练时将初始化 PCIe 设备的物理层、 发送接收模块和相关的链路状态信息, 当链路训练成功结束后, PCIe 链路两端的设备可以进行正常的数据交换。
链路训练的过程由硬件逻辑完成, 而无需系统软件的参与。 此外当 PCIe 设备从低功耗状态返回到正常工作模式时, 或者 PCIe 链路出现某些错误时, PCIe 链路也需要重新进行链路训练。
8. 1 PCIe 链路训练简介
PCIe 总线进行链路训练的主要目的是初始化 PCIe 链路的物理层、 端口配置信息、 相应的链路状态, 并了解链路对端的拓扑结构, 以便 PCIe 链路两端的设备进行数据通信。 一条 PCIe 总线提供的链路带宽可以是 × 1、 × 2、 × 4、 × 8、 × 12 或者 × 16, 但是在这个 PCIe 链路上所挂接的 PCIe 设备并不会完全使用这些链路。 如一个 × 4 的 PCIe 设备可能会连接到 × 16 的 PCIe 链路上。 此时该 PCIe 设备在进行链路训练时, 必须通知对端链路该设备实际使用的链路状态。
此外 PCIe 总线规定, PCIe 链路两端的设备所使用的 Lane 可以错序进行连接, PCIe 总线规范将该功能称为 “ Lane Reversal” 。 在相同的 Lane 上, 差分信号的极型也可以错序连接, PCIe 总线规范将该功能称为 Polarity Inversion。 这两种错序连接方式如图 8-1 所示。
PCIe 总线提供这些连接方式的主要目的是为了方便 PCB 走线, 因为差分信号要求在 PCB 中等长而且等距。 在一个系统中, 如果存在多路差分信号时, PCB 布线较为困难。 PCIe 链路允许 “Lane Reversal” 和 “Polarity Inversion” 这两个功能, 便于 PCB Layout 工程师根据实际情况为差分信号选择更为合理的走线路径, 从而降低 PCB 的层数。 除了 PCIe 链路, 还有许多使用差分信号的串行总线也支持 “ Lane Reversal” 和 “ Polarity Inversion” 这两个功 能, 但是称呼上有所区别。 在一条 PCIe 链路中, 可以同时支持 “Lane Reversal” 和 “ Polarity Inversion” 这两个功能。
PCIe 链路进行链路训练时, 需要了解 PCIe 链路两端的连接拓扑结构。 一条 PCI 链路可能使用多个 Lane 进行数据交换, 而数据报文经过不同 Lane 的延时并不完全相同。 PCIe 总线进行链路训练时, 需要处理这些不同 Lane 的延时差异, 并进行补偿。 PCIe 总线规范将这个过程称为 De-skew 。
此外 PCIe 总线在链路训练过程中, 还需要确定数据传送率。 PCIe V1. x 总线使用的数据 传送率为 2. 5GT / s, PCIe V2. 0 总线使用 5. 0GT / s, 而 PCIe V3. 0 总线使用 8GT / s 的数据传送 率。 当分属不同规范的 PCIe 设备使用同一个 PCIe 链路进行连接时, 需要统一数据传送率。 如一个 V1. x 的 PCIe 设备与一个 V2. 0 的 RC 或者 Switch 连接时, 需要将数据传送率统一为 2. 5GT / s。 在 PCIe 总线中, 如果一个 PCIe 链路的两端分别连接不同类型的 PCIe 设备时, 将选择较低的数据传送率。 值得注意的是, PCIe 链路在进行初始化时, 首先使用 2. 5GT / s 的数据传送率, 之后切换到更高的数据传送率, 如 5GT / s 或者 8GT / s。
在多端口 RC 和 Switch 中具有多个下游端口, 而每个端口可以支持 × 1、 × 2、 × 4 等不同宽度的 Lane, 如图 8-2 所示。
在一个 Switch 中存在多个下游链路, 并使用 0 ~ n 进行编号, 其中 n≤255。 这些编号保存在 Switch 的硬件逻辑中, 而不在 Switch 的配置空间中。 这个编号也被称为 Link Number, 上图所示的 Switch 中含有两个 Link Number, 分别为 1 和 2。
在 Switch 中, 还有两类 Lane Number, 分别是物理 “Lane Number” 和逻辑 “ Lane Number” 。 其中物理 “Lane Number” 是链路训练之前使用的 Lane number。 一个 PCIe 链路的物理 “Lane Number” 编号为 0 ~ n, 其中 n 为 PCIe 链路的最大 Lane Number, 如果一个 PCIe 链 路上有 8 个 Lane, 则 n 等于 7。
而逻辑 “Lane Number” 是链路训练结束后使用的 Lane Number。 如图 8 - 1 左图所示, PCIe 链路允许错序连接, 因此物理 “ Lane Number” 与逻辑 “ Lane Number” 并不相同。 物理 “Lane Number” 与逻辑 “Lane Number” 的对应关系在链路训练中确定。
除此之外, 有些 Switch 支持多种链路配置方式, 假设某个 Switch 的下游支持 8 个 Lane。 这 8 个 Lane 可以组成 1 个 PCIe 链路, 其链路宽度为 8; 也可以组成 2 个 PCIe 链路, 每个链路宽度为 4; 也可以组成 4 个链路, 每个链路宽度为 2。
该 Switch 的物理 Lane Number 的编号方法不变, 都是从 0 ~ 7, 但是逻辑 Lane Number 的编号方法将有所区别。 如图 8-2 所示的 Switch 中具有 8 个 Lane, 组成两个 PCIe 链路, 其中每条 PCIe 链路的逻辑 Lane Number 的编号都为 0 ~ 3。
PCIe 总线进行数据传递时, 需要使用时钟进行同步, 但是 PCIe 链路并没有提供这个时钟信号, 因此在进行链路训练时, 接收端需要从发送端的数据报文中提取接收时钟。 PCIe 总线规范将这个获得接收时钟的过程称为 “Bit Lock” 。
在链路训练过程中, PCIe 链路需要首先确定 COM 字符, 该字符也标志着链路训练或者链路重训练的开始, PCIe 总线规范将确定 COM 字符的过程称为 “ Symbol Lock” 。 如表 7-6 所示, COM 字符为 “001111 1010” 或者 “110000 0101” , 该字符为 2 个 “0” 后 5 个 “1” 或者 2 个 “1” 后 5 个 “0” , 非常便于硬件识别。 Bit Lock 和 Symbol Lock 的过程也需要在 PCIe 总线的链路训练中进行。
8. 1. 1 链路训练使用的字符序列
PCIe 总线进行链路训练时, 需要发送一些特殊的字符序列 (Ordered-Sets) , 这些 Oderer-Sets 将在下文中详细介绍, PCIe 总线规范定义了以下几类 Ordered-Sets。 有的书籍也将这些 Ordered-Sets 称为 PLP, 即物理层报文。
- Training Sequence 1 和 2, 简称为 TS1 和 TS2 序列。 这两种 PLP 在链路训练的多个状态机中使用, 下文将进一步介绍这两种字符序列。
- Idle 序列。 在正常情况下, 发送端进入 Electrical Idle 状态时, 将首先向对端发送若干 Idle 序列, 才能进入。 Electrical Idle 状态是 PCIe 链路的一个低功耗状态, 第 8. 1. 2 节 将详细介绍该状态。
- Fast Training Sequence, 简称为 FTS。 该字符序列协助接收逻辑获得 Bit / Symbol Lock, 接收逻辑需要获得多个 FTS 后, 才能确定 Bit / Symbol Lock 。
- SKIP 序列。 该字符序列的主要作用是进行时钟补偿。
在 PCIe 总线中, 字符序列的发送方式与 TLP 和 DLLP 有较大不同。 假设一条 PCIe 链路由多个 Lane 组成, 那么 TLP 和 DLLP 报文将分散到多个 Lane 中。 而字符序列必须同时出现在这些不同的 Lane, 这几个 Lane 必须 “在同一个时间点” 发送字符序列。 而不能出现一个 Lane 正在发送这个字符序列进行与链路训练相关的操作, 而其他 Lane 进行其他数据传递的情况。 PCIe 链路发送 TLP 与发送字符序列的过程如图 8-3 所示。
如在一个 × 4 的 PCIe 链路中发送 SKIP 序列时, 每一个 Lane 中都要出现 “ COM、 SKP、 SKP、 SKP” 这样的数据流。 其他字符序列的发送方法也与此类似。 而 TLP 或者 DLLP 的发送分散到各个 Lane 上。
-
TS1 和 TS2 序列
在物理层的 LTSSM 状态机中, TS1 和 TS2 序列的使用方法不同。 其中 TS1 序列的主要作用是检测 PCIe 链路的配置信息, 而 TS2 序列确认 TS1 序列的检测结果。
TS1 和 TS2 序列由 16 个字符组成, 单纯从结构上看, TS1 和 TS2 仅仅是第 6 ~ 15 个字符的含义不同, 但是这两个序列在 LTSSM 状态机中的使用方法不同。 TS1 的第 6 ~ 15 个字符为 D10. 2, 而 TS2 的第 6 ~ 15 个字符为 D5. 2, 其中 D10. 2 和 D5. 2 也是 TS1 和 TS2 的标识号。 TS1 和 TS2 序列的其他字符如下所示。- 第 0 字符为 COM 控制字符, 表示 TS1 / TS2 序列的开始。 TS1 / TS2 字符序列将复位 LFSR 寄存器。
- 在链路训练的初始阶段, 第 1 字符存放控制字符 PAD, 即为空。 而在链路的配置阶段, 该字符存放端口使用的 Link Number。
- 在链路训练的初始阶段, 第 2 字符为控制字符 PAD, 即为空。 而在链路的配置阶段, 该字符存放端口使用的 Lane Number。
- 第 3 个字符为 FTS 序列的个数 (N_FTS) 。 不同的 PCIe 链路需要使用不同数目 FTS 序列, 才能使接收端的 PLL 锁定接收时钟。
- 第 4 个字符存放当前 PCIe 设备支持的数据传送率, 第 1 位为 1 表示支持 2. 5GT / s 传 送率; 第 2 位为 1 表示支持 5GT / s 传送率; 第 3 位为 1 表示支持 8GT / s 的数据传送率 (在 PCIe V3. 0 规范中使用) ; 第 4 ~ 5 位保留; 第 6 位是一个多功能位, 当 PCIe 链路的没有配置成功时可以作为 Notification 位, 也可以用作发送链路 De⁃emphasis 的使能位; 第 7 位为 speed_change 位, 当该位为 1 时, 通知 PCIe 链路对端设备需要改变传送速率。
- 第 5 个字符存放命令。 第 0 位为 “ Hot Reset” , 第 1 位为 “Disable Link” , 第 2 位为 “Loopback” , 第 3 位为 “Disable Scrambling” , 第 4 位为 “ Compliance Receive” 。 当接收逻辑 RX 收到 TS1 或者 TS2 序列后, 将根据该字符的命令进行对应的操作。
-
Idle 序列
在正常情况下, 当发送端进入 Electrical Idle 状态之前, 必须向对端发送 EIOS 序列。 如 果 PCIe 设备使用 2. 5GT / s 的传送率时, Idle 序列由 1 个 COM 字符加 3 个 IDL 字符组成, 即 “ COM IDL IDL IDL” ; 如果 PCIe 设备使用 5GT / s 的传送率时, Idle 序列由两组这样的字符序列组成, 即 “COM IDL IDL IDL COM IDL IDL IDL” 。 Electrical Idle 状态是一种特殊的 Idle 状 态, 处于该状态时, PCIe 链路使用的功耗最低, 该状态的详细解释见第 8. 1. 2 节。
当发送端退出 IDLE 状态时, 必须向对端发送 EIEOS(Electrical Idle Exit Sequence) 序列。 EIEOS 序列仅在链路传送率大于 2. 5GT 时使用, 该序列由1 个 COM 字符、 14 个 EIE 字符和 D10. 2 (TS1 识别符) 组成。
PCIe 设备可以根据链路的使用情况确定当前链路是否处于 Electrical Idle 状态, 而不是 必须收到 Idle 序列后进入该状态。 如一个 PCIe 设备在很长一段时间没有收到流量控制报文 或者链路处于 Electrical Idle 状态时, 也可以推断出对端设备处于 Idle 状态。 -
FTS 序列
单个 FTS 序列由 1 个 COM 字符加 3 个 FTS 字符组成, 该序列的主要目的是使接收逻辑 RX 重新获得 Bit / Symbol Lock。 发送逻辑需要向对端发送多少个 FTS 序列由接收到的 TS1 / 2 序列决定, TS1 / 2 序列的第 3 个字符为需要发送 FTS 序列的个数。 -
SKIP 序列
SKIP 序列由一个 COM 字符加 3 个 SKP 字符组成。 物理层提供 SKIP 序列的主要原因是进行时钟补偿。 假设一个 PCIe 设备使用的时钟频率为 2. 5GHz ± 300ppm, 其中 300ppm 意味着这个时钟源每发出 1 百万个时钟可能产生 300 个时钟漂移, 即每 3333 个时钟将可能产生 一个时钟漂移。 如果 PCIe 链路不使用 SKIP 序列, 本地时钟与 “从报文中提取” 的时钟存在的漂移, 可能导致数据传送失败。
在 PCIe 设备的接收逻辑 RX 中, 使用了两个时钟, 一个时钟是通过 PLL 从接收报文中 恢复的时钟, 另一个时钟是接收逻辑 RX 使用的本地时钟。 这两个时钟间的关系如图 8-4 所 示。 值得注意的是这两个时钟并不完全同步。
在 PCIe 总线中, 使用 Elastic Buffer (Elastic Buffer 也被称为 Elasticity Buffer 或者 Synchronization Buffer)技术处理这两个时钟之间的频率差和相位差。 Elastic Buffer 处于本地时钟域与 “被恢复的” 时钟域之间, 由一个同步 FIFO 组成。 该 FIFO 的一端使用本地时钟域、 而另一端使用 “被恢复的” 时钟域。 其中本地时钟与 “被恢复的” 时钟频率都为 2. 5GHz ± 300 ppm。
但是如果 PCIe 设备从数据报文中恢复的时钟频率为 2. 5GHz - 300ppm, 而本地时钟频率为 2. 5 GHz + 300 ppm 时, Elastic Buffer 两端的时钟频率并不匹配, Elastic Buffer 将出现 Over⁃ run 的现象; 而如果本地时钟频率小于 “被恢复的” 时钟时, Elastic Buffer 将可能出现 Un⁃ derrun 的现象。 如果 PCIe 总线不采取一些必要的补救措施, 那么无论 Elastic Buffer 的容量 有多么大, 都可能出现 Overrun 和 Underrun 的现象。
为此, PCIe 总线规定, 物理层的每个 Lane 发送 1180 ~ 1538 个字符之后, 必须发送一个 SKIP 序列进行时钟补偿。 因为在最恶劣的情况下, 接收逻辑 RX 每过 1667 个时钟周期, 本地时钟就可能与 “被恢复的” 时钟相差一个时钟周期 。 在 PCIe 总线中, 当 Elastic Buffer 收到 SKIP 序列时, 可以根据自身的状态选择是增加还是减少 1 ~ 2 个 SKIP 序列, 从而补偿 本地时钟与 “被恢复的” 时钟之间的频率与相位差。
在一个具体的实现中, 可以通过计算, 得到 Elastic Buffer 不出现 Overrun 和 Underrun 所 需要的最小尺寸。 这个最小尺寸与 SKP 序列的发送间隔 (多少个时钟周期发送一次 SKP 序 列) , Max_Payload_Size 参数和 PCIe 链路的数据传送率相关。 对此有兴趣的读者可以参考 Elastic Buffer Implementations in PCI Express Devices, 以获得详细的量化分析结果, 本节对此 不做进一步说明。
8. 1. 2 Electrical Idle 状态
☆