前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【译文】【第二章③】Mindshare PCI Express Technology 3.0

【译文】【第二章③】Mindshare PCI Express Technology 3.0

作者头像
空白的贝塔
发布2022-02-16 08:28:24
1.3K0
发布2022-02-16 08:28:24
举报
文章被收录于专栏:摸鱼范式

原文:Mindshare

译者:Michael ZZY

校对: LJGibbs

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

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

2.2.3 数据链路层(Data Link Layer)

数据链路层这一层的逻辑是用来负责链路管理的,它主要表现为3个功能:TLP 错误纠正、流量控制以及一些链路电源管理。它是通过如图2‑24 所示的 DLLP 来完成这些功能的。

2.2.3.1 DLLPs数据链路层包(Data Link Layer Packet)

DLLP 是一种在位于同一条链路上的本端设备的数据链路层与对端设备的数据链路层之间传输的数据包。事务层对这些数据包并无感知,它们只在两个相临近的设备之间传输,不会被路由到任何其他地方。DLLP通常要小于TLP,大部分情况下DLLP只有8Bytes,这是一件好事,因为DLLP的大小也影响着维护链路所需要的开销。

图2‑24 DLLP的起始地和目的地

l DLLP 组包(DLLP Assembly)

如图2‑24 所示,一个 DLLP 起源于发送方的数据链路层,并结束于接收方的数据链路层。在这个 DLLP 中由发送方给 DLLP Core 加上了一个 16 比特 CRC,用来供接收方进行错误校验。在加完 CRC 之后,这个 DLLP 被转发至物理层,在这一层里给 DLLP 加上包起始字符和包结束字符(这种方法是 Gen1 和 Gen2 的方法,Gen3 不再使用),并对加完两种字符的 DLLP 进行编码,然后通过链路上的所有通道进行差分传输。

l DLLP 拆包(DLLP Disassembly)

当接收方的物理层接收到了一个 DLLP ,这个 DLLP 的比特流将被译码并剥去包起始字符与包结束字符。剩余的 DLLP 部分被转发至数据链路层,在这里进行 CRC 错误校验,并根据包的内容执行相应的操作。接收方的数据链路层就已经是 DLLP 的最终目的地,它不会被继续向上呈交给事务层。

2.2.3.2 Ack/Nak 协议(Ack/Nak Protocol)

如图2‑25 所示是一种基于硬件的自动重试机制。如图2‑26 所示,每一个被发送方发出的 TLP 都被加上了 LCRC 与序列号,在接收方会对这两个信息进行检查。发送方的重传缓存保存着每个被发送的 TLP 的副本,直到对端确认成功收到了这个 TLP。这个确认成功收到的过程是通过接收方发送 Ack DLLP 来实现的,在这个 Ack DLLP 中包含有接收方成功接收的上一个 TLP 的序列号。当发送方收到这个 Ack DLLP,它将会把里面序列号所对应的 TLP、以及这个 TLP 之前的所有 TLP,都从重传缓存内清除。

如果接收方检测到了一个 TLP 错误,它将会把这个 TLP 丢弃,并向发送方返回一个 Nak DLLP,以期望发送方能对未确认成功接收的 TLP 进行重传,并通过重传获得一个完好的 TLP。由于错误检测通常是十分迅速的操作,因此从错误检测开始到发起重传的时间也比较短,这样就可以在较短的时间内纠正发生的错误。这一操作过程被称为 Ack/Nak(Acknowledge/NotAcknowledge) 协议。

图2‑25 数据链路层重传机制

图2‑26 在数据链路层中的 TLP 与 DLLP 的包结构

一个 DLLP 的基础形式如图2‑26 所示,它由 4 字节的 DLLP 类型域以及 2 字节 CRC 组成,其中 DLLP 类型域中包含了一些其他的信息。

