news 2026/7/16 5:14:04

PCIe学习之《PCIe体系结构三层模型》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PCIe学习之《PCIe体系结构三层模型》

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。序列ID,TLP包与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 给发送端DLL,TLP 传输过程中发生了错误。发送端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 发送到数据链路层。

参考文献

  1. 《PCI.Express.System.Architecture》第二章。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 5:11:43

Wireshark深度解析NGAP协议:5G核心网接入故障精准定位实战

1. 项目概述:当5G网络“哑火”时,我们如何快速找到症结?在5G核心网的运维和优化工作中,最让人头疼的莫过于网络突然“哑火”——用户无法接入、业务中断、信令流程卡壳。面对海量的网元、复杂的接口和天书般的信令消息&#xff0c…

作者头像 李华
网站建设 2026/7/16 5:10:36

C语言实现RSA加密算法:从数学原理到代码实践

1. 项目概述:为什么要在C语言里啃RSA这块硬骨头?如果你正在学习密码学,或者你的C语言项目里需要处理点“见不得人”的数据,比如用户密码、通信密钥或者一些敏感的配置信息,那你大概率绕不开RSA。这个由三位大佬名字首字…

作者头像 李华
网站建设 2026/7/16 5:09:53

Logstash安装底层逻辑与五层自检体系

1. 这不是“又一个ELK安装教程”,而是Logstash落地前必须搞清的底层逻辑Logstash不是个能直接双击运行的图形软件,它是一套日志处理流水线的“调度中枢”——你往里扔原始日志,它负责清洗、转换、丰富、路由,最后把结构化数据精准…

作者头像 李华
网站建设 2026/7/16 5:09:34

C++面向对象编程实战:Date类设计与闰年判断实现

1. 项目概述:为什么从Date类开始学C面向对象如果你正在学习C,尤其是从C语言过渡过来,面对“面向对象编程”这个概念时,可能会觉得有点抽象。类、对象、封装、继承、多态……这些术语听起来高大上,但怎么把它们变成一行…

作者头像 李华
网站建设 2026/7/16 5:07:42

HarmonyOS7精选文章流页面实战:分类筛选与点赞收藏交互

文章目录前言Article 模型里混合了内容和互动状态分类筛选不改 articles 本身点赞要同时改 isLiked 和 likes收藏只改布尔值,不影响计数精选卡片是固定取第三篇文章这个页面的价值在于状态口径清楚完整代码最后总结前言 内容流页面看起来只是文章卡片堆起来&#x…

作者头像 李华
网站建设 2026/7/16 5:07:13

HLW8110电能计量芯片的硬件选型与软件校准实战指南

1. HLW8110芯片基础认知与选型策略第一次接触HLW8110时,我被它SOP-8封装里蕴含的强大功能震撼到了——这个比指甲盖还小的芯片,居然能同时测量电压、电流、功率等十余种电参数。在实际项目中踩过几次坑后,我总结出选型时必须关注的三个核心指…

作者头像 李华