Skip to content

Latest commit

 

History

History
647 lines (326 loc) · 58.3 KB

12 物理层逻辑(gen3).md

File metadata and controls

647 lines (326 loc) · 58.3 KB

Chpater 12 Physical Layer - Logical(Gen3)//物理层逻辑(Gen3)

关于上一章

上一章介绍了物理层的 Gen1/Gen2 逻辑子模块。该层为串行传输和恢复准备数据包,并详细描述了完成这一任务所需的几个步骤。本章涵盖了与使用 8b/10b 编码/解码的 Gen1 和 Gen2 协议相关的逻辑。

关于本章

本章描述了第三代(Gen3)PCIe 的逻辑物理层特性。主要的变化包括相对于 Gen2 ,Gen3 在没有倍增频率(链路速度只是从 5 GT/s 提高到 8 GT/s)的情况下,将带宽提高两倍。这是通过在 Gen3 模式下取消 8b/10b 编码而实现的。另外,在 Gen3 速度下,必须采用更具鲁棒性的信号补偿机制。

关于下一章

下一章将介绍物理层与链路的电气接口,并讨论了信号均衡的必要性和实现信号均衡的模型。该章同时包括了 Gen1、Gen2 和 Gen3 速率下的发送端和接收端电气特性。

12.1 Gen3 简介

回顾一下,当 PCIe 链路进入训练状态时(即复位后),它总是使用 Gen1 速度,以实现向后兼容。如果设备在训练期间宣称(advertise)了更高的速度,链路将立即转换到 Recovery 状态,并尝试将速率改为链路双方共同支持的最高速度。

将 PCIe 协议升级到 Gen3 的主要动机是为了将带宽提高一倍,如第 408 页的表 12-1 所示。实现这一点的直接方法是简单地将信号速率从 5GT/s 增加到 10Gb/s,但这样做有几个问题:

• 更高的频率会消耗更多的功率,由于需要复杂的调节逻辑(均衡, equalization)来维持更高速度下的信号完整性,这一问题变得更加严重。事实上,在 PCISIG 的文献中提到,均衡逻辑的高功率需求是保持尽可能低的频率的一个重要动机。

• 一些电路板材料在较高频率下会出现明显的信号衰减。这个问题可以通过采用更好的材料和投入更多设计精力来克服,但会增加成本和开发时间。由于 PCIe 的设计目的是为各类系统所采用,所以目标是 PCIe 在低成本设计中也能够良好运行。

• 同样,允许新设计使用现有的基础设施(例如电路板和连接器),可以最大限度地减少电路板设计工作和成本。使用更高的频率会使其变得更加困难,因为必须调整走线长度和其他参数以支持新的时序需求,这使得高频率方案变得不那么理想。

表 12-1 不同链路位宽下的 PCIe 带宽一览

image-20220701235159258

这些考虑导致 Gen3 spec 与前几代相比有两个重大变化:新的编码模型和更复杂的信号均衡模型。

12.1.1 新的编码模型

物理层的逻辑部分用新的 128b/130b 编码方案取代了 8b/10b 编码。当然,这意味着偏离了许多串行设计中成熟使用的 8b/10b 模式,但是 PCIe 设计者希望新的编码模式来挽回 8b/10b 编码所产生的 20% 的传输开销。使用 128b/130b 编码模式意味着通道(Lanes)现在传输的是 8 bits/byte,而不是 10 bits/byte,这意味着 Gen3 只需要 8.0GT/s 的数据速率,就能够相比 Gen2 增加一倍带宽,相当于链路收发双向上的带宽为 1GB/s。

为了说明这两种编码的区别,首先考虑图 12-1,它展示了 8b/10b 编码模式下数据包的一般结构。图中的箭头强调了代表 8b/10b 数据包帧符号的控制(K)字符。接收端通过识别这些控制字符,知道预期接收的数据包类型。请参阅第 380 页的“8b/10b 编码” 节,了解这种编码方案的优势。

image-20221001235640837

图 12-1 8b/10b 通道编码方式

相比之下,第 410 页的图 12-2 展示了 128b/130b 的编码方式。这种编码不影响正在传输的字节,而是将字符分组为 16 个字节的块,每个块的开头有一个 2 比特的同步字段。2 比特同步字段表示该块是否包括数据(10b)或有序集(01b)。因此,同步字段用于向接收端表明数据流的开端以及预期的数据流类型。与 8b/10b 版本类似,有序集必须在所有通道上被同时传输。这要求所有通道之间能够正确地同步,这也是训练过程的一部分(见第 438 页“实现块对齐”)。

image-20221002123110796

图 12-2 128b/130b 块编码方式

12.1.2 更复杂的信号均衡模型

PCIe Gen3 的第二项变化是在于物理层的电气子模块,包括在链路的发送端和接收端(可选的)进行更复杂的信号均衡。Gen1 和 Gen2 采用预先固定的 Tx 去加重(de-emphasis)数值,以达到良好的信号质量。然而,将传输频率提升到 5GT/s 以上会导致更严重的信号完整性问题,需要发送端和接收端采取更进一步的补偿措施。信号完整性问题一定程度上可以通过电路板板级的手段解决,但设计者希望让 PCIe Gen3 的外部基础设施尽可能地保持不变,所以将额外的均衡开销设计在 PHY 的发送端和接收端电路上。关于信号调节的更多细节,请参阅第 474 页的 “8.0GT/s 的解决方案 – 发送端均衡(Transmitter Equalization)”。

12.2 8.0 GT/s 编码

如前所述,Gen3 128b/130b 编码方法在整个链路范畴内封装数据报文,在单个链路上对数据进行分块编码。本节将进一步讨论编码的细节。

12.2.1 通道层面的编码

为了说明块(Blocks)的应用方式,请看第 411 页的图 12-3,其中展示了一个单通道数据块。首先是两个同步头(Sync Header)位,后面是 16 个字节(128 位)的信息,共 130 个传输位。同步头简单地定义了正在发送的是一个数据块 (10b) 还是一个有序集 (01b)。你可能已经注意到图 12-3 中的数据块的同步头值是 01b,而不是上面提到的 10b 值。这是因为在链路上传输数据块时,首先发送同步头的最低有效位(LSB)。请注意,同步头后面的符号也会先以最低有效位发送。

image-20221002124157089

图 12-3 同步头与数据块示例

12.2.2 块对齐

与先前版本的实现方式一样,Gen3 首先进行位锁定(Bit Lock),然后尝试建立块对齐锁定(Block Alignment Lock)。这需要接收端找到划分块边界的同步头。发送端通过发送由 00h 和 FFh 字节交替组成的,RX 可识别的 EIEOS 符号集(pattern)建立块边界,如图 12-4 所示。因此,EIEOS 已经不只是用于表示退出电气空闲,还扩展应用于建立块对齐的同步机制。请注意,同步头位紧接在 EIEOS 之前和之后(图 12-4 中未显示)。关于这个过程的细节,请参见第 438 页的“实现块对齐”。

image-20221002125046002

图 12-4 Gen3 EIEOS 符号集

12.2.3 有序集块

