1.2.1 概述
PCIe 规范定义了一种分层的设备设计体系结构。这些层分为处理层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer),在垂直方向上又可以进一步分成两部分:处理出站流量的发送部分和处理入站流量的接收部分。
1.2.2 设备层及相关的数据包
1.2.2.1 处理层事务包(TLP)
TLP 数据包的装配
软件层/设备核心层将装配 TLP 核心部分所需要的信息发送到处理层,这部分信息是 TLP 数据包的头和数据部分。某些 TLP 不包含数据部分。接下来要计算可选的端到端的 CRC(ECRC) 字段并将其附加到数据包中,因为该数据包的最终目标设备要使用 ECRC 字段来检查 TLP 头和数据部分中的 CRC 错误。
TLP 的核心部分被转发至数据链路层,然后由数据链路层为其附加序列 ID 和 LCRC 字段。链路另一端的相邻接收器设备使用该 LCRC 字段检查 TLP 的核心部分和序列 ID 中的 CRC 错误。装配后的 TLP 被转发至物理层,由物理层再附加各一字节的开始和结束成帧字符。然后,对数据进行编码,并使用链路上可用的通道差动发送数据包。
TLP数据包的拆解
临近的接收器设备接受进入的 TLP 比特流。物理层解码接收到的 TLP ,剥去开始和结束帧字段。得到的 TLP 被发送至数据链路层,由数据链路层检查该 TLP 中的任何错误,并剥去序列 ID 和LCRC 字段。没有 LCRC 错误,则该 TLP 将被向上转发至物理层。如果接收设备是交换器,那么交换器将根据 TLP 头中包含的地址信息将该数据包由交换器的一个端口路由至一个出端口。允许交换器检查 ECEC 错误,甚至报告它发现的错误。但不允许交换器修改 ECRC,如果存在这样的错误,该 TLP 的目标设备将检测到一个 ECRC 错误。
该 TLP 的最终目标设备负责检查其头和数据部分中的 ECRC 错误。在剥去 ECRC 字段后,留下该数据包的头和数据部分,而正是这些信息将最终被转发至设备核心/软件层。
-
-
-
- 数据链路层数据包(DLLP)
-
-
DLLP 数据包源于发送器设备的数据链路层,终止于接收器设备的数据链路层。当 DLLP 通过 PCIe 链路从一台设备传送到另一台设备时,物理层对 DLLP 的装配和拆解也起作用。
DLLP 可用于链路管理功能,包括与 ACK/NAK 协议相关的 TLP 确认,电源管理和流控制信息的交换。
DLLP 在链路上两个直连组件的数据链路层之间传输。与通过 PCIe 结构传输的 TLP 不同,DLLP 不通过交换器。DLLP 也不包含路由信息。与 TLP 相比,这些数据包较小,为 8 个字节。
DLLP 的装配
DLLP 有多种类型,包括流控制 DLLP,确认 TLP 接收的确认/否认 DLLP(ACK 和 NAK)、电源管理 DLLP(PMx)。DLLP 的类型字段会标识出各种 DLLP 的类型。数据链路层在 DLLP 上附加 16bits 的 CRC ,DLLP 接收器用来检查 DLLP 中的 CRC 错误。
DLLP 的内容和 16bits CRC 一起被转发至物理层,物理层在该数据包中附加各 1 字节的开始和结束成帧字符。然后对数据包进行编码,并利用可用通道在链路上差动发送数据包。
DLLP 的拆解
由接收设备的物理层接收 DLLP ,解码接收的比特流并剥去其开始和结束帧字段。再将得到的数据包发送至数据链路层,由该层检查 CRC 错误并剥去 CRC 字段。数据链路层时 DLLP 的目的地,不再向上面的处理层转发。
1.2.2.3 物理层数据包(PLP)
PLP 源于发送器设备的物理层,终止与接收器设备的物理层。PLP 是一种非常简单的数据包,开始是 1 字节的 COM 字符,后面是定义 PLP 类型以及含有其它信息的 3 个或多个字符。PLP 的大小是 4 字节的整数倍。规范将这种数据包成为有序集(Ordered Set)。PLP 不包含任何路由信息,不会被路由通过结构,也不会通过交换器进行传播。在链路定向过程中会使用一些 PLP,一些 PLP 可以用于时钟容差补偿,还可以用PLP 将链路置于电气空闲低功率状态,或者从这种低功率状态唤醒链路。
1.2.4 各 PCIe 设备层的功能
下图是一个更详细的 PCIe 设备层模块图。该模块图可用来解释每层的主要功能,以及生成出站流量和相应入站流量时每一层的功能。这些层包括设备核心/软件层、处理层、数据链路层和物理层。
1.2.4.1 设备核心/软件层
设备核心由根联合体核心逻辑或注入以太网控制器、SCSI 控制器、USB 控制器等端点核心逻辑组成。
发送部分:设备核心逻辑与本地软件一起提供PCIe 设备生成 TLP 所需的必要信息。这些信息通过发送接口发送至设备的处理层。发送至处理层的信息包括:事务类型、地址、发送的数据量、数据、流量类别、消息索引等。
接收部分:设备核心逻辑负责通过接收接口来接收处理层发送的信息。这些信息包括:处理层接收的 TLP 的类型、地址、接收的数据量、数据、接收的 TLP 的流量类别、消息索引以及错误情况等。
1.2.4.2 处理层
处理层负责生成出站 TLP 流量和接收入站 TLP 流量。处理层支持用于非报告事务的分离事务协议。处理层会将给定标记值的入站完成 TLP 与早先发送的相同标记值的出站非报告请求 TLP 联系起来。
处理层含有虚拟信道缓冲区(VC 缓冲区),用来存储等待发送的出站 TLP 以及从链路上接收的入站 TLP。与这些虚拟信道缓冲区相关的流控制协议能保证远程发送器不会发送太多的 TLP,因而不会引起接收器接收器虚拟信道缓冲区溢出。发送前,处理层还能根据顺序规则对 TLP 排序。支持服务质量(QoS)协议的正是该层。
处理层支持 4 种地址空间:存储器地址空间、IO 地址空间、配置地址空间和消息空间。消息数据包内包含信息。
发送部分:处理层从设备核心接收信息并生成出站请求和保存在虚拟信道缓冲区中的完成 TLP,同时负责装配处理层数据包(TLP)。TLP 的主要组成部分是:头、数据有效载荷和一个可选的 ECRC (规范中也是用摘要(Digest)这一术语)字段。
头的大小为 3 或 4 个双字,并且可以包含诸如地址、TLP 类型、传送大小、请求者ID/完成者ID、标记、流量类别、字节允许、完成代码和属性(包括“不侦测(no snoop)”和“灵活的顺序”比特)等字段。
对于存储器请求,该地址是 32bits 的存储器地址或扩展的 64bits 地址。对于 IO 请求,该地址是 32bits 的地址。对于配置事务,该地址时由总线号、设备号和功能号再加上目标寄存器的配置寄存器地址组成的 ID。对于完成 TLP,该地址是最初发出请求设备的请求者 ID。对于消息事务,用来路由的地址时目的地设备的 ID,它由总线号、设备号和消息请求的目标设备的功能号所组成。消息请求也可以由目标根联合体或上游端口隐式广播或路由。
传送大小或长度字段指出要传送的数据量,计算时以双字为单位。数据传送长度可以是 1~1024 个 DW。写请求 TLP 在其头的长度字段中指定的这个量包括数据有效载荷。对于读请求 TLP,长度字段指出向完成者请求的数据量。这些数据在 1 个或多个完成数据包中返回。读请求 TLP 没有包含数据有效载荷字段。字节允许指定了解析字节级地址的方法。
请求数据包中包含发送请求设备的请求者 ID (总线号、设备号、功能号)。完成者将记住请求中的标记字段并在完成中使用相同的标记。
头中的一个比特(TD = TLP 摘要)指出该数据包是否含有 ECRC 字段,又称为摘要。该字段 32bits 位宽,含有端到端 CRC(ECRC)。ECRC 字段是由处理层在创建出站 TLP 时生成的,并且是根据整个 TLP,从头的第一个字节一直到数据有效载荷的最后一个字节(不包括 EP 比特和类型(Type)字段的bit0。在计算 ECRC时,认为则两个比特总是 1 计算的。当 TLP 通过结构时,它从不会变化。当数据包通过结构时,接收设备检查可能出现的 ECRC 错误。
接收部分:处理层的接收部分将入站 TLP 保存在虚拟信道缓冲区中。接收器根据 TLP 中的 ECRC 字段检查 CRC 错误。如果没错。删去 ECRC 字段,然后将在 TLP 头中得到的信息以及数据有效载荷发送给设备核心。
流控制:流控制是在硬件级自动管理的,且对软件是透明的。软件仅仅涉及使超出虚拟信道缓冲区默认设置(成为 VC0 缓冲区)的其它缓冲区可用。链路定向后,自动启用默认的缓冲区。因而在链路定向之后,允许 TLP 流量立即通过结构。配置事务使用默认虚拟信道缓冲区,并且在链路定向过程结束后可以立即开始。
接收设备定期地发送一种称为流控制数据包(FCx DLLP)的 DLLP 给发送设备。该 FCx DLLP 含有流控制信用(credit)信息,用来更新发送器关于接收器虚拟信道缓冲区还有多少可用空间的信息。发送器会追踪这一信息,并且在知道远程接收器有多少空间可以接收 TLP 时,才发送 TLP 离开其物理层。
服务质量(QoS):指的是以不同的优先级和确定的延迟及带宽路由不同应用程序的数据包通过结构的能力。PCI 和 PCI-X 系统不支持 QoS 能力。能实现多组虚拟信道缓冲区的 PCIe 设备具有仲裁来自不同 VC 缓冲区的 TLP 的能力。VC 缓冲区的优先级时可配置的。因此不同 VC 缓冲区中流过系统的流量将遵守不同的性能。在流过不同 VC 缓冲区的 TLP 流量之间进行仲裁的机制成为 VC 仲裁。
流量类别(TC)和虚拟信道(VC):TC 是在数据包内发送的一个 TLP 头字段,在端到端通过结构时没有改变。本地应用软件和系统软件应根据性能要求确定某个 TLP 使用什么样的 TC 标志。VC 是物理缓冲区,它通过使用发送和接收器虚拟信道缓冲区,提供一种在物理链路上支持多个独立逻辑数据流的手段。PCIe 设备可以最多实现 8 个 VC 缓冲区(VC0~VC7)。TC 字段是一个 3bits 长的字段,可以将不同的流量分成 8 种流量类别(TC0~TC7)。设备必须实现 VCO。设备或交换器要实现 TC-VC 映射逻辑,把给定 TC 号的 TLP 使用特定的 VC 号的缓冲区通过链路转发。PCIe 具有映射多个 TC到一个 VC 的能力,因而可通过提供有限数目的 VC 缓冲区支持来降低设备成本。
端口仲裁和 VC 仲裁:处理层支持仲裁的目的是:为结构内的数据流提供不同的服务;提供确定的、有保证的带宽并使端到端事务延迟最小。端点设备和只有一个端口的根联合体不支持端口仲裁,仅支持处理层 VC 仲裁。
事务顺序:事务顺序规则可以保证与给定流量类别相关的 TLP 流量以正确的顺序路由通过结构,以防止可能发生死锁或活锁现象。与不同TC 标志相关的流量之间没有次序关系。处理层保证在将给定 TC 的 TLP 转发至数据链路层和物理层传输之前,对它和其他 TC 标志相同的 TLP 正确排序。
电源管理:处理层支持 ACPI/PCI 电源管理,同系统软件要求的一样。处理层硬件可自动管理某设备的电源,使其在工作电源状态的功耗最小。这种自动电源管理成为活动状态电源管理,与软件无关。与 OS 有关的电源管理软件通过电源管理配置寄存器管理某一设备的电源状态。
配置寄存器:设备的配置寄存器与处理层有关。这些寄存器将在初始化和总线计数期间配置。也可以由设备驱动程序配置,由运行时软件/OS 访问。这些寄存器要负责保存已协商的链路功能,例如链路带宽和频率。
1.2.4.3 数据链路层
数据链路层的主要功能是保证在各链路上发送和接收数据包时数据的完整性。如果某发送器设备发送一个 TLP 至链路另一端的远程接收器设备,并且检测到了一个 CRC 错误,则发送器设备会得到一个 NAK DLLP,而且该发送器设备会自动发送该 TLP。在错误检查和接收数据包有错重发的情况下,PCIe 能以非常高的概率保证由一台设备发送的 TLP 能够毫无错误地到达其最终目的地。
发送部分:在转发出站 TLP 至数据链路层前,数据链路层必须遵守流控制机制。如果存在足够的信用,保存在虚拟信道缓冲区内的 TLP 将从处理层被传递至数据链路层准备发送。
下图显示了与数据链路层的 ACK-NAK 机制有关的逻辑。数据链路层负责 TLP CRC 的产生和 TLP 错误检查。对于发送设备 A 的出站 TLP,将生成链路 CRC(LCRC)并附加在 TLP 上。另外,还要讲一个序列 ID 附加在 TLP 上。设备 A 的数据链路层在重放缓冲区中保留该 TLP 的一个副本并发送该 TLP 给 B。数据链路层的远程设备 B 接收该 TLP 并检查 CRC 错误。
如果没有错误,设备 B 的数据链路层返回一个带序列 ID 的 ACK DLLP 给设备 A。设备 A 可以确认该 TLP 已经成功到达设备 B。同时,设备 A 清除其重放缓冲区中与该序列 ID 有关的 TLP。
如果远程设备 B 在接收到的 TLP 中检测到了 CRC 错误,则一个带序列 ID 的NAK DLLP 将被返回到设备 A。若在 TLP 传输过程中出现了错误,设备 A 的数据链路层将重发重放缓冲区中相关的 TLP。数据链路层生成用于错误报告和记录机制的错误标记。
对于重放缓冲区中某一给定的 TLP,如果发送器设备接受了某一 NAK 4 次,结果将导致该 TLP 另外被重发了 3 次,则数据链路层记录此错误,报告一个可纠正的错误并重新定向该链路。
接收部分:数据链路层的接收端负责入站 TLP 的 LCRC 错误检查。如果没有检测到错误,该设备安排一个 ACK DLLP 传回远程的发送器设备。接收器设备还要负责剥去该 TLP 的LCRC 字段和序列 ID。数据链路层的接收端还能接收远程设备的 ACK 和 NAK。如果接收到一个 ACK,数据链路层的接收端会通知发送端清除重放缓冲区中相关的 TLP。如果接收到一个 NAK,接收端引起发送端的重放缓冲区重发相关的 TLP。
接收端还负责检查接收 TLP 中的序列 ID,以检验丢失的或失序的 TLP。
数据链路层对 TLP 和 DLLP 的影响:数据链路层将一个 12bits 的序列 ID 和 32bits 的 LCRC 字段与从处理层得到的出站 TLP 连接在一起。得到下图的 TLP。序列 ID 可以用来将重放缓冲区中保存的出站 TLP 的副本与从相邻远程设备接收的入站 ACK/NAK DLLP 联系起来。ACK/NAK DLLP 确认出站 TLP 已到达远程设备。
该 32bits 的 LCRC 是根据 TLP 的所有字节,包括序列 ID 计算出来的。
DLLP 是一个 CRC 字段为 16bits 的 4 字节数据包。8bits 的 DLLP 类型字段可以表示各种类型的 DLLP,包括 ACK、NAK、与电源管理有关的 DLLP(PM_Enter_L1、PM_Enter_L23、PM_Active_State_Request_L1、PM_Request_L1)和与流控制有关的 DLLP(InitFC1-P、InitFC1-NP、InitFC1-Cpl、InitFC2-P、InitFC2-NP、InitFC2-Cpl、UpdateFC-P、UpdateFC-NP、UpdateFC-Cpl)。16bits 的 CRC 是利用 DLLP 的所有4 个字节计算出来的。接收到 CRC 检查失败的 DLLP 被丢弃。丢弃一个 DLLP 损失的信息是自修复的,因而后续的 DLLP 将代替丢失的信息。ACK 和 NAK DLLP 含有设备可以用来将入站的 ACK 和 NAK DLLP 与重放缓冲区中保存的 TLP 副本关联起来的序列 ID 字段(如下图中杂项字段所示)。
说明 ACK-NAK 协议的非报告事务:
步骤1a:请求者发送一个存储器读请求 TLP(MRd)。交换器接收 MRd TLP 并利用 MRd TLP 中的 LCRC 字段检查 CRC 错误;
步骤1b:如果没有错误,则交换器返回一个 ACK DLLP 给请求者。请求者丢弃其重放缓冲区中该 TLP 的副本。
步骤2a:交换器利用存储器地址进行路由,转发 MRd TLP 至正确的出端口。完成者接收 MRd TLP,并利用 LCRC 检查接收 MRd TLP 中的 CRC 错误;
步骤2b:如果没有错误,则返回者返回一个 ACK DLLP给交换器。见换气丢弃其重放缓冲区中该 MRd TLP 的副本;
步骤3a:完成者利用 MRd TLP 中的可选字段 ECRC 来检查 CRC 错误。假设没有端到端错误。当完成者得到请求的数据时,它返回一个带数据 TLP 的完成(CplD)。交换器接收 CplD TLP,并利用 LCRC 检查 CRC 错误;
步骤3b:如果没有错误,则交换器返回一个 ACK DLLP 给完成者。完成者丢弃其重放缓冲区中该 CplD TLP 的副本;
步骤4a:交换器解码 CplD TLP 中的请求者 ID 字段,并路由该数据至正确的出端口。请求者接收 CplD TLP,并利用 LCRC 来检查接收 CplD TLP 中的 CRC 错误;
步骤4b:如果没有错误,则请求者返回一个 ACK DLLP 给交换器。交换器丢弃其重放缓冲区中该 CplD TLP 副本。请求者可以利用可选 ECRC 字段中的 CRC 字段确定该 CplD TLP 是否有错。假设没有端到端错误,请求者检查 CplD 中的完成错误代码。假设完成代码是“成功完成”。为了将完成与原请求关联起来,请求者将 CplD 中的标记与原 MRd 请求中的标记相匹配,并且接收数据。
数据链路层的其他功能:加电或复位后,流控制机制将由数据链路层初始化。这一过程是在硬件层次上自动完成的,没有软件的参与。
默认虚拟通道 VC0 的流控制首先被初始化。当软件激活其它 VC 时,对每一新激活的 VC 要重读流控制初始化过程。
1.2.4.4 物理层
物理层分成两部分:逻辑物理层和电气物理层。逻辑物理层包括在链路上发送之前,对数据包进行有关处理的数字逻辑,或在发送数据包至数据链路层之前,对从链路上入站的数据包进行处理的数字逻辑。电气物理层是连接物理层和链路的模拟接口,由各通道的差动驱动器和差动接收器组成。
发送部分:来自数据链路层的 TLP 和 DLLP 被定时输入到逻辑物理层的缓冲区中。物理层在 TLP 和 DLLP 前后分别添加一个开始和结束成帧字符。这一符号时成帧编码字节,接收设备利用它来监测数据包的开始和结束。附加在一个 TLP 和 DLLP 上的开始和结束字符如下图所示。
发送逻辑子部分将从数据链路层接收的数据包整理成正确的发送格式。数据包被拆分成字节,由链路上的可用通道传送。
然后,用线性反馈移位寄存器类型的扰频器加扰数据包中的每个字节。通过加扰各个字节,可以消除链路上重复的比特模式,从而降低所产生的平均 EMI 噪声。
得到的字节由 8b/10b 编码逻辑编码成 10b 的代码。将 8b 的字符编码成 10b 符号的主要目的,是使比特流中有足够多的 1 到 0 和 0 到 1 的转换,以便在远程接收器设备上 PLL 的帮助下很容易地重建接收时钟。注意,没有将数据和时钟一起发送,而是比特流中含有足够多的转换,使得接收器设备能够重建接收时钟。
并行到串行转换器用于生成每条通道上数据包的串行比特流。
接收部分:接收设备的电气物理层会定时输入差动到达所有链路的数据包。利用串行到并行转换器可将数据包的串行比特流转换成 10b 的并行流。接收逻辑还有一个弹性缓冲器,可以调节发送时钟和接收时钟之间的时钟频率变化,发送时钟是数据包比特流定时输入接收器时钟。8b/10b 解码器此时用于将 10b 符号流解码回每个符号的 8b 表示。8b 字符时去扰的。字节反拆分逻辑将重建远程设备发送的原数据包流。
链路定向与初始化:物理层的另一个功能是初始化和定向链路。链路初始化和定向是物理层控制的过程。这一过程配置并初始化正常工作的每条链路。该过程是自动的,要确定下面的参数:
链路宽度;
链路数据速率;
通道反转;
极性倒置;
每通道比特锁定;
每通道符号锁定;
多通道链路内通道到通道之间的相位补偿。
链路宽度:可以连接每链路通道数不同的两台设备。
通道反转:可选。通道是编号的,设计者可能没有正确地连接两个端口正确通道之间的连线。在这种情况下,链路定向会考虑将通道号反过来,以便链路各端相邻端口的通道号相匹配。部分相同的过程可能考虑将多通道链路分解成多条链路。
极性倒置:两台设备的 D+ 和 D- 差动对终端的连接可能不正确。在这种情况下,定向序列接收器会将差动接收器上的极性倒置。
链路数据速率:定向期间,各节点通告其最高数据速率能力。将用链路两端对应设备所支持的最大公共频率来初始化该链路。
通道到通道之间的相位补偿:由于多通道链路上链路导线长度变化和驱动器/接收器的特性不同,各通道的比特流到达接收器时相对于其它通道有相位偏移。接收器电路必须通过增加或减小各通道的延迟来补偿这一相位偏移。
链路电源管理:链路的正常加电操作成为 L0 状态。低功率的链路状态时 L0s、L1、L2 和 L3 状态。在这些状态下,不发送或接收数据包。当链路不活动一段时间并出现超时后,链路自动进入 L0s 电源状态。进入和退出这一状态不设计软件,且退出延迟最短。L1 和 L2 是比 L0s 还低的电源状态,但退出 L1 和 L2 的延迟较大。L3 电源状态是全关闭电源状态。设备不能由此状态生成唤醒事件。
复位:支持两类复位。①冷/热复位也称为基本复位,发生在设备加电后(冷复位)或没有重新施加电源的复位(热复位)。②hot 复位有时又成为协议复位,是一种带内传播复位的方法。有序集的发送就是用来发出 hot 复位信号的。软件发起 hot 复位的生成。
电气物理层:一台设备的发送器与链路另一端另一台设备的接收器时 AC 耦合的,如下图。AC 耦合电容器的大小在 75~200nF 之间。发送器的 DC 共模电压时在链路定向和初始化期间确定的。DC 共模阻抗通常是 50Ω,而差动阻抗通常是 100Ω。