PCIe体系结构三层模型1 事务层TL、数据链路层DLL、物理层PHY的职责1.1 发送部分事务层使用从设备核心和应用程序获取的信息生成数据包并将数据包存储在缓冲区准备传输到数据链路层。数据链路层将接收设备进行错误检查所需的附加信息拼接到数据包上传输给物理层。物理层对数据包进行编码然后在该层的模拟链路上进行差分传输最终发送给接收设备。1.2 接收部分物理层对入站数据包内容解码并将结果转发到数据链路层。数据链路层检查入站数据包中的错误如果没有错误则将数据包转发到事务层。事务层缓存入站 TLP并将数据包中的信息转换为设备核心和应用程序可处理的表示形式。。数据链路层的主要功能是确保数据包在每条链路上传输和接收期间的数据完整性。2 三层模型在PCIe数据传输扮演的角色图1 PCIe数据收发流程图图2 PCIe组包流程图3 PCIe拆包流程组包逆过程图4 PCIe包结构大小量化第一步发送端——事务层组包TLP**主要工作**软件层/设备核心向事务层发送组装 TLP 核心部分即数据包的Header头部和Data数据部分所需的信息在事务层计算ECRC组成TLP完成数据包发送给数据链路层。附传输大小或长度字段指示以双字DW为单位计算的传输数据量。数据传输长度可在1到1024DW之间一个DW等于4个Byte。第二步发送端——数据链路层组包DLLP及其其他工作**主要工作**接收到TLP包后会在重传缓冲区保存一个TLP包副本。在原始TLP包附加一个序列 ID计算序列ID与TLP包的16位LCRC。序列IDTLP包与LCRC组成DLLP包发送给物理层。**其他工作**当接收端DLL检测到LCRC与计算的LCRC不一致时说明传输错误会给发送端DLL发送一个NACK DLLP包。发送端DLL接收到NACK DLLP后会重新再发送一次。如果发送设备收到 4 次 NAK 并且因此重传了 3 次则数据链路层记录错误、报告可纠正错误并重新训练链路。如果没有错误接收端会给发送端DLL发送一个ACK DLLP包发送端DLL接收到ACK DLLP后会丢弃掉当前缓冲区中的TLP包。第三步发送端——物理层组包PLP**主要工作**物理层在数据包前后各拼接一个 1 字节的起始Start和结束帧字End符。数据包被编码并使用可用数量的通道在链路上差分传输。附PLP 是一个非常简单的数据包以一个 1 字节的COM 字符开头后跟 3 个或更多定义 PLP 类型并包含其他信息的字符。PLP 大小为 4 字节的倍数。物理层用起始和结束字符为 TLP 或 DLLP 帧化。该符号是一个帧代码字节接收设备用来检测数据包的开始和结束。数据包在链路的可用通道上进行字节条带化把数据划分为单个字节。通过加扰字节消除了链路上的重复比特模式从而减少了产生的平均 EMI 噪声。生成的字节由 8b/10b 编码逻辑编码为 10b 码。将 8b 字符编码为 10b 符号的主要目的是在比特流中创建足够的 1 到 0 和 0 到 1 的转换密度以便在远程接收设备处借助 PLL 重建接收时钟。并串转换器在每个通道上生成数据包的串行比特流。第四步接收端——物理层拆包PLP**主要工作**接收到的PLP由物理层解码起始和结束帧字段被剥离生成的DLLP被发送到数据链路层。第五步接收端——数据链路层拆包DLLP**主要工作**接收端DLL接收 TLP 并检查 LCRC 错误。如果没有错误返回一个包含序列 ID 的 ACK DLLP 给发送端DLL。发送端DLL确认 TLP 已成功到达接收端DLL不一定是最终目的地。发送端DLL 清除其重传缓冲区中与该序列 ID 关联的 TLP。另一方面如果在接收的 TLP 中检测到 CRC 错误则返回一个包含序列 ID 的NAK DLLP 给发送端DLLTLP 传输过程中发生了错误。发送端DLL从重传缓冲区重传相关 TLP同时DLL为错误报告和记录机制生成错误指示。对于重传缓冲区中的给定 TLP如果发送设备收到 4 次 NAK 并且因此重传了 3 次则数据链路层记录错误、报告可纠正错误并重新训练链路。第六步接收端——事务层拆包TLP**主要工作**事务层的接收端将入站 TLP 存储在接收虚拟通道缓冲区VC中。接收方根据 TLP 中的 ECRC 字段检查 CRC 错误。如果没有错误ECRC 字段被剥离TLP 头部及数据载荷中的结果信息被发送到设备核心。接收端还负责检查接收 TLP 的序列 ID以检查是否有丢失或乱序的 TLP。附数据包的串行比特流使用串并转换器转换为 10b 并行流10b 符号流由 8b/10b 解码器解码回每个符号的 8b 表示。8b 字符被解扰字节去条带化逻辑重建发送端发送的原始数据包流。起始和结束符号被检测和移除。生成的 TLP 发送到数据链路层。参考文献《PCI.Express.System.Architecture》第二章。