有序集的含义与 Gen1 和 Gen2 中的含义基本相同。它们用于管理通道协议(Lane protocol)。当发送有序集块时,它必须同时出现在所有通道上,并且几乎总是由 16 个字节组成,只有一个例外。这个例外是 SOS(SKP 有序集),它由时钟补偿逻辑(例如与链路中继器(Link Repeater)相关)以四个为一组的形式添加或删除 SKP 符号,因此 8、12、16、20 或 24 字节长度都是合法的。

有序集块的基本格式与数据块类似,只是同步头位数值是相反的,如第 412 页图 12-5 所示。

image-20221002134908883

图 12-5 Gen3x1 有序集块示例

PCIe 规范为 Gen3 定义了七个有序集(比 Gen1 和 Gen2 PCIe 多一个有序集)。在大多数情况下,它们的功能与前几代相同。

  1. SOS - Skip Ordered Set:用于时钟补偿。更多细节见第 426 页 “有序集示例-SOS”。

  2. EIOS - 电气空闲有序集(Electrical Idle Ordered Set):用于进入电气空闲状态

  3. EIEOS - 电气空闲退出有序集(Electrical Idle Exit Ordered Set):现在用于两个目的:

    — 电气空闲退出,这与前几代相同

    — 用于指示 8.0GT/s 速率下的块对齐边界

  4. TS1 - 训练序列 1 有序集(Training Sequence 1 Ordered Set)

  5. TS2 - 训练序列 2 有序集(Training Sequence 2 Ordered Set)

  6. FTS - 快速训练序列有序集(Fast Training Sequence Ordered Set)

  7. SDS - 数据流开端有序集(Start of Data Stream Ordered Set):在 Gen3 中新增 - 详见第 413 页 “数据流和数据块”。

为了给读者一个有序集结构的示例,图 12-6 展示了 8.0GT/s 速率下 FTS 有序集的组成,只能通过同步头才能把它识别为有序集,并通过该块中的第一个符号(Symbol)识别为 FTS 类型。图的右侧列出了有序集标识符(每个有序集的第一个符号),用于识别当前正在传输的有序集的类型。

image-20221002135421937

图 12-6 Gen3 FTS 有序集示例

12.2.4 数据流和数据块

链路通过发送一个 SDS 有序集,转换到 L0 链路状态来开始数据流传输(Enter a Data Stream)。在数据流中传输多个数据块,直到数据流以 EDS 标记(Token)结束(除非有错误提前结束)。 EDS 标记总是占据有序集之前的数据块的最后四个符号。Skip 有序集是一个例外,因为只要符合某些条件,它们就不会中断数据流。这种例外情况将在后文讨论。当链路状态从 L0 状态转换到任何其他链路状态,如恢复状态(Recovery),数据流就不再有效。关于链路状态的更多信息,请参阅第 518 页的“链路训练和状态机(LTSSM)”。

12.2.5 数据块帧结构

数据块由用于传递信息的 TLPs、DLLP 和 Token 组成。在一个数据块中还会用到五种类型的数据结构(称为标记,Token )。每一种都有便于接收端检测的数据图样(Pattern)。其中三种标记可能在一个数据块的开头发送(即,紧跟在同步数据块之后)。其中包括:

• 开始 TLP(STP) - 表示随后是 TLP 报文

• 开始 DLLP(SDP) - 表示随后是 DLLP 报文

• 逻辑空闲(IDLA) - 在没有数据包活动时发送

剩余的两种标记(Tokens)在数据块的末尾传递。

• 数据流结束(EDS) - 表示之后将从数据转换到有序集

• End Bad (EDB) - 报告检测到无效的数据包

图 12-7 提供了一个由单通道 TLP 传输组成的数据块的示例。

image-20221002145221015

图 12-7 Gen3x1 帧结构示意图

总之,数据块的内容因链路当前的活动(activity)而异:

• IDLs - 当没有数据包被传送时,数据块只由 IDL 组成。(规范将 IDL 指定为标记之一)。

• TLPs - 在一个给定的数据块中可以发送一个或多个 TLPs,取决于链路宽度。

• DLLPs - 在一个给定的数据块中可以发送一个或多个 DLLPs。

• 上述活动的组合可在一个数据块中传送。

12.2.5.1 帧标记

该规范定义了五个允许出现在数据块中的帧标记(或简称为“标记” Token),为了方便起见,在第 417 页的图 12-8 中再次罗列了这些标记。这五个标记是:

  1. STP - 开始 TLP:与早期版本很相似,但新增了字段:数据包双字(dword)数量。

  2. SDP - 开始 DLLP

  3. EDB - End Bad。用于使 TLP 无效,就像在早期的 Gen1 和 Gen2 设计中那样,但现在会连续发送四个 EDB 符号。另外,现在已经取消了 END(结束良好)符号;如果没有明确标记为坏,TLP 将被假定为良好。

  4. EDS - 数据流的结束。数据流的最后一个双字(dword),表示至少有一个有序集将会出现。耐人寻味的是,数据流可能并没有因为这个事件而真正结束。如果紧随其后的有序集是 SOS,并且紧随其后的是另一个数据块,则数据流继续。如果跟随的是 EDS 而不是 SOS,或者如果 SOS 后面没有数据块,那么数据流就会结束。

  5. IDL - 逻辑空闲。空闲标记只是在链路逻辑空闲状态下,没有 TLPs 或 DLLPs 准备传输时发送的数据零字节(data zero bytes)。

规范中显示标记的方式与第 417 页图 12-8 中显示的方式的不同之处在于,这幅图以小端(little-endian)顺序显示字节和位,而不是规范中使用的大端(big-endian)位表示。之所以这样显示,是为了说明各比特在通道上实际出现的顺序。

image-20221002150236536

图 12-8 Gen3 帧标记示意图

12.2.5.2 数据包

STP 和 SDP,表示一个数据包的开始,如图 12-7 所示

• TLPs。一个 STP 标记开端是一个全 1 的半字节(4‘b1111),随后是 11 比特位宽的数据包双字长度字段。双字长度字段统计 TLP 所有的双字,覆盖标记、首部、可选的数据有效载荷、可选的摘要(digest)和 LCRC。这使接收端能够通过计算双字数,以识别 TLP 的结束位置。因此,正确的 Length 字段是非常重要的,因此它有一个 4 位的帧 CRC(Frame CRC),以及一个保护 Length 和帧 CRC 字段的偶数奇偶校验位。这些校验字段的组合为标记提供了强大的三比特翻转(triple-bit-flip)检测能力(能够检测出包含多达 3 比特不正确的报文)。11 位的长度字段最多允许整个 TLP 为 2K 个双字(8KB)。

• DLLPs。SDP 标记表示 DLLP 的开始,没有表示 DLLP 的长度字段,因为 DLLP 总是 8 个字节长:2 个字节的标记后面是 4 个字节的 DLLP 有效载荷和 2 个字节的 DLLP LCRC。也许是巧合,这个 DLLP 长度与前几代 PCIe 相同,但不再包括一个表示结束良好的符号。

EDB 标记被添加到无效的 TLPs 的末尾。对于一个正常的 TLP,没有 “结束良好” 的指示,除非明确标记为坏,否则它被认为是良好的。如果 TLP 最终被标记为无效,LCRC 数值将被反转,并在末尾附加一个 EDB 标记作为 TLP 的扩展,它不会被反映在长度字段中。物理层的接收端必须在每个 TLP 结束时检查 EDB,如果看到 EDB 就通知链路层。自然而然地,除了在 TLP 结束后的符号接收到 EDB 之外,其他任何时候接收 EDB 都将被接收端视为帧错误。