如图2‑27 所示,它展示了一个内存读 TLP 通过交换机的示例。一般来说,这个过程的步骤如下:

  1. 步骤1a:发起方发送一个内存读请求,并在自身的重传缓存中也保存一个请求包的副本。交换机接收这个 MRd TLP(Memory Read TLP,以后简写为 MRd TLP),并校验 LCRC 以及序列号。 步骤1b:校验未发现出错,因此交换机向发起方返回一个 Ack DLLP。作为响应,发起方将其重传缓存中保存的 MRd TLP 副本丢弃。
  2. 步骤2a:交换机将这个 MRd TLP 转发到正确的输出端口,使用的路由信息是这个 MRd TLP 的内存地址,在转发出去的同时,交换机会在这个输出端口的重传缓存内保存一份这个 TLP 的副本。完成方接收到这个 MRd TLP 并对其进行错误校验。 步骤2b:校验未发现出错,因此完成方向交换机返回一个 Ack DLLP。作为响应,交换机之前输出这个 TLP 的输出端口会将其重传缓存中保存的这个 MRd TLP 的副本丢弃。
  3. 步骤3a:作为这个请求的最终目的地,完成方将会校验 MRd TLP 中的 ECRC 字段域,这个字段域是可选的不是必需的。若校验未出错,则将这个请求呈交给设备核心层。然后根据这个请求命令中的相关信息,设备将会收集被请求的数据,发起方返回一个 CplD(Completion with Data TLP,带有数据的完成包),同时它也将在自己的重传缓存中保存这个 CplD TLP 的副本。当交换机接收到这个 CplD TLP 时将会对其进行错误校验。 步骤3b:校验未发现出错,因此交换机向完成方返回一个 Ack DLLP。作为响应,完成方将其重传缓存中保存的这个 CplD TLP 的副本清除。
  4. 步骤4a:交换机对这个 CplD TLP 中的发起方 ID 进行译码,并通过这个信息将 CplD TLP 路由至正确的输出端口,输出的同时在这个输出端口的重传缓存内保存 CplD TLP 的副本。当发起方接收到这个 CplD TLP 时将会对其进行错误校验。 步骤4b:校验未发现出错,因此发起方向交换机返回一个 Ack DLLP。作为响应,交换机之前输出这个 CplD TLP 的输出端口会将其重传缓存中保存的这个 CplD TLP 的副本丢弃。发起方将校验 ECRC 字段域(这个字段是可选的,不是必需的),校验未出错则将完成包里的数据向上呈交给设备核心层逻辑。

图2‑27 使用 Ack/Nak 协议的非报告式事务

2.2.3.3 流量控制(Flow Control)

数据链路层的第二个主要功能就是流量控制。在系统上电和复位之后,流量控制机制被数据链路层的硬件自动初始化,并在整个运行过程中更新。关于这些内容的概述已经在 TLP 的那一节给出,所以这里不再赘述。想要了解更多关于这一主题的内容,请参阅第六章“流量控制”。

2.2.3.4 电源管理(Power Management)

最后要介绍的一点,数据链路层也参与了电源管理,因为链路与系统电源状态相关的请求和握手也可以通过 DLLP 来进行。想了解关于这一主题的更详细的内容,请参阅第十六章“电源管理”。

2.2.4 物理层(Physical Layer)
2.2.4.1 整体说明(General)

物理层是 PCIe 协议层次里的最底层,如图2‑14。TLP 和 DLLP 这两种类型的数据包都需要从数据链路层向下转发至物理层,这样才能通过链路传输至对端接收方设备,并从接收方的物理层向上转发至它的数据链路层。协议规范中将关于物理层的讨论分为两部分:逻辑部分和电气部分。我们这里也将保留这种划分方式。逻辑物理层包含了一系列的数字逻辑,这些数字逻辑是关于准备将数据包在链路上进行串行传输的逻辑以及相反的输入数据包的处理逻辑。电气物理层是物理层的模拟电路接口,它与链路直接相连,它为每个通道提供差分驱动器以及差分接收器。

2.2.4.2 逻辑物理层(Physical Layer-Logical)

由数据链路层转发来的 TLP 与 DLLP 被物理层中的缓存所记录,在这个缓存中会对这些数据包加上包起始字符和包结束字符,这两个字符将有助于接收端用来检测数据包的边界。由于包起始字符和包结束字符分别出现在数据包的两端(头和尾),因此他们也被称作“组帧”字符。如图2‑28 展示了组帧字符被添加在 TLP 和 DLLP 上,它也展示了这两种字符的字段长度。

