一、PCIe链路
这种设备间的通信通道称为链路(Link),由一组或多组收发信号对构成。每一组收发对称为通道(Lane)。根据规范,一条链路可由1、2、4、8、12、16或32条通道组成,通道数量称为链路宽度(Link Width),通常表示为x1、x2、x4、x8、x16和x32
二、PCIe拓扑
主要包含以下几个部分:
- Root Complex
- Switches and Bridges
- Endpoint
- Point-to-Point
(1)Root Complex
根复合体可理解为系统CPU与PCIe拓扑之间的接口,其PCIe端口在配置空间中标记为"根端口(Root Ports)"。
(2)Switches and Bridges
交换器(Switches)提供扩展或聚合能力,允许在单个PCIe端口上连接更多设备。它们作为数据包路由器,能根据地址或其他路由信息判断数据包的传输路径。
桥接器(Bridges)用于连接其他总线(如PCI/PCI-X总线),甚至可桥接至另一条PCIe总线。
(3)Endpoint
在PCIe拓扑中,端点设备(Endpoints)是指除交换器和桥接器之外的设备,它们作为总线事务的发起方(Initiators)和完成方(Completers)。这类设备位于树状拓扑的末端分支,仅实现单个上行端口(Upstream Port,面向根复合体)。相比之下,交换器可拥有多个下行端口(Downstream Ports),但上行端口同样只能有一个。
- 传统PCIe端点(Legacy PCIe Endpoints):
专为旧版总线(如PCI-X)设计但现配备PCIe接口的设备,这类设备会在配置寄存器中声明自身为"传统端点"。它们支持新式PCIe设计中已禁止的功能,例如IO空间访问、IO事务处理及锁定请求(Locked requests)。 - 原生PCIe端点(Native PCIe Endpoints):
专为PCIe架构全新设计的设备(而非旧版PCI设备的接口改造版本)。这类设备采用内存映射IO(MMIO)机制运作。
三、PCIe设备层次结构
3.1、主要组成部分概述
PCIe设备层次结构组成,主要包含以下几个部分:
(1)设备核心与事务层接口
- 设备核心实现设备的主要功能:
-
- 若为端点设备,最多可包含8个功能(Functions),每个功能都有独立的配置空间
- 若为交换机,其核心包含数据包路由逻辑和用于实现此目标的内部总线
- 若为根设备,根核心实现虚拟PCI总线0,其上驻留所有芯片组嵌入式端点和虚拟桥接器
(2)事务层
- 负责在发送端创建事务层数据包(TLP),在接收端解码TLP
- 还负责以下功能:
-
- 服务质量(QoS)
- 流量控制
- 事务排序
(3)数据链路层
- 负责在发送端创建数据链路层数据包(DLLP),在接收端解码DLLP
- 还负责链路错误检测与纠正(称为Ack/Nak协议)
(4)物理层
- 负责在发送端创建有序集数据包(Ordered-Set),在接收端解码有序集数据包
- 处理链路上传输的所有三类数据包(TLP、DLLP和有序集),以及从链路接收的所有类型数据包
- 物理层的链路训练与状态状态机(LTSSM)负责链路初始化和训练
3.2、各层次之间的交互概述
(1)发送端
设备发出的请求或完成数据包的内容,由事务层根据设备核心逻辑(有时我们也称为软件层,尽管规范并未使用该术语)提供的信息进行组装。这些信息通常包括所需命令类型、目标设备地址、请求属性等。新创建的数据包会被存储在称为虚拟通道(Virtual Channel)的缓冲区中,直到准备好传递至下一层。
当数据包传递至数据链路层时,会添加额外的信息以供相邻接收端进行错误检查,同时会在本地存储副本以便在传输错误发生时重新发送。当数据包到达物理层后,会经过编码处理,并使用链路所有可用通道进行差分传输。
(2)接收端
在接收端,物理层会对输入的比特流进行解码,并检测该层级可识别的传输错误。若未发现错误,便将处理后的数据包向上传递至数据链路层。数据链路层会对数据包进行另一类错误检测,若无误则继续上传至事务层。数据包在事务层经过缓冲存储、错误校验后,将被解构还原为原始信息(包括命令、属性等),最终交付给接收端的设备核心处理。
3.3、各层次涵盖内容概览
1、设备核心/软件层
作为设备的顶层功能模块(如网络接口或硬盘控制器),该层虽未被PCIe规范明确定义为一个独立层级,但可视为架构中的逻辑层——因其位于事务层之上,且作为所有请求的源端或目的端。其核心功能包括:
- 发送端:向事务层提供包含交易类型、地址、数据量等参数的请求信息
- 接收端:处理从事务层上传的已接收数据包内容
2、事务层
(1)概述
该层作为协议栈的核心枢纽,主要实现以下功能:
请求处理
- 根据软件层请求生成出站数据包
- 解析入站数据包并将有效信息上传至软件层
协议支持
- 为非发布式事务(Non-posted Transactions)实现拆分事务协议
- 将入站完成包(Completion)与早期发出的非发布请求进行关联
数据包类型
采用事务层数据包(TLP)处理四类请求:
- 存储器事务(PCI/PCI-X既有功能)
- IO事务(PCI/PCI-X既有功能)
- 配置事务(PCI/PCI-X既有功能)
- 消息事务(PCIe新增类型)
注:每个事务由发往目标设备的请求包及其对应的完成包共同构成,形成端到端交易闭环。
(2)PCIe请求类型
a)非发布式请求(Non-posted Requests)
- 工作机制:
请求方(Requester)发出数据包后,需要完成方(Completer)返回完成包(Completion)作为响应。该机制继承自PCI-X的拆分事务协议(split transaction protocol)。 - 典型场景:
- 所有读请求(必须通过完成包返回数据)
- IO写入(需确认写入成功)
- 配置写入(需确保配置生效)
- 关键特性:
即使数据已随请求发送,仍要求目标设备返回完成包以确认数据无误到达。
b)发布式请求(Posted Requests)
- 适用场景:
- 存储器写入(Memory Writes)
- 消息事务(Messages)
- 性能优势:
目标设备无需返回完成包,避免了等待响应的时间开销,显著提升传输效率。 - 潜在风险:
请求方无法获知写入是否完成或是否出错(该特性继承自PCI协议,因故障概率低且性能收益显著而被保留)。
(3)事务层数据包
TLP数据包封装流程如下:
TLP(事务层数据包)的传输始于发送端的事务层,终止于接收端的事务层(如图2-15,第62页所示)。在传输过程中,数据链路层和物理层会逐层添加包头/包尾等控制信息;接收端则通过逐层校验,确保这些控制信息经链路传输后仍保持完整准确。
如图2-16(第63页)所示,完整TLP数据包在链路上传输时的结构组成采用分层着色标识:
- 红色:事务层添加的包头(Header)和端到端CRC(ECRC)
- 蓝色:数据链路层添加的序列号和LCRC校验码
- 绿色:物理层添加的帧起始/结束标识符
(4)TLP数据包解封装流程
1. 物理层处理:
- 验证并移除起始/结束控制字符
- 将剩余TLP数据转发至数据链路层
2. 数据链路层处理:
- 检查LCRC和序列号错误
- 若无错误,移除这些字段并转发至事务层
3. 交换设备处理(如接收端为交换机):
- 在事务层解析TLP包头获取路由信息
- 确定转发端口
- 可检测并报告ECRC错误(但不得修改ECRC值)
4. 目标设备处理:
- 检查ECRC错误(若功能启用)
- 若无错误:
- 移除ECRC字段
- 将包头和数据部分转发至软件层
(5)事务层事务举例
非报告式事务 (Non-Posted Transactions)
1、内存读
如图2-18(第65页)所示,本示例展示了端点设备向系统内存发起存储器读请求的全过程:
请求包关键属性
- 目标地址字段(32位或64位)作为路由决策依据
- 详细TLP格式解析参见第169页第5章《TLP元素》
典型传输路径
- 请求包经由两级交换机转发
- 最终到达目标设备(本例中为根复合体)
数据返回规范
- 完成包生成规则:
- 根端口事务层按需生成多个完成包
- 单包最大载荷上限4KB(实际设备常采用更小值)
- 大数据传输场景:
- 需拆分为多个完成包传输
- 保持严格的请求-完成包序列对应关系
(技术注解:此流程体现了PCIe非发布式事务的三大特征——显式路由、拆分响应、可靠传输)
2、IO与配置写
如图2-20所示,非发布式IO写入事务的处理流程如下:
目标设备限制:
- 仅允许访问传统端点设备(Legacy Endpoint)
- 与锁定请求共享相同的设备兼容性约束
传输处理流程
(1)请求路由:
- 基于IO地址通过交换设备逐级转发
- 最终抵达目标端点设备
(2)响应机制:
- 完成方接收数据后生成无数据完成包
- 状态字段包含执行结果:
- 成功:确认数据接收
- 失败:触发请求方软件处理
与内存写入不同,仅知道数据最终会到达目标是不够的——必须获得明确送达确认后,才能执行后续操作步骤"
仅处理器可发起此类请求
报告式事务 (Non-Posted Transactions)
1、存储器写
无确认传输协议
- 请求方发出写入请求后立即释放总线资源
- 不等待目标设备返回完成包(Completion)
- 链路层传输成功即标记事务完成
路由处理流程
- 基于目标内存地址进行全网状路由
- 采用"发射后不管"(fire-and-forget)传输模式
- 目标设备异步接收数据
2、消息写
与其他类型的请求不同,消息请求支持多种路由方式,具体路由类型由消息包内的专用字段指定。典型路由模式包括:
- 定向传输:作为发布式写入请求发送至特定完成端
- 广播传输:由根复合体向所有端点广播
- 自动路由:从端点自动传输至根复合体
消息机制在PCIe架构中实现了两大重要改进:
- 引脚数优化:
取代传统PCI必需的边带信号(如中断请求、电源管理事件等)
所有系统状态信息均通过常规数据通道传输
协议统一性:
将离散的系统信号整合为标准化消息包
支持在标准数据通路上传输128种系统消息(包括错误报告、电源状态切换、热插拔事件等)
该设计显著降低了物理层复杂度,同时保持了协议扩展性。
(6)事务层其余涉及内容
QOS
PCIe 通过以下机制实现 QoS,确保对时间敏感的应用(如音视频流)数据传输的及时性:
a)流量类别 (Traffic Class, TC): 软件为每个数据包分配一个 3 位字段(TC),数值越高,优先级越高。
b)虚拟通道 (Virtual Channels, VC): 每个端口内置多个缓冲区(VC),根据数据包的 TC 将其放入相应的 VC。
c)仲裁逻辑: 由于每个端口有多个 VC,需要仲裁逻辑来决定从哪个 VC 发送数据包。
d)端口仲裁 (Port Arbitration): 交换机需要在多个输入端口之间进行选择,以访问给定输出端口的 VC,可以是硬件分配或软件可编程。
QoS 的目标: 为数据包分配不同优先级,并通过拓扑结构以确定性延迟和带宽进行路由,保证对时间敏感的数据传输的及时性和可靠性。
事务排序 (Transaction Ordering)
在一个虚拟通道 (VC) 内,数据包通常按照它们到达的顺序依次传输,但这个一般规则有一些例外。PCI Express 协议继承了 PCI 事务排序模型,包括在 PCI-X 架构中添加的对宽松排序情况的支持。这些排序规则保证了使用相同流量类别 (TC) 的数据包将通过拓扑结构按正确顺序路由,防止潜在的死锁或活锁情况。值得注意的是,由于排序规则只适用于一个 VC 内,并且使用不同 TC 的数据包可能不会被映射到同一个 VC,软件理解使用不同 TC 的数据包之间没有排序关系。这种排序在事务层内的 VCs 中得到维护。
流量控制 (Flow Control)
确保发送方只在接收方有足够缓冲空间时发送数据,避免缓冲区溢出和性能浪费。接收方通过 DLLPs 定期向发送方报告其缓冲区空间。
优点: 消除了 PCI 中断开和重试导致的性能损耗。
缺点: 报告缓冲区空间需要额外的带宽。
实现: 使用 DLLPs 而不是 TLPs 来报告缓冲区空间,以避免死锁。流量控制协议对软件透明,由硬件自动管理。
如图所示,接收方包含用于存储接收到的 TLP(事务层分组)的 VC(虚拟通道)缓冲区。
接收方使用流量控制 DLLP(数据链路层分组)向发送方报告这些缓冲区的大小。
发送方跟踪接收方 VC 缓冲区中的可用空间,并且不允许发送超过接收方所能容纳的数据包。
当接收方处理 TLP 并从缓冲区中移除它们时,它会定期发送流量控制更新 DLLP,以使发送方了解可用空间的情况。
3、数据链路层
(1)概述
这部分逻辑负责链路管理,并执行三个主要功能:TLP错误纠正、流量控制以及一些链路电源管理。
它通过生成DLLP(数据链路层分组)来实现这些功能。
(2)数据链路层分组 (DLLPs)
DLLPs(数据链路层分组)在链路上两个相邻设备的数据链路层之间传输。
事务层甚至不知道这些分组的存在,它们只在与相邻设备之间传输,不会被路由到其他地方。
与TLP(事务层分组)相比,它们很小(总是只有8字节),这是一件好事,因为它们代表了维护链路协议的开销。
DLLP 组包
DLLP(数据链路层数据包)由发送端的数据链路层生成,并由接收端的数据链路层解析。
DLLP核心会附加16位CRC校验码,供接收端检测传输错误。
随后,DLLP内容被传递至物理层:对于前两代PCIe协议,物理层会为数据包添加起始符与结束符,然后通过链路所有可用通道进行差分编码传输。
DLLP 拆包
当物理层接收到DLLP时,首先对比特流进行解码并剥离起始/结束符。
数据包其余部分被提交至数据链路层,该层执行CRC错误检测后,根据数据包类型触发相应操作。
由于DLLP的最终目的地就是数据链路层,因此不会被继续上传至事务层。
(3)确认/否定协议 (Ack/Nak Protocol)
错误纠正功能如图2-25所示,是通过基于硬件的自动重试机制提供的。
如图2-26所示,每个发出的TLP都会添加一个LCRC(链路循环冗余校验)和序列号,并在接收方进行检查。
发送方的重放缓冲区保存了每个已发送的TLP的副本,直到确认其已被相邻设备接收。
确认的形式是接收方发送的Ack DLLP(肯定确认),其中包含它所看到的最后一个好的TLP的序列号。
当发送方看到Ack时,它会将具有该序列号的TLP以及所有在已确认的TLP之前发送的TLP从重放缓冲区中清除。
如果接收方检测到TLP错误,它会丢弃该TLP并向发送方返回一个Nak(否定确认),然后发送方会重放所有未确认的TLP,希望下一次会有更好的结果。
由于检测到的错误几乎总是瞬时的,因此重放通常会纠正问题。这个过程通常被称为Ack/Nak协议。
DLLP的基本格式也在第75页的图2-26中显示,它包括一个4字节的DLLP类型字段,该字段可能包含一些其他信息和一个2字节的CRC(循环冗余校验)。
内存读取示例
图2-27显示了一个通过交换机进行的内存读取示例。
一般来说,这种情况的步骤如下:
第1步a:请求者发送一个内存读取请求,并在其重放缓冲区中保存一个副本。交换机接收MRd TLP,并检查LCRC和序列号。
第1步b:没有发现错误,所以交换机向请求者返回一个Ack DLLP。作为回应,请求者从重放缓冲区中丢弃其TLP副本。
第2步a:交换机使用内存地址进行路由,将MRd TLP转发到正确的出口端口,并在出口端口的重放缓冲区中保存一个副本。完成者接收MRd TLP并检查错误。
第2步b:没有发现错误,所以完成者向交换机返回一个Ack DLLP。交换机端口从其重放缓冲区中清除MRd TLP的副本。
第3步a:作为请求的最终目的地,完成者检查MRd TLP中的可选ECRC字段。没有发现错误,所以请求被传递到核心逻辑。根据命令,设备获取请求数据并返回一个带有数据的完成TLP(CplD),同时在其重放缓冲区中保存一个副本。交换机接收CplD TLP并检查错误。
第3步b:没有发现错误,所以交换机向完成者返回一个Ack DLLP。完成者从其重放缓冲区中丢弃CplD TLP的副本。
第4步a:交换机解码CplD TLP中的请求者ID字段,并将数据包路由到正确的出口端口,同时在出口端口的重放缓冲区中保存一个副本。请求者接收CplD TLP并检查错误。
第4步b:没有发现错误,所以请求者向交换机返回Ack DLLP。交换机从其重放缓冲区中丢弃CplD TLP的副本。请求者检查可选的ECRC字段,没有发现错误,所以数据被传递到核心逻辑。
(4)流量控制与电源管理
链路层的第二个主要功能是流量控制。在电源启动或重置后,这个机制由数据链路层在硬件中自动初始化,然后在运行时更新。关于这个机制的概述已经在TLP部分中介绍过,所以这里不再重复。
最后,链路层也参与电源管理,因为DLLPs用于通信与链路和系统电源状态相关的请求和握手。
4、物理层
(1)概述
物理层是PCIe的最低层次结构层。TLP和DLLP类型的分组都从数据链路层向下转发到物理层,以便在链路上传输,并在接收方处向上转发到数据链路层。规范将物理层的讨论分为两部分:逻辑部分和电气部分,我们在这里也将保持这种划分。逻辑物理层包含与准备在链路上进行串行传输的分组相关的数字逻辑,以及为入站分组反转该过程。电气物理层是物理层的模拟接口,它连接到链路,并为每个通道包含差分驱动器和接收器。
(2)物理层 - 逻辑部分
来自数据链路层的TLP和DLLP被时钟信号送入物理层的一个缓冲区,在那里添加了起始和结束字符,以便在接收方检测到分组边界。由于起始和结束字符出现在分组两端,它们也被称为“帧定位”字符。帧定位字符显示在图2-28的第77页上附加到TLP和DLLP上,该图还显示了每个字段的大小。
在这一层中,分组的每个字节通过一个称为字节条带化的过程,在链路中使用的所有通道上分散开来。
实际上,每个通道都作为链路上独立的串行路径运行,它们的数据在接收方处重新聚合在一起。每个字节都被扰乱,以减少传输线上的重复模式,并减少在链路上看到的EMI(电磁干扰)。对于PCIe的前两代(Gen1和Gen2 PCIe),8位字符被编码成10位的符号,使用所谓的8b/10b编码逻辑。这种编码会给发出的数据流增加开销,但也增加了一些有用的特性。当以Gen3速度传输时,Gen3物理层逻辑不使用8b/10b编码来编码分组字节。相反,使用另一种称为128b/130b编码的方案,并且传输扰乱后的分组字节。然后,每个通道(Gen1和Gen2)上的10b符号或每个通道(Gen3)上的分组字节被串行化,并以2.5 GT/s(Gen1)、5 GT/s(Gen2)或8 GT/s(Gen3)的速度在每个链路通道上以差分方式时钟输出。
接收器以训练过的时钟速度对到达所有通道的分组位进行时钟同步。如果在Gen1和Gen2模式下使用8b/10b编码,则使用解串器将分组的串行位流转换为10位符号,以便进行8b/10b解码。然而,在解码之前,这些符号会通过一个弹性缓冲区,这是一个巧妙的设备,用于补偿两个连接设备内部时钟之间微小的频率差异。接下来,10位符号流通过8b/10b解码器解码回正确的8位字符。当以Gen3速度接收分组的串行位流时,Gen3物理层逻辑将使用已建立块锁定的解串器将其转换为字节流。字节流通过一个弹性缓冲区,进行时钟容差补偿。由于以Gen3速度时钟同步的分组没有使用8b/10b编码,因此跳过了8b/10b解码阶段。所有通道上的8位字符被解扰,所有通道的字节被重新组合成单个字符流,最后,恢复来自发送方的原始数据流。
(3)物理层 - 物理部分
(4)Ordered Sets
略
3.4 链路协议示例
1、内存读取请求
请求者的设备核心或软件层向事务层发送一个请求,并包含以下信息:32位或64位内存地址、事务类型、要读取的数据量(以双字计算)、流量类别、字节启用、属性等。
事务层使用这些信息来构建一个MRd TLP(内存读事务层分组)。TLP分组格式的详细信息将在后面描述,但现在可以说,根据地址大小(32位或64位),会创建一个3DW或4DW的头部。此外,事务层将请求者ID(总线#、设备#、功能#)添加到头部,以便完成者可以使用它来返回完成信息。TLP被放置在适当的虚拟通道缓冲区中,等待传输。一旦TLP被选中,流控制逻辑会确认邻近设备的接收缓冲区(VC)中有足够的空间,然后将内存读取请求TLP发送到数据链路层。
数据链路层向分组中添加一个12位的序列号和一个32位的LCRC值。一个带有序列号和LCRC的TLP副本被存储在重放缓冲区中,并且该分组被转发到物理层。
在物理层中,起始和结束字符被添加到分组中,然后该分组在可用的通道上进行字节条带化,扰码,并进行8b/10b编码。最后,每个通道上的位被串行化,并通过链路以差分方式传输到邻近设备。
完成者将输入的位流去串行化回10位符号,并通过弹性缓冲区传递。10位符号被解码回字节,并且来自所有通道的字节被去扰码和解条带化。检测并移除起始和结束字符。TLP的其余部分被转发到数据链路层。
完成者的数据链路层检查接收到的TLP中的LCRC错误,并检查序列号是否有丢失或乱序的TLP。如果没有错误,它将创建一个包含与读取请求中使用的相同序列号的Ack。计算一个16位的CRC并附加到Ack内容上,以创建一个发送回物理层的DLLP,物理层添加适当的帧定位符号并传输Ack DLLP到请求者。
请求者物理层接收Ack DLLP,检查并移除帧定位符号,并将其转发到数据链路层。如果CRC有效,它将比较确认的序列号与重放缓冲区中存储的TLP的序列号。与接收到的Ack相关联的存储内存读取请求TLP被识别,并且该TLP从重放缓冲区中丢弃。如果请求者收到的是Nak DLLP(否定确认),它将重新发送存储的内存读取请求TLP的副本。由于DLLP只对数据链路层有意义,所以没有内容被转发到事务层。
除了生成Ack之外,完成者的链路层还将TLP向上转发到其事务层。在完成者的事务层中,TLP被放置在适当的VC接收缓冲区以进行处理。可以执行可选的ECRC检查,如果没有发现错误,则将头部的内容(地址、请求者ID、内存读事务类型、请求的数据量、流量类别等)转发到完成者的软件层。
2、带数据的完成操作
为了处理内存读取请求,完成器设备核心 / 软件层会向其事务层发送一个带数据的完成(CplD)请求,该请求包含从原始内存读取请求中复制而来的请求者 ID 和标签、事务类型、完成头部内容的其他部分以及所请求的数据。
事务层利用这些信息来构建带数据的完成事务层数据包(CplD TLP),该数据包始终具有一个 3 双字(DW)的头部(它使用标识路由,并且从不需要 64 位地址)。事务层还会在头部添加自身的完成器 ID。这个数据包也会被放入相应的虚拟通道(VC)发送缓冲区中。一旦被选中,流量控制逻辑会验证相邻设备是否有足够的空间来接收该数据包,确认无误后,将数据包转发至数据链路层。
和之前一样,数据链路层会给数据包添加一个 12 位的序列号和一个 32 位的链路层循环冗余校验码(LCRC)。带有序列号和链路层循环冗余校验码的事务层数据包副本会存储在重传缓冲区中,而数据包则会被转发至物理层。
同样,物理层会在数据包中添加起始字符和结束字符,将其按字节分布到可用的通道上,进行扰码处理,然后进行 8b/10b 编码。最后,带数据的完成(CplD)数据包会在所有通道上进行串行化,并通过链路以差分方式传输至相邻设备。
请求方会将接收到的串行比特流转换回 10 位符号,并将其通过弹性缓冲区。10 位符号会被解码回字节,进行解扰码和取消字节分布处理。检测并移除起始字符和结束字符后,得到的事务层数据包会被发送至数据链路层。
和之前一样,数据链路层会检查接收到的带数据的完成事务层数据包(CplD TLP)中是否存在链路层循环冗余校验码(LCRC)错误,并检查序列号以查看是否存在丢失或顺序错误的事务层数据包。如果没有错误,它会创建一个确认数据链路层数据包(Ack DLLP),该数据包包含与所使用的带数据的完成事务层数据包(CplD TLP)相同的序列号。在确认数据链路层数据包(Ack DLLP)中添加一个 16 位的循环冗余校验码(CRC)后,将其发送回物理层,物理层会添加合适的成帧符号,并将确认数据链路层数据包(Ack DLLP)传输给完成器。
完成器的物理层会检查并从确认数据链路层数据包(Ack DLLP)中移除成帧符号,并将剩余部分发送至数据链路层,数据链路层会检查循环冗余校验码(CRC)。如果没有错误,它会将序列号与存储在重传缓冲区中的事务层数据包的序列号进行比较。与接收到的确认信息相关联的已存储的带数据的完成事务层数据包(CplD TLP)会被识别出来,并从重传缓冲区中丢弃。如果完成器接收到的是一个否定确认数据链路层数据包(Nak DLLP),它会重新发送已存储的带数据的完成事务层数据包(CplD TLP)的副本。
与此同时,请求方的事务层会在相应的虚拟通道缓冲区中接收到带数据的完成事务层数据包(CplD TLP)。事务层可以选择检查是否存在端到端循环冗余校验码(ECRC)错误。如果没有错误,它会将头部内容和数据有效载荷(包括完成状态)转发至请求方的软件层,至此操作完成。