12.2.5.3 发送端帧要求

开始这个话题的讨论前,我们最好预先定义一些事物。首先,回顾一下,数据流从 SDS 之后的第一个符号开始,它可能包含由标记、TLP 和 DLLP 组成的数据块。数据流以有序集(除了 SOS)之前的最后一个符号结束,或者当检测到帧错误时结束。在数据流期间,除了 SOS 外,不能发送任何有序集。

其次,由于帧问题通常会导致帧错误,解释下在这种情况下会发生什么是很有用的背景知识。当帧错误发生时,它们被接收方视为接收端错误,并向上层报告。接收端停止处理正在进行的数据流,只有当它看到一个 SDS 有序集时,才会开始处理一个新的数据流。为了响应帧错误,帧恢复逻辑通过将 LTSSM 从 L0 状态引导到恢复(Recovery)状态来启动。预期中,帧错误及其恢复过程将在物理层得到解决,不需要上层采取任何行动。此外,规范指出,从两个端口都进入恢复状态开始算起,完成这一过程的往返时间预期小于 1us。

现在,有了上述的背景知识,让我们继续讨论帧要求。在数据流中,发送端必须遵守以下规则:

• 当发送 TLP 时:

— STP 标记后必须紧跟着从链路层传递的 TLP 的全部内容,即使它是无效的。

— 如果 TLP 是无效的,EDB Token 必须紧跟在 TLP 的最后一个 dword 之后,但其不能包含在 TLP 的长度值中。

— STP 在链路上的每个符号时间内不能被发送多次。

• 当发送 DLLP 时:

— SDP 标记后面必须紧跟着从数据链路层传递的 DLLP 的全部内容。

— SDP 在链路上的每个符号时间内不能被发送多次。

• 当在数据流中发送一个 SOS(SKP 有序集)时:

— 在当前数据块的最后一个双字中发送一个 EDS 标记。

— 将 SOS 作为下一个有序集块发送。

— 在 SOS 之后立即发送另一个数据块。数据流以该后续数据块的第一个符号恢复。

— 如果安排了多个 SOS,它们不能像前几代那样背对背(back-to-back)地进行。相反,每个标记前面必须有一个以 EDS 标记结束的数据块。在此期间,数据块可以用 TLPs、DLLPs 或 IDLs 填充。

• 发送端要结束一个数据流时,在当前数据块的最后一个双字中发送 EDS 标记,然后使用 EIOS 进入低功率链路状态,或者用 EIEOS 处理所有其他情况。

• 如果链路上没有发送 TLP、DLLP 或其他帧标记,则必须在所有通道上发送 IDL 标记。

• 对于多通道链路:

— 在发送一个 IDL 标记后,下一个 TLP 或 DLLP 的第一个符号在开始时必须位于通道 0 中。EDS 标记必须始终是数据块的最后一个双字,因此可能不总是遵循这一规则。

— IDL 标记必须被用来在符号时间内填充本来是空的双字。例如,如果一个 x8 链路的 TLP 在通道 3 结束,但发送端没有另一个 TLP 或 DLLP 准备在通道 4 开始,那么 IDL 必须填充剩余的字节,直到该符号时间的结束。

— 由于数据包长度仍然是 4 字节的倍数,就像它们在早期几代中一样,它们将在 4 的倍数通道边界开始和结束。例如,在 x8 链路中,某个 DLLP 在通道 3 结束 ,可以通过将其 STP 标记放在通道 4 来开始下一个 TLP。

12.2.5.4 接收端帧要求

当在接收端看到数据流时,以下规则适用:

• 当需要帧标记时,接收到像其他东西的符号将被视作帧错误。

• 下面列表中显示的一些错误检查和报告是可选的,规范中指出这些可选项之间是互相独立的。

• 当收到 STP 时:

— 接收端必须检查帧 CRC 和帧奇偶校验字段,任何不匹配都将是一个帧错误。(注意,在报告这个错误时,错误帧的 STP 标记不被认为是 TLP 的一部分。)。

— 紧接 TLP 最后一个 DW 的符号是下一个要处理的标记,接收端必须检查它是否是 EDB 标记的开始,表明 TLP 已经无效。

— 可选择检查长度值是否为零;如果检测到,则为帧错误。

— 可选择检查在同一符号时间内是否有多个 STP 标记到达。如果检查并检测到,这就是一个帧错误。

• 当收到 EDB 时:

— 一旦检测到第一个 EDB 符号,或者在接收到它的任何剩余字节之后,接收端必须立即通知链路层。

— 如果标记中的任何符号不属于 EDB,则结果是一个帧错误。

— EDB 标记的唯一合法时间是在 TLP 之后;任何其他用途都将是帧错误。

— 紧跟在 EDB 标记之后的符号将是要处理的下一个标记的第一个符号。

• 当 EDS 标记作为数据块的最后一个 DW 被接收时:

— 接收端必须停止处理数据流。

— 接下来,只有接收到 SKP、EIOS 或 EIEOS 有序集是合法的;接收到任何其他有序集都将是一个帧错误。

— 如果在 EDS 之后收到 SKP 有序集,则除非检测到帧错误,否则接收端必须使用随后的数据块的第一个符号(Symbol)恢复数据流处理。

• 当收到 SDP 标记时:

— 紧随 DLLP 之后的符号是下一个要处理的符号。

— 可选择在同一符号时间内检查多个 SDP 标记。如果检查并出现这种情况,则为帧错误。

• 当收到 IDL 标记时:

— 允许下一个标记在 IDL 标记之后的任何 DW 对齐的通道上开始。对于 x4 或更窄的链路,这意味着下一个标记只能在下一个符号时间的通道 0 开始。对于更宽的链路,有更多的选择。例如,x16 链路可以在当前符号时间的 0、4、8 或 12 通道开始下一个标记。

— 唯一与 IDL 在同一符号时间内可接收的标记是另一个 IDL 或 EDS。

• 在处理数据流时,接收端将以下情况视为帧错误:

— 紧跟着 SDS 之后的有序集。

— 具有非法同步头(11b 或 00b)的块。可选地,在通道错误状态(Lane Error Status)寄存器中报告这个错误。

— 任何通道上接收的有序集块,未在前一个数据块中收到 EDS 标记。

— 紧跟在前一个块中的 EDS 标记之后,接收到数据块。

— 可以选择验证所有通道是否收到相同的有序集。

12.2.5.5 从帧错误中恢复

如果在处理数据流时发现帧错误,接收端必须:

• 报告接收端错误(如果可选的高级错误报告(Advanced Error Reporting)寄存器可用,则置位第 421 页图 12-9 所示的相应状态位)。

• 停止处理数据流。当看到下一个 SDS 有序集时,可以开始处理新的数据流。

• 启动错误恢复过程。如果链路处于 L0 状态,则需要转换到恢复状态。该规范规定,恢复状态的时间“预期”小于 1us。

• 请注意,从帧错误中恢复不一定会通过 Ack/Nak 机制,直接导致数据链路层发起的恢复活动。(译注:很多情况下,从帧错误中恢复将会在物理层解决)当然,如果 TLP 由于错误而丢失或损坏,那么将需要触发重放事件(replay event)。