图2‑28 物理层中的 TLP 与 DLLP 的结构

在物理层中,数据包中的每一个字节都将被分割到链路所使用的所有通道,这一过程被称为字节条带化(byte striping)。实际上,每个通道在链路上都扮演着一个独立的串行传输路径,这些通道们各自传输的数据会在接收端被聚合。每个字节都进行了扰码,以此来减少在传输线上传输连续重复的“0”或“1”,这有助于减少链路上的 EMI(electro-magnetic interference,电磁干扰)。

对于前两代的 PCIe(Gen1 和 Gen2),8 比特的字符将被编码为10比特“符号(symbol)”,所使用的编码方式被称为 8b/10b 编码。这种编码增加了输出数据流的额外开销,但是也带来了不少有用的特性(关于这里的更多内容请见“8b/10b 编码”一节)。PCIe Gen3 的物理层逻辑在使用 Gen3 速率进行传输时(因为也可以向下兼容 Gen1、Gen2 速率),不再使用 8b/10b 编码方式,而是采用了另一种被称为 128b/130b 的编码,它会将数据包的字节扰码后进行传输。每个通道的10b 符号(对于Gen1 Gen2)或者每个通道的数据包的字节(对于 Gen3)随后就会在链路的每个通道上以串行差分的形式被传输,对应的速率为 Gen1 2.5GT/s,Gen2 5GT/s,Gen3 8GT/s。

当数据包的比特到达接收端时,接收端以训练得到的时钟速率对这些数据包的比特进行接收。如果使用的是 8b/10b 编码,那么输入的比特流将被串并转换器转换成 10 比特符号,然后准备用来做 8b/10b 解码。然而,在解码之前,10 比特符号将会经过一个弹性缓存,这是一个聪明(clever)的设备,它可以对两个相连接设备各自内部时钟之间的微小频率差异进行补偿。接下来,10 比特符号被 8b/10b 解码器解码,正确地恢复成 8 比特字符。

PCIe Gen3 与前面所述的这个过程不同,对于 Gen3 的物理层逻辑来说,当接收到以 Gen3 速率传输的数据包串行比特流时,将使用串并转换器将这个比特流转换为字节流,这个串并转换器已经建立了块锁定(Block Lock,这是链路训练中的一个要素)。随后字节流会通过一个弹性缓存进行时钟容忍度补偿。在 Gen3 速率下数据包数据并没有使用 8b/10b 编码,因此可以跳过 8b/10b 解码这一步。最终,每个通道中的 8 比特字符都将经过解扰,然后经过反条带化(de‐scrambled)之后将所有通道内的字节聚合重新恢复成单符号流,这样就在接收端恢复出了发送端所发出的数据流。

2.2.4.3 链路训练和初始化(Link Training and Initialization)

物理层的另一个任务就是负责链路的初始化以及训练过程。在这个全自动化的过程中,为了让链路准备好进行正常工作,我们采用了几个步骤,主要为确定几个可选条件的状态。例如,链路宽度可以从 1 通道到 32 通道,并且可以提供多种速度。链路训练过程将会发现这些可选项,并通过一个状态机来寻求一个建立最佳连接的组合,也就是说链路训练将会确认这些可选项具体的值(链路宽度、速率等)。在这个过程中,为了确保执行正确以及最优的操作,我们需要检查或者建立一些东西,例如:

  • 链路宽度(Link width)
  • 链路数据率(Link data rate)
  • 通道调转(Lane reversal)—— 通道收发连接相反了,本应 TX 连对端 RX ,若相反则变成 TX 连了对端 TX。
  • 极性反转(Polarity inversion)—— 通道极性连接相反,TX_P 应当连接对端的 RX_P,若相反则变成了 TX_P 连接了对端的 RX_N。
  • 每个通道的位锁定(bit lock)—— 恢复出发送方的时钟。
  • 每个通道的符号锁定(symbol lock)—— 在比特流中找到一个可辨认的位置。
  • 多通道链路中的 Lane-to-Lane 歪斜去除。