image-20221004095218494

图 12-9 AER 可恢复错误寄存器

12.3 Gen3 物理层发送逻辑

第 422 页的图 12-10 展示了支持 Gen3 速率的物理层传输逻辑的概念框图。整体设计与 Gen2 非常相似,所以没有必要再去重复讨论所有细节,但也存在一些区别。PCIe 新手建议回顾第 361 页的 “物理层-逻辑(Gen1 和 Gen2)” 一章,以了解物理层设计的基础知识。让我们从图的顶部开始,解释 Gen3 实现在整个过程中所做的更改。与之前一样,需要指出的是,下述的物理层实现讨论仅从教学目的出发,不是为了展示实际的 Gen3 物理层实现。

image-20221004095440864

图 12-10 Gen3 物理层发送逻辑细节

12.3.1 多路复用器

TLP 和 DLLP 来自顶部的数据链路层。多路复用器会在数据输入中添加构建完整 TLP 或 DLLP 所需的 STP 或 SDP 标记。上一节描述了标记格式。

Gen3 TLP 的边界由 TLP 数据包之前的 STP 标记长度字段中的双字计数定义,因此,不需要 END 帧字符。

当结束数据流时或在发送 SOS 之前,EDS 标记被加入数据流。多路复用器根据跳转计时器,定期将 SOS 插入数据流中。其他数据流之外的有序集,如 TS1、TS2、FTS、EIEOS、EIOS、SDS 也可以根据链路要求加入到数据流中。

数据包在由 2 位同步头标识的块中传输,同步头也是由多路复用器添加的。不过,在多通道链路的所有通道上复制同步头,是通过字节条带化(Byte Striping)逻辑实现的。

当没有要发送的数据包或有序集,但链路在 L0 状态下保持活动时,IDL(逻辑空闲,或数据零)标记被用作填充符。这些标记就像其他数据字节一样被加扰,并在接收端解码并识别为填充符。

12.3.2 字节条带化(Byte Striping)

这种逻辑将要传送的字节分布在所有可用的通道上。帧规则已在第 417 页 “发送端帧要求” 中进行了描述,现在让我们看一些示例并讨论如何应用这些规则。

首先考虑第 424 页图 12-11 所示的示例,其中说明了 4 通道链路。注意,当一个新的块开始时,同步头位同时出现在所有通道上,并定义了块的类型(本例中是数据块)。块编码对于每个通道都是独立处理的,但字节(或符号)在所有通道上都是条带化(striped)的,就像早期几代 PCIe 一样。

image-20221004101701986

图 12-11 Gen3 x4 比特条带化示例

12.3.2.1 字节条带化 x8 示例

接下来,考虑第 425 页图 12-12 所示的 x8 链路,这是基于的规范中的一个示例重新绘制的,以便于阅读。注意这里的比特流是垂直绘制的,而不是像之前的图 12-11 那样是水平的。在图 12-12 顶部,我们可以看到按要求以小端顺序显示的同步位,同时出现在所有通道上,指示数据块传输的开始。

在此示例中,首先发送 TLP,所以符号 0-4 包含 STP 帧标记,包括标记在内的整个 TLP 长度为 7DW。接收端需要知道 TLP 的长度,因为对于 8GT/s 速度,没有 END 控制字符(标识 TLP 的结束边界) 。相反,接收端统计双字(来找到 TLP 的结束边界),如果没有观察到 EDB(End Bad),则认为 TLP 是正常的。在这种情况下,TLP 在符号 3 的通道 3 处结束。

image-20221004101852697

图 12-12 Gen x8 示例:TLP 分跨块边界

接下来,从通道 4 和 5 上的 SDP 标记开始发送 DLLP。由于 DLLP 的长度始终为 8 个符号,因此它将在符号 4 的通道 3 结束。暂时,没有其他数据包要发送,因此 IDL 符号将被传输,直到另一个数据包准备就绪。发送 IDL 时,下一个 STP 标记只能在通道 0 中启动。在本例中,TLP 从符号 6 的通道 0 开始。

下一个 TLP 的数据包长度为 23 DW,这是一个有趣的情况,因为在下一个块边界之前只有 20 个双字(dwords)可用。当数据块结束时,发送端发送同步头,并在下一个数据块的符号 0 期间继续 TLP 传输。换句话说,数据包只是在必要时跨越块边界。最后,TLP 在符号 1 的通道 3 完成。再一次,没有需要发送的数据包了,因此发送 IDL(作为填充)。

12.3.2.2 无效的数据包 x8 示例

当跨交换机直通 TLP 以减少延迟时,可能会出现无效的 TLP。这称为交换机直通(Switch Cut-Through)操作。在继续讨论之前,读者可以选择阅读第 354 页标题为 “交换机直通模式(Switch Cut-Through Mode)” 的部分。

无效的 TLP 只可能出现在交换机的出端口,在接收方在入端口接收到数据包,即进行错误检查之前。此例中,因为会检测到一个错误,所以 TLP 肯定是无效的。

图 12-13 说明了使 TLP 无效的步骤。出端口发送的 TLP 从第一块开始(符号 6 的通道 0)。当检测到错误时,出端口反转 CRC(符号 1 的通道 0-3),并在 TLP(符号 1 的通道 4-7)之后立即添加一个 EDB 标记。这两个更改一起向接收端表明,这个 TLP 已经无效,应该被丢弃。请注意,EDB 字节不包括在数据包长度字段中,因为当发生错误时,它们会动态地添加到传输中的数据包中(译注:此时原 TLP 的长度已经在 STP 中传输给了对端,想改也不能改了)。

image-20221005205417711

图 12-13 Gen3 x8 无效报文

12.3.2.3 有序集示例 – SOS

现在我们来考虑一个有序集传输的示例。如第 427 页图 12-14 所示,一个有序集的特征是其 2 位同步首部值为 01b。同步头之后的字节将被接收端理解为构成一个长度为 16 字节(128 比特)的有序集。唯一的例外是 SOS(Skip Ordered Set),因为它可以被中间接收方以每次增加 4 个字节增量改变,用于时钟补偿。因此,允许一个 SOS 的长度为 8、12、16、20 或 24 个符号。如果存在不会在 SOS 中添加或删除 SKP 的链路中继器设备,SOS 将由 16 个字节组成。(译注:原文如此 In the absence of a Link repart device that does not add or delete SKP)

image-20221005205517564

图 12-14 Gen3 x1 有序集结构

让我们以一个 SOS 为例来,说明有序集各种特性以及它们是如何一起工作的。注意第 428 页的图 12-15,图中数据块后面跟着的是 SOS。帧规则规定,前一个数据块必须以最后一个双字中的 EDS 标记结束,以便让接收端知道一个有序集即将到来。如果当前的数据流要继续下去,则后面的有序集必须是 SOS,而且 SOS 之后必须依次是另一个数据块。有一种场景并没有在本例中体现: 此时 TLP 有可能还没有完成,并在必须紧跟 SOS 之后的数据块中恢复传输,来跨越 SOS 传输一个 TLP。

收到 EDS 标记意味着数据流要么结束,要么暂停并插入一个 SOS。EDS 是唯一可以在与 IDL 相同的符号时间,在双字对齐的通道上开始的标记,这个例子就是这样,从符号时间 15 的第 4 通道开始传输 EDS。回顾一下背景知识,EDS 也必须位于数据块的最后一个双字里。根据接收端的帧要求,在 EDS 之后只允许有一个有序集块,而且必须是 SOS、EIOS 或 EIEOS,否则将被视为成帧错误。与早期规格版本一样,有序集必须同时出现在所有通道上。接收端可以选择检查以确保每个通道都收到了相同的有序集。

在我们的例子中,接下来看到的是一个 16 字节的 SOS,它在接收端由有序集的同步头以及 SKP 字节模式识别。在 SOS 的末尾始终有 4 个符号,包含了当前 24 位加扰器 LFSR 状态。在符号 12 中,接收端知道 SKP 字符已经结束,同时也知道该块还有三个字节要在每条通道上传输。这些是加扰逻辑 LFSR 的输出,如第 428 页的表 12-2 所示。 image-20221005205335623

图 12-15 Gen3 x8 SOS 示例

表 12-2 Gen3 16 位 Skip Ordered Set 编码

符号编号 描述
0-11 AAh SKP 符号。符号 0 是有序集的标识符,因此它被视为 SOS。
12 E1h SKP_END 符号,表示再过 3 个符号后,SOS 将完成。
13 00-FFh a) 如果 LTSSM 状态为 Polling.Compliance:AAh
b) 否则,如果前一个块是数据块:
位[7]=数据奇偶校验
位[6:0]=LFSR[22:16]
c) 其他情况
位[7]=~LFSR[22]
位[6:0]=LFSR[22:16]
14 00-FFh a) 如果 LTSSM 的状态是 Polling.Compliance:Error_Status[7:0]
b) 否则 LFSR[15:8]
15 00-FFh a) 如果 LTSSM 的状态是 Polling.Compliance:Error_Status [7:0]
b) 否则 LFSR[7:0]

表中提到的数据奇偶校验位是自最近的 SDS 或 SOS 以来,发送的所有数据块加扰字节的偶校验,并且为每个通道独立创建。接收端需要计算和检查奇偶校验。如果校验位与数据不匹配,则必须设置与出现错误的通道对应的通道错误状态(Lane Error Status)寄存器位,但这不会被视为接收端错误,也不会启动链路重新训练。

8 位的 Error_Status 字段只有在 LTSSM 处于 Polling.Compliance 状态时才有意义(详情见第 529 页的 “Polling.Compliance”)。对于我们的数据块之后的 SOS 例子,第 13 字节是数据奇偶校验位和 LFSR[22:16],而最后两个字节是 LFSR 位[15:0]。

12.3.2.4 发送端 SOS 规则

使用 128b/130b 时,发送端的 SOS 规则包括。

• 一个 SOS 必须被安排在 370 至 375 个块内发出。然而,在 Loopback 模式下,Loopback Master 必须在这个时间段内安排两个 SOS,而且它们之间的距离不得超过两个块。

• SOS 仍然只能在数据包边界发送,因此可能会累积多个待发送的 SOS,但是,连续的 SOS 是不允许的;它们之间必须间隔数据块。

• 建议每当发送端处于电气空闲状态时,复位 SOS 计时器和计数器。

• 使用 128b/130b 时,链接控制寄存器 2 ( Link Control Register 2)中的一致性(Compliance)SOS 位无效。(它用来在 8b/10b 编码模式的一致性测试中禁用 SOS,但是 128b/130b 编码模式不支持这一选项)。

12.3.2.5 接收端 SOS 规则

使用 128b/130b 编码模式时,接收端接收 SOS(Skip Ordered Set)的规则包括:

• 他们必须容忍以 370-375 个块的平均间隔接收 SOS。请注意,电气空闲后的第一个 SOS 可能会提前到达,因为发送端不需要在电气空闲时间内复位 SOS 计时器(译注:虽然建议发送方这么做)。

• 接收端必须检查数据流中的每个 SOS 之前都有一个以 EDS 结尾的数据块。

12.3.3 加扰

128b/130b 的加扰逻辑是从前几代 PCIe 修改而来的,以解决 8b/10b 编码时代无需考虑(8b/10b 编码本身特性会解决这两个问题)的两个问题:保持 DC 平衡和提供足够的转换密度(transition density)。回顾一下,DC 平衡意味着比特流中的 1 和 0 的数量相等。这是为了避免 “DC wonder” 的问题,即传输介质持续充电/放电,以至于始终保持在某个电压值,通常为 1 或 0,以至于难以在必要短的时间内切换到另一信号电平值上。另一个问题是,接收端的时钟恢复逻辑需要在输入信号中看到足够的跳变边缘(edge),以便能够将它们与恢复的时钟进行比较,并根据需要调整时序和相位。

在没有 8b/10b 编码来处理这些问题的情况下,采取了三个步骤:第一,新的加扰方法在较长的时间段内改善了转换密度和 DC 平衡,但不能像 8b/10b 编码那样在短期内保证它们。第二,训练期间使用的 TS1 和 TS2 有序集模式包括根据需要调整的字段,以改善 DC 平衡。第三,接收端必须比前几代更加鲁棒,能容忍这些问题。

12.3.3.1 LFSR 的数量

在较低的数据速率下,每条通道都以相同的方式进行加扰,因此一个线性反馈移位寄存器(LFSR)可以为所有的通道提供加扰输入。然而,对于 Gen3,设计者希望为相邻的通道提供不同的加扰值。其原因可能包括希望通过加扰彼此的输出来减少通道之间串扰(cross-talk)的可能性,并避免在每个通道上有相同的值,比如发送 IDL 时。该规范描述了实现这一目标的两种方法,一种是强调更低的延迟,另一种是强调更低的成本。

12.3.3.1.1 第一种选择:多个 LFSR

第一种选择多个LFSR。一种解决方案是为每个通道实现一个单独的 LFSR,并用不同的起始值或 “种子” 来初始化每个通道。这具有简单和快速的优点,但代价是增加了逻辑数量。如图 12-16 所示,每个 LFSR 根据规范中给出的多项式 G(X)=X^23+X^21+X^16+X^8+X^5+X^2+1 创建一个伪随机输出。这个多项式比以前的版本要长,而且由于种子值的不同,通道之间的输出值也有一些不同。以 x8 通道为例,为每个通道分配的,共计八个不同的种子值需要八个不同的 LFSR,通道 0 到 7 各一个。

image-20221005205609441

图 12-16 Gen3 各通道独立 LFSR 的加扰逻辑

第 432 页的表 12-3 列出了每个通道的 24 位种子值。后续序列将重复先前的数值,这意味着通道 8 的种子值将与通道 0 相同,因此这里仅列出前 8 个值。每个通道使用相同的 LFSR 和相同的抽头(tap point)来创建加扰输出,使用不同的种子值来产生所需的差异。

表 12-3 Gen3 加扰种子值

image-20221005205946754

12.3.3.1.2 第二种选择:单个 LFSR

第二种选择:单 LFSR:另一种解决方案只使用单个 LFSR,如第 433 页图 12-17 所示,图中展示的通道 2、10、18 和 26 共享的加扰逻辑,并通过将不同的抽头异或为各个通道创建加扰输入。由于只有一个 LFSR,所有通道的种子值是相同的(全 1, all ones),但每个通道的加扰 “抽头表达式(Tap Equation)” 是由不同的抽头组合而成的,如第 433 页的表 12-4 所示。该规范还指出,4 个通道的抽头表达式可以通过 XOR 它们的位邻的抽头值而得到。

• Lane 0 = Lane 7 XOR Lane 1(注意,需要比通道 0 更低的通道时,抽头规律是绕回的,因此 Lane 7 被认为是 Lane 0 相邻的低通道)。

• Lane 2 = Lane 1 XOR Lane 3

• Lane 4 = Lane 3 XOR Lane 5

• Lane 6 = Lane 5 XOR Lane 7

单 LFSR 解决方案使用的逻辑门数比多 LFSR 版本少,但 XOR 过程产生了额外的延迟,相较于多 LFSR 方案,提供了一个不同的成本/性能选择。

image-20221005211244823

图 12-17 Gen3 使用单个 LFSR 的加扰逻辑

表 12-4 单 LFSR 方案抽头表达式

image-20221005213850220

12.3.3.2 加扰规则

Gen3 加扰器 LFSR(无论是在一个还是多个 LFSR 方案中)并不会不断移位移位寄存器(advance),而只是根据正在发送的内容移位。加扰器必须定期重新初始化,每当检测到 EIEOS 或 FTSOS 时都会进行初始化。为方便起见,在本节总结规范中给出的以下几种加扰规则:

• 同步头位不会被加扰,也不会使 LFSR 中的码流。

• 当最后一个 EIEOS 符号被发送时,发送端 LFSR 被复位,当最后一个 EIEOS 符号被接收时,接收端 LFSR 被复位。

• TS1 和 TS2 有序集:

— 符号 0 不会被加扰

— 符号 1 至 13 被加扰

— 符号 14 和 15 可能会也可能不会被加扰。规范规定,如果有必要改善 DC 平衡,它们将绕过加扰,否则将加扰(关于如何保持 DC 平衡的更多细节,见第 510 页的“TS1 和 TS2 有序集”)。

• 有序集 FTS、SDS、EIEOS、EIOS 和 SOS 的所有符号都不会被加扰。尽管如此,输出的数据流将有足够的转换密度以允许时钟恢复,而且实现 DC 平衡,因为有序集本身的符号选择会实现上述两点。

• 即使旁路(bypassed)时,发送端也会将所有有序集符号移位至他们 LFSR 的码流中,除了 SOS 中的符号。

• 接收端也是这样做的,检查传入的有序集的符号 0,看它是否是 SOS。如果是的话,LFSRs 就不会移入该块中的任何符号。否则,LFSR 将移入该块中的所有符号。

• 所有的数据块符号被加扰并被移入 LFSRs。

• 符号是按小端顺序进行加扰,也就是说,这意味着最低有效位首先加扰,最高有效位最后加扰。

• 每个通道 LFSR 的种子值取决于 LTSSM 第一次进入 Configuration.Idle(已完成轮询状态)时分配给该通道的通道数。第 432 页的表 12-3 中显示了模数为 8 的种子值,一旦分配,只要 LinkUp=1,就不会改变,即使通道编号因为回到配置状态而已经被重新分配了。

• 与 8b/10b 不同,在使用 128b/130b 编码时,不能禁用加扰器,因为需要它来帮助实现信号完整性。如果没有加扰,预计链路将无法可靠运行,因此它必须始终处于使能状态。

• Loopback Slave 不得对回环(loope-back)位进行加扰或解扰。

12.3.4 串行器

这个移位寄存器的工作方式与 Gen1/Gen2 数据速率的工作方式类似,只是它现在一次接收 8 位,而不是 10 位(即,串行器是一个 8 位并行到串行移位寄存器)。

12.3.5 用于同步头位的多路复用器

最后,每个块中必须加入两个同步头位,使接收端能够区分下一个字符块是数据块还是有序集块。位于每一个 130 位块的前两位,同步头比特的相关逻辑可以添加到发送端中有设计意义的任何位置。在这本例中,为了简单起见,这些比特是在发送过程的最后注入的。无论他们包含在何处,上面的字节流必须停顿下来,以便为添加它们留出时间。在本例中,需要有一种方法来通知上述的逻辑暂停两个比特的时间。在发送同步位期间,传入的数据包流将在 Tx 缓冲区中排队。

12.4 Gen3 物理层接收逻辑

与前几代一样,如第 436 页图 12-18 所示,接收端的逻辑从 CDR(时钟和数据恢复,Clock and Data Recovery)电路开始。逻辑中可能包括 PLL,该 PLL 根据预期频率和比特流中的电平跳变锁定发送端时钟的频率,以产生恢复的时钟(RX 时钟)。这个恢复时钟将锁存输入数据到串并转换缓冲器中,在建立了块对齐后(在 LTSSM 的恢复状态下实现),另一个是 RX 时钟 8.125 分频的恢复时钟(RX Clock/8.125)将 8 位符号锁存到弹性缓冲器(Elastic Buffer)中。之后,解扰器从加扰的字符中重新恢复出原始数据。这些字节绕过 8b/10b 解码器,直接被送到字节拆分(Byte Un-striping)逻辑。最后,有序集被过滤出来,在物理层处理,剩下的 TLPs 和 DLLPs 字节流被转发到数据链路层。

在下面的讨论中,将从图 12-18 底部向上描述每个部分。重点是描述为 8.0GT/s 改变的物理层的各个方面。本节将不会描述那些相比 Gen1/Gen2 协议没有变化的子块。

image-20221005215640803

图 12-18 Gen3 物理层接收逻辑详细框图

12.4.1 差分接收

差分接收端的逻辑没有变化,但有用于改善信号完整性的电气变化(参见第 468 页的 “信号补偿”),以及建立信号均衡的训练变化,这在第 577 页的 “链路均衡概述” 中有所介绍。

image-20221005220548027

图 12-19 Gen3 CDR 逻辑

12.4.2 CDR(时钟和数据恢复)逻辑

12.4.2.1 RX 时钟恢复

尽管新的加扰方案有助于时钟恢复,但它并不能保证在短间隔内有良好的转换密度。因此,CDR 逻辑现在必须能够在没有那么多电平跳变边沿的情况下保持较长时间的同步。规范中没有给出实现这一目标的具体方法,但可能需要一个更鲁棒的 PLL(锁相环,Phas-Locked Loop)或 DLL(延迟锁相环,Delay-Locked Loop)电路。

CDR 逻辑的另一个不同之处在于,Gen3 弹性缓冲器使用的内部时钟并不像人们想象的那样,简单地将 RX 时钟 8 分频。显而易见的原因是 Gen3 输入数据不只是 8 字节的倍数。相反,它是一个 2 位的同步头,其后是 16 个字节。这额外的两比特必须在一些逻辑中进行处理。规范没有要求任何特定的实现,但一个解决方案是仍然将时钟除以 8.125,如第 437 页的图 12-19 所示,在 130 位时间内产生 16 个时钟边缘。

考虑到块类型检测逻辑始终需要提取出两比特同步头,对其进行检查,所以,可以在达到块边界时,使用块类型检测逻辑从串并转换器中取出额外的两位,以确保只有 8 位数据字节被传递到弹性缓冲区。

为了解决这个问题,8.0 GT/s 数据速率的内部时钟实际上是 8.0 GHz/8.125 = 0.985GHz。这导致比通常用来描述 Gen3 带宽的 1.0GB/s 数据速率略低,但差异很小(比 1GB/s 低 1.5%),所以通常不被提及。

12.4.2.2 串并转换器

如第 437 页图 12-19 所示,通过恢复的 RX 时钟将传入的数据采样到每个通道的串行-并行转换器中。8 位符号被发送到弹性缓冲器,并由 RX 时钟的另一个分频时钟锁存进弹性缓冲器,该时钟已经是 RX 时钟的 8.125 分频,以适应 130 比特块中的 16 字节数据。

12.4.2.3 实现块对齐

训练期间发送的 EIEOS 用于识别 130 位块的边界。如第 438 页图 12-20 所示,这个有序集可以在比特流中被识别出来,因为它是由 00h 和 FFh 的字节交替出现的数据模式组成。当识别这种数据模式时,EIEOS 的最后一个符号被认定为块的边界,通过测试接下来的 130 比特数据流,将显示当前提取的边界是否正确。如果不正确,逻辑就继续搜索 EIEOS 的特定数据模式。这个过程在规范中被描述为三个阶段:未对齐、对齐和锁定。

**未对齐阶段。**接收端在经过一段时间的电气空闲后进入这个阶段,例如改变速率至 8.0GT/s 或从低功率链路状态退出时。在这个阶段,块对齐逻辑观察 EIEOS 的到来,因为交替字节的结尾必须与块的结尾相对应。当看到 EIEOS 时,调整块边界以对齐,块对齐状态进入下一阶段:对齐阶段。在此之前,接收端还必须在接收到 SOS 后,根据 SOS 的内容,调整块对齐的边界。

**对齐阶段。**在这个阶段,接收端继续监测 EIEOS,并在看到 EIEOS 时对其位和块对齐边界进行任何必要的调整。然而,由于他们已经初步确定了块边界,他们现在也可以搜索 SDS(数据流的开始)有序集,作为数据流的开端。当看到 SDS 时,接收端就进入了锁定阶段。在此之前,它还必须继续在 SOS 到来时,调整其块对齐边界。如果检测到未定义的同步头(值为 00b 或 11b),接收端将被允许返回到未对齐阶段。规范指出,这将在链路训练期间发生,当 EIEOS 后面是一个训练有序集时(TS1/TS2)。

**锁定阶段。**一旦接收端达到这个阶段,它就不再调整其块对齐 边界。相反,它现在期望在 SDS 之后看到一个数据块,如果此时发现必须重新调整对齐,一些未对齐的数据可能会丢失。如果检测到未定义的同步头,则接收端将被允许返回到未对齐阶段。一旦数据流处理停止,接收端可以被指示从锁定阶段转换到其他阶段之一(关于数据流的规则,请参见第 413 页 “数据流和数据块”)。

**特殊情况:环回。**在讨论块对齐时,规范描述了当链路处于环回模式时的情况。环回主机(Loopback Master)必须能够在环回期间调整对齐,并允许发送 EIEOS,并在 Loopback.Active 状态期间,回传检测到的 EIEOS ,在其基础上调整其接收端。环回从机(Loopback Slave)必须能够在 Loopback.Entry 状态期间调整对齐,但不能在 Loopback.Active 状态期间调整对齐。当从机开始回环比特流时,从机的接收端被认为处于锁定阶段。

12.4.2.4 区块类型检测

一旦实现了块对齐,接收端就可以识别进入的块的起始时刻,并检查前两位,以确定当前块属于两种可能的类型中的哪一种。有序集块只对物理层有意义,所以它们不会被转发到更高的层,但数据块会被转发。当检测到同步头时,块类型信息被传递给物理层的其他部分,以确定是否应从转发给更高层的字节流中删除当前块。时钟恢复机制和同步头检测有效地完成了必须在物理层进行的,从 130 位到 128 位的转换。

请注意,由于每个通道的块信息是相同的,这个逻辑只需要在其中一个通道中实现,例如第 436 页图 12-18 中所示的通道 0。但是,如果支持不同的链路宽度和通道反转特性,那么更多的通道将需要包含该逻辑,以确保活动的通道始终有该逻辑可用。例如,能够作为通道 0 运行的每条通道都需要实现该逻辑,但只有当前作为通道 0 的通道需要使用它。还要注意的是,由于规范没有给出这方面的细节,这里讨论和说明的示例只是对可行实现的猜测。

12.4.3 接收端时钟补偿逻辑

12.4.3.1 背景

PCIe 8.0 GT/s 的时钟要求与早期规范版本相同:两个链路伙伴的时钟频率必须在中心频率的+/-300 ppm(百万分之一)范围内,这导致(在最坏的情况下)每 1666 个时钟就会获得或失去一个时钟周期。

12.4.3.2 弹性缓冲区的作用

如第 441 页图 12-21 所示,使用恢复的时钟将接收到的符号采样到弹性缓冲器中,并使用接收端的本地时钟打拍输出。弹性缓冲器和早先协议版本一样,通过添加或删除 SKP 符号来补偿频率差,但现在它一次添加四个符号,而不是一次仅添加一个符号。当 SKP 有序集到达时,监控缓冲器状态的控制逻辑会进行评估。如果本地时钟运行速度较快,缓冲区将接近下溢状态,逻辑可以通过在 SOS 到达时追加四个额外的 SKP 来补偿,以快速重新填充缓冲区。另一方面,如果恢复的时钟运行得更快,缓冲区将接近溢出状态,逻辑将通过删除四个 SKP 来补偿溢出情况,以便在看到 SOS 时快速排空缓冲区。

image-20221005232359283

图 12-21 Gen3 弹性缓存逻辑

Gen3 发送端每 370 至 375 个块安排一次 SOS,但和早先协议版本一样,只能在块边界发送 SOS。如果在安排 SOS 时,有一个数据包正在传输,它们会被累积并在下一个数据包边界插入。然而,与较低的数据速率协议版本不同的是,在 8.0GT/s 下不允许有两个连续的 SOS。它们必须由用数据块隔开。接收端必须能够容忍由设备支持的最大数据包有效载荷大小分隔的 SOS。

事实上,仅以 4 个符号为增量进行调整,可能会影响到弹性缓冲区的深度需求,因为需要看到两个时钟之间差值大于 4,才会应用补偿,而一个大的数据包可能正在进行传输,占用了本来是适当进行补偿的时间。由于这个原因,需要谨慎确定这个缓冲区的最佳尺寸。所以,让我们考虑一个例子。在每块 16 个符号的情况下,375 块的 SOS 之间允许的时间等于 6000 个符号时间。将其除以最坏情况下获得或失去一个时钟的时间 1666,意味着在此期间最多可以获得或失去 3.6 个时钟。如果一个长度最大的 TLP(4KB)传输正好是在下一个 SOS 发送之前开始的,那么对于一个 x1 链路来说,它的整体延迟大约是 6000+4096=10096 符号时间,这意味着将获得或失去 10096/1666=6.06 时钟。因此,如果支持 4KB 大小的 TLP,缓冲器可能被设计成在保证 SOS 到达之前,能够处理 7 个过多或过少的符号。可能发生的情况是,在第一个 SOS 被发送之前,已经安排了两个 SOS。在较低的数据速率下,排队的 SOS 是背对背发送的,但对于 8.0GT/s 来说,它们不会被连续发送,必须用一个数据块隔开。每当 SOS 到达接收端时,它可以添加或删除 4 个 SKP 符号,以快速填充或耗尽缓冲区,避免出现问题。