2.2.4.4 电气物理层(Physical Layer-Electrical)

物理的发送器和接收器是通过一个 AC 耦合链路相连接,如图2‑29 所示。所谓“AC 耦合(交流耦合)”,意思是两个设备相连接的物理路径上放置有电容,它用于让信号的高频部分(AC 交流)通过,而阻塞低频(DC 直流)部分。许多串行传输方式中都使用了这种方法,因为它允许发送端和接收端的共模电压不同(共模电压指的是0、1电平交界处的电压),这意味着发送端和接收端可以使用不同的参考电压。当两个设备的物理连接距离很近时,这一特性优势并不明显,而若它们距离较远,例如位于不同的大楼里,那么它们将很难使用一个完全相同的公共的参考电压。

图2‑29 电气物理层

2.2.4.5 字符集(Ordered Sets)

最后要介绍的一种只使用物理层在设备之间发送的流。尽管这种信息对于接收端来说很容易进行识别,但是它并没有被做成数据包的形式,原因是比如它没有包起始字符和包结束字符。因此作为一种替代方法,这种信息被组织成了一种被叫做“字符集(Ordered Sets)”的东西,它起始于发送端的物理层,终止于接收端的物理层,如图2‑30 所示那样。对于 Gen1 和 Gen2 的数据率下,一个字符集使用一个单独的 COM 字符作为起始,然后后面接着 3 个或以上的其他字符用于定义要发送的信息。关于这些不同类型字符在 PCIe 中的命名的更细节的讨论请见“字符符号(Character Notation)”一节,对于现阶段来说只要知道 COM 字符的特性能让我们达到想要的设计目标即可。字符集的大小总是 4 字节的整数倍,图2‑31 展示了一个字符集的例子。在 Gen3 操作模式中,字符集的格式就不同于上述的 Gen1/Gen2 格式了。更多详细内容请见第十四章“链路初始化和训练”。字符集永远只会终止于链路的对端设备,而不会被交换机路由转发至 PCIe 网络中,也就是说对端设备如果是交换机那么它的最终目的地就是交换机。

图2‑30 字符集的出发地和目的地

字符集在链路训练过程中同样有应用,请参阅第十四章“链路初始化和训练”。它们也被用于补偿发送端和接收端内部时钟的轻微差异,这一过程被称为时钟容忍度补偿。最后一点,字符集还可以用于指示链路进入或者退出低功耗状态。

图2‑31 字符集结构

2.3 协议回顾(Protocol Review Example)

现在,让我们通过一个示例来回顾整个链路协议,这个例子将从发起方发起一个内存读请求(MRd)开始,直到发起方从完成方获得所请求的数据为止,讲解这过程中所发生的操作步骤。

2.3.1 内存读请求(Memory Read Request)

关于我们开始讨论的第一部分,请参考图2‑32。发起方的设备核心层或者说是软件层将会向事务层发起一个请求,这个请求中包含了这些信息:32 比特或 64 比特的内存地址、事务类型、需要读取的数量总量(以dw为单位计数)、流量类型、字节使能、属性等等。

图2‑32 内存读请求的各阶段