12.4.4 通道与通道之间的偏斜

12.4.4.1 通道间的飞行时间差异

对于多通道链路,通道之间数据的到达时间差异,将在接收端被自动纠正,延迟较早到达的通道上的数据,直到最晚通道上的数据到达,以使所有通道的数据到达时间相同。该规范允许设计者以他喜欢的任何方式来实现去偏斜。但是如果在弹性缓冲器之后,使用数字延迟逻辑来实现去偏斜有一个好处,即到达时间差异此时已经被采样为接收端的本地符号时钟。如果在某个时钟边沿,一个通道的输入数据到达,而另一个通道的输入数据则没有,那么它们之间的差异将可以用若干个时钟周期来衡量,所以早到的通道可以简单地延迟适当数量的时钟周期,使其与晚到的通道保持一致(见第 444 页的图 12-22)。事实上,接收端的最大允许偏斜量是以时钟周期的倍数来衡量的,采用这一方案使衡量最大允许偏斜量指标变得容易,并推断出规范编写者可能倾向于这种实现方式。正如规范中所定义的那样,对于 Gen1(5 个符号时间的时钟,每个符号 4ns)和 Gen2(4 个符号时间的时钟,每个符号 2ns),接收端去偏斜(de-skewing)能力必须支持 20ns 偏斜, Gen3(6 个符号时间的时钟,每个符号 1ns)则是 6ns。

12.4.4.2 去偏斜的契机

必须在所有通道上同时看到相同的符号才能执行去偏斜,任何有序集都可以。然而,去偏斜只在 L0s、恢复(Recovery)和配置(Configuration)LTSSM 状态下执行。特别是,它必须是以下状态转移的必要条件:

• 离开 Configuration.Complete

• 离开 Configuration.Idle 或 Recovery.Idle 后开始处理数据流

• 离开 Recovery .RcvrCfg

• 离开 RX_L0s.FTS

如果偏斜值在 L0 状态下发生变化(例如,基于温度或电压变化),则可能会发生接收端错误并导致重放 TLP。如果问题持续存在,链路最终将转换到恢复状态,并在那里进行去偏斜处理。规范指出,虽然设备在 L0 状态下不允许对其链路进行去偏斜,但在此状态下必须定期发送的 SOS 包含 LFSR 值,目的是帮助外部工具完成这一工作。这些工具不受数据流规则的限制,可以搜索 SOS,并使用其数据模式来实现数据流中的位锁定、块对齐和通道间的去偏斜。

规范指出,当离开 L0s 时,发送端将发送一个 EIEOS,然后是正确数量的 FTS,并在每 32 个 FTS 后插入另一个 EIEOS,然后是最后一个 EIEOS,以协助块对齐,最后是一个 SDS 有序集,目的是启动数据流外,以及用于去偏斜。

14.4.4.3 接收端通道间的去偏斜能力

可以理解的是,发送端只允许引入最小的偏斜量,以便将剩余的偏斜预算用于覆盖走线差异和其他变化。接收端可校正的允许偏差量如第 443 页的表 12-5 所示,可以看出,这种偏差很容易与 Gen3 的符号次数相对应,就像早期数据速率一样。这使得可以选择在弹性缓冲器之后使用延迟寄存器来完成去偏斜,与先前章节中的 Gen1/Gen2 物理层实现一致。

表 12-5 信号偏斜参数

image-20221006203624748

当使用 8b/10b 编码时,一种明确的去偏斜机制是监视 COM 控制字符,它必须同时出现在所有通道上。128b/130b 没有这个选项,但有序集仍然需要同时出现在所有通道上,如 SOS、SDS 和 EIEOS。因此,尽管在对通道进行去偏斜时要寻找的数据图样不同,但过程可以是相同的。

image-20221006203652191

图 12-22 接收端去偏斜逻辑

12.4.5 解扰器

12.4.5.1 综述

接收端遵循与发送端完全相同的加扰多项式生成规则,并简单地将相同的值再次与输入数据进行 XOR 以恢复原始信息。与发送端一样,他们可以为每个通道实现一个单独的 LFSR,或者只实现一个。

12.4.5.2 禁用解扰

与 Gen1/Gen2 数据速率不同,在 Gen3 模式下,不能禁用解扰,因为它在促进时钟恢复和信号完整性方面起着重要作用。在较低的速率下,TS1 和 TS2 控制字节中的“禁用加扰” 位被用来通知链路邻居加扰特性被关闭。在 8.0GT/s 以及更高的速率该位是保留不使用的。

12.4.6 字节拆分(Byte Un-Striping)

这个逻辑与 Gen1 或 Gen2 的实现基本相同。在某些时候,Gen3 的字节流和较低数据速率的字节流必须混合在一起,第 445 页图 12-23 中的示例显示了在拆分(un-striping)逻辑之前发生的情况。

12.4.7 数据包过滤

由字节拆分(un-striping)逻辑提供的串行字节流包含 TLPs、DLLPs、逻辑空闲(IDLs)和有序集。逻辑空闲字节和有序集在这里被消除,不被转发到数据链路层。剩下的是 TLPs 和 DLLPs,它们与数据包类型的指示符一起被转发。

12.4.8 接收缓冲区(RX Buffer)

RX 缓冲区保存收到的 TLPs 和 DLLPs,直到数据链路层能够接收它们。规范中没有描述数据链路层的接口,因此设计者可以自由选择总线宽度等细节。通道越宽,时钟频率就越低,但需要更多的信号和逻辑来支持它。

12.5 关于 128b/130b Loopback 的注意事项

规范特别说明了环回模式在更高速率下的操作。基本规则可以归纳如下:

• 环回主机(Loopback master)必须发送实际的有序集或数据块,但在从数据块变为有序集时,他们不需要遵循正常的协议规则,在有序集变成数据块时反之亦然时。换句话说,SDS 有序集和 EDS 标记不是必需的。从机必须不期望或检查它们的存在。

• 主机必须像往常一样发送 SOS,并且必须允许环回流中的 SKP 符号数量不同,因为接收端将进行时钟补偿。

• 允许环回从机通过一次添加或删除 4 个 SKP 符号来修改 SOS,就像他们通常为时钟补偿所做的那样,但产生的 SOS 仍必须遵循正确的格式规则。

• 除了 SOS 和 EIEOS 之外,所有内容都应该完全按照发送时的情况环回,因为 SOS 可以像刚才描述的那样发生变化,而 EIEOS 和 EIOS 在环回中都有明确的用途,应该避免使用。

• 如果从机无法获取块对齐,它将无法按照收到的所有位进行环回,并允许根据需要添加或删除符号以继续操作。


原文: Mindshare

译者: Brook

校对: LJGibbs

欢迎参与 《Mindshare PCI Express Technology 3.0 一书的中文翻译计划》

Gitee:

https://gitee.com/ljgibbs/chinese-translation-of-pci-express-technology

Github:

https://github.com/ljgibbslf/Chinese-Translation-of-PCI-Express-Technology-