事务层使用上面所述的那些信息来构建一个 MRd TLP。关于 TLP 内部格式的细节我们稍后再进行描述,目前我们只需要知道 TLP 的 Header 大小为 3DW 或 4DW,这取决于它的地址字段的大小(32 位地址对应 3DW Header,64 位地址对应 4DW Header)。此外,在 Header 中还有事务层加入的发起方 ID字段(bus#,device#,function#),完成方可以通过这个发起方 ID 字段来返回完成包。TLP 随后被置入相应优先级的虚拟通道缓存中,等待轮到它被发送。一旦这个 TLP 被选中,流量控制逻辑将会确认对端设备的接收缓存(虚拟通道)有足够的可用空间来接收这个 TLP,然后 MRd TLP 就被向下发送至数据链路层。

在数据链路层中,数据包被加上 12 比特的序列号以及32 比特的 LCRC。并在重传缓存中保存这个TLP的一个副本,然后这个数据包就被向下转发至物理层。

在物理层中,数据包被加上包起始字符以及包结束字符,然后在所有可用的通道上进行字节条带化,再进行扰码、8b/10b 编码。最终这个数据包的比特在链路上的每个通道内以串行差分的形式传输到对端。

完成方接收到输入的比特流,它将这个比特流先进行串并转换将比特流恢复成 10 比特符号,然后让它们通过一个弹性缓存。随后 10 比特符号被解码后恢复成字节,然后每个通道上的字节都被解扰以及反条带化。接下来完成方物理层检测到包起始字符和包结束字符,并将它们从 TLP 中剥除。剩余的 TLP 被向上转发至数据链路层。

完成方的数据链路层将对接收到的 TLP 进行 LCRC 错误校验,并检查 TLP 序列号以确定是否存在 TLP 丢失或 TLP 失序。若这些步骤都无错,数据链路层将生成一个 Ack 信息,里面包含了与这个 MRd TLP 中相同的序列号。然后再给这个 Ack 信息加上 16 比特的 CRC,这样就组成了一个 Ack DLLP,将这个 Ack DLLP 送回物理层,由物理层加上相应的组帧符号,并把 Ack DLLP 传输给发起方。

发起方的物理层接收到 Ack DLLP 后,对其组帧符号进行检查和剥除,然后向上转发至数据链路层。如果数据链路层对其 CRC 校验无错,它将会用 Ack DLLP 内的序列号与重传缓存中保存的 TLP 副本的序列号进行比较,并将与 Ack DLLP 中序列号相匹配的 TLP 副本从重传缓存中清除。相反地,若发起方接收到的是一个 Nak DLLP,那么它将把序列号匹配的这个 MRd TLP 进行重传。由于 DLLP 仅对数据链路层有意义,所以在这些 DLLP 的操作中将不会有东西向上转发给事务层。

除了上述的产生 Ack DLLP 之外,完成方的数据链路层还将把 TLP 向上转发给事务层。在完成方的事务层中,TLP 被置于与其优先级相对应的虚拟通道接收缓存中,等待被处理。然后可以对 TLP 进行 ECRC 校验(ECRC 为可选项),若校验无错,那么 TLP Header 的内容(地址、发起方 ID、MRd 事务类型、请求数据总量、流量类型等)将被向上转发至完成方的软件层。

2.3.2 Cpld(Completion with Data, 带有数据的完成包)

下面开始介绍此次举例回顾 PCIe 协议的另一半内容,请参考图2‑33。为了服务 MRd 请求,完成方的设备核心层/软件层将会向它的事务层发送一个 CplD(Completion with Data,带有数据的完成包)请求,这个完成包请求中包含了与 MRd 请求中相同的发起方 ID、Tag,还包含了事务类型以及另外的完成包头内容,并且完成包中还包含了被请求的数据。

图2‑33 带有数据的完成包的各阶段

事务层使用 CplD 请求中的这些信息来构建一个 CplD TLP,这种 TLP 的 Header 固定为3DW(这是由于 CplD TLP 使用发起方 ID作为路由信息,因此不会需要用到 64 比特的地址)。事务层也会将自身的完成方 ID添加到 CplD TLP Header 中。这个数据包随后被放置入一个合适的虚拟通道的发送缓存中,一旦这个虚拟通道被仲裁选中并要发送这个 CplD TLP,流量控制逻辑将会确认对端设备有足够的可用缓冲区空间来接收它,当确认足够后则将这个 CplD TLP 向下转发至数据链路层。

如前文所述那样,数据链路层给数据包加上 12 比特的序列号和 32 比特的 LCRC。然后将添加完这些信息的 TLP 保存一份副本在重传缓存中,之后变将数据包向下转发至物理层。

依然如前文所述那样,物理层给数据包加上包起始字符和包结束字符,并将其在所有可用通道上进行字节条带化,再进行扰码、8b/10b 编码。最终,这个 CplD TLP 数据包在链路的所有通道上以串行差分的形式被传输至对端。

当发起方接收到这个 CplD TLP 的输入比特流时,它将比特流转换恢复成 10 比特符号(10bit symbol),并让 10bit 符号流通过一个弹性缓存。随后 10bit 符号被解码恢复为字节,并进行解扰和字节反条带化。然后物理层就能检测到这个 CplD TLP 的包起始字符和包结束字符,并将这两个字符剥去。之后便将剩余的 CplD TLP 向上转发至数据链路层。

和之前一样,数据链路层对 CplD TLP 进行 LCRC 校验,并检查序列号以确定是否存在 TLP 丢失或出现 TLP 失序。如果并未出现错误,数据链路层将产生一个 Ack DLLP,其中包含了与 CplD TLP 中相同的序列号,并给这个 Ack DLLP 加上 16 比特 CRC,然后将其送回给物理层加上相应的组帧字符并将这个 Ack DLLP 传输给完成方。

完成方的物理层将会检测并剥除 Ack DLLP 的组帧字符,并将剩余的部分向上转发给数据链路层,在这里对 Ack DLLP 的 CRC 进行校验。若校验无错,完成方的数据链路层将 Ack DLLP 中的序列号与重传缓存中的 TLP 的序列号进行对比。与 Ack DLLP 序列号相匹配的 TLP 将被从重传缓存中清除。反之,若完成方接收到的是一个 Nak DLLP,那么它将使用重传缓存中存储的 CplD TLP 副本来进行重传。

与此同时,发起方的事务层在某个虚拟通道的缓存中接收到了这个 CplD TLP。作为一个可选操作,事务层可以校验这个 TLP 的 ECRC。若校验无错,事务层将这个 CplD TLP 的 Header 内容、数据荷载以及请求完成状态信息向上呈交给发起方的软件层。至此,大功告成。

术语翻译

英文

翻译

Function

功能

Endpoint

端点

Bridge

Dual-simplex

双单工

Link

链路

Lane

通道

bit

比特

Common Clock

公共时钟

skew

偏斜

Differential Signaling

差分信号

forwarded clock

随路时钟

Recovered Clock

恢复时钟

deserializer

解串器

side-band control signal

边带控制信号

Switches

交换机

Root Complex

根组件

forward bridge

前向桥

reverse bridge

反向桥

legacy

传统

configuration header

配置首部

Device Core

设备核心层

Transaction Level

事务层

Data Link Level

数据链路层

Physical Level

物理层

Ordered set Packet

字符序列包

byte striping logic

字节条带化逻辑

Scrambler

扰码器

elastic buffers

弹性缓存

de-scrambler

解扰器

byte unstriping logic

字节反条带化逻辑

Link Training and Status State Machine

链路训练状态机

Virtual Channel

虚拟通道

inbound packet

入站数据包

outbound packet

出站数据包

non-posted

非报告式

Split Transaction Protocol

拆分事务协议

requester

发起方

completer

完成方

framing

组帧

clock tolerance compensation

时钟容忍度补偿

Replay Buffer

重传缓存


原文:Mindshare

译者:Michael ZZY

校对:XTang

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 摸鱼范式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.2.3 数据链路层(Data Link Layer)
    • 2.2.3.1 DLLPs数据链路层包(Data Link Layer Packet)
      • 2.2.3.2 Ack/Nak 协议(Ack/Nak Protocol)
        • 2.2.3.3 流量控制(Flow Control)
          • 2.2.3.4 电源管理(Power Management)
          • 2.2.4 物理层(Physical Layer)
            • 2.2.4.1 整体说明(General)
              • 2.2.4.2 逻辑物理层(Physical Layer-Logical)
                • 2.2.4.3 链路训练和初始化(Link Training and Initialization)
                  • 2.2.4.4 电气物理层(Physical Layer-Electrical)
                    • 2.2.4.5 字符集(Ordered Sets)
                    • 2.3 协议回顾(Protocol Review Example)
                      • 2.3.1 内存读请求(Memory Read Request)
                        • 2.3.2 Cpld(Completion with Data, 带有数据的完成包)
                        • 术语翻译
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档