PCIe从入门到精通之六:PCIe数据包packet的神奇之旅
0赞0,引言
在上一篇文章《PCIe从入门到精通之五:PCIe分层结构》中,我们介绍了PCIe分为四层(应用层、事务层、数据链路层和物理层)。在这一篇文章中我们继续介绍PCIe数据包packet如何在各层之间传输的。
所有PCIe主题的文章都会收录在《深入浅出聊PCIe》合集里,欢迎评阅。
需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
一,PCIe数据包packet的种类
数据包(packet)是PCIe总线传输数据的最小单元。最原始要传输的数据我们称之为data payload。想象一下总公司(Root Complex)要派员工(Data Payload)到下属的分公司(Endpoint)出差。员工(Data Payload)从事务层出发,每到一层就会对上层来的数据进行打包,每一层都要秀一下存在感嘛,否则哪儿来的performance。打包后的数据作为下一层的原始数据再进行打包,这就像人穿衣服一样。员工(Data Payload)一开始是一丝不挂的,在事务层我们给他穿上了内衣,在数据链路层我们给他穿上了秋衣,在物理层我们给他穿上了外套。这样武装整齐,员工(Data Payload)就可以出门乘坐Root Complex和Endpoint之间的高铁了。
如下图所示,事务层给Data Payload穿加上了内衣(Header和ECRC),我们称之为TLP(Transaction Layer Packet),如图中红色部分所示;数据链路层给数据包(packet)穿上了秋衣(Sequence Number和LCRC),我们称之DLLP(Data Link Layer Packet),如图中蓝色部分所示;物理层数据链路层给数据包(packet)穿上了外套(两个Framing),如图中绿色部分所示。

最后在物理层打包好的数据包(packet),在每个Lane上加扰码,经8/10或128/130编码或Flit编码,最后通过物理传输介质传输给接收方。
接收方在接受数据包(packet)后,执行逆操作。如下图所示,在最先到达的物理层脱去外套(两个Framing);在数据链路层,脱去秋衣(校验序列号Sequence Number和LCRC);在事务层,脱去内衣(Header和ECRC);最后,员工(Data Payload)恢复到原生态的一丝不挂,接收端获得原始的数据。

总结一下,数据传输时在不同的层会被打包封装,就像穿衣服一样,分别生成TLP和DLLP。数据接收时在不同的层会被解包,就像脱衣服一样,分别恢复成DLLP和TLP。
二,PCIe数据包packet传输流程

数据包流向总结: 如上图所示,当数据从发送端发出时,首先在事务层被封装成TLP,然后传递给数据链路层。数据链路层在TLP上添加序列号sequence number和LCRC,并将其准备好传输。最后,物理层将这些数据包(TLP或DLLP)进行编码、串行化并转换为电信号,通过PCIe链路发送出去。
在接收端,这个过程是逆向的:
1. 物理层: 接收到电信号,进行解码、解串行化,并检查物理层错误。
2. 数据链路层: 从接收到的数据中去除物理层添加的信息,并检查LCRC和序列号sequence number。如果检测到错误或序列号异常,会发送NAK请求重传;如果正确,则发送ACK,并去除序列号和LCRC,将TLP传递给事务层。
3. 事务层: 解析TLP头和数据负载,进行ECRC校验(如果存在),并将数据或消息传递给设备核心 (Device Core) 进行处理。
整个过程就是一个员工起床穿衣(从Transmitter出发,encoding)、员工乘坐高铁(信号在PCIe lanes上传输)、员工到达目的地脱衣验明正身(到达Receiver,decoding)的过程。
三,PCIe数据包packet在Switch中的传输流程
PCIe交换机通常包含一个上游端口(Upstream Port)和多个下游端口(Downstream Ports),每个Switch的每个Port也是需要实现PCIe的这三层功能的。如下图所示。
Switch是“大区域的分总公司”、是交通枢纽, 员工(Data Payload)出差到达Switch是要入住酒店睡觉的。睡觉嘛,物理层的外套(两个Framing)是一定会脱掉的;天高皇帝远,妈妈叮嘱一定要穿的数据链路层的秋衣(校验序列号Sequence Number和LCRC)也是要乘此机会脱掉的;出差公司报销一切花费,room service和大保健等也要乘机安排上,这样事务层的内衣(Header和ECRC)最后也脱掉了。最后,员工(Data Payload)到达Switch内部后也恢复到了原生态的一丝不挂。
第二天起床,员工(Data Payload)在Switch的RXEQ(CTLE,DFE,AGC)和TXEQ(Preshoot,Boost,Deemphasis)的加持下,那是满血复活(信号品质恢复了,眼图Eye-diagram可以张开了),穿上新衣服(物理层、数据链路层和事务层加上去的各种新数据),精神抖擞地前往下一站(Endpoint)。

总结:如果把上面所提到的数据包(packet)发送和接收过程,称之为穿衣脱衣的过程的话,那么,从Root Complex传输的数据包到达switch的upstream端口时,upstream端口时会对数据包执行一次脱衣过程,脱完衣服的数据包会被传到对应的下游端口,下一个端口又执行一次穿衣过程,穿完衣服以后的数据包会发往下一站(Endpoint)。
四,错误处理机制(LCRC和ECRC)
PCIe交换机还负责错误检测和报告。如果检测到链路层错误(如LCRC错误),数据链路层会请求重传。 事务层也会进行端到端的数据完整性校验(ECRC,如果启用)。交换机能够识别和报告各种错误,包括可纠正错误和不可纠正错误,以维护系统的稳定性和数据完整性。
1) LCRC:
PCIe LCRC(Link Cyclic Redundancy Check,链路循环冗余校验)是PCIe数据链路层(Data Link Layer)的关键组成部分,用于确保在两个直接相连的PCIe设备之间传输的数据包(TLP和DLLP)的完整性。LCRC是一种强大的错误检测机制,它能够检测传输过程中发生的绝大多数比特错误。
· 重新计算LCRC:
接收端的数据链路层使用与发送端相同的CRC-32算法,对接收到的数据包(除了LCRC本身)进行重新计算,生成一个新的32位LCRC值。
· 比较验证:
接收端将自己计算出的LCRC值与接收到的数据包中附加的LCRC值进行比较。
匹配: 如果两个LCRC值完全匹配,则认为该数据包在传输过程中没有发生错误,数据包是完整的。接收端会向发送端发送一个ACK(Acknowledgement)DLLP,表示成功接收。
不匹配: 如果两个LCRC值不匹配,则表明数据包在传输过程中发生了错误。接收端会丢弃该数据包,并向发送端发送一个NAK(Negative Acknowledgement)DLLP,表示接收失败。
2) ECRC
PCIe ECRC(End-to-End Cyclic Redundancy Check,端到端循环冗余校验)是PCIe协议中一种可选但非常重要的错误检测机制,它工作在事务层(Transaction Layer)。与链路层(Data Link Layer)的LCRC(Link CRC)不同,ECRC旨在提供从源设备到目的设备整个传输路径上的数据完整性保护,包括经过PCIe交换机等中间设备。
· ECRC的启用与条件
ECRC是可选的。是否启用ECRC由PCIe设备的配置空间中的相关位控制(例如,在PCIe Capability结构中的Device Control寄存器)。
· 检查ECRC标志:
接收端的事务层首先检查TLP头部中的ECRC标志位,以确定该TLP是否包含ECRC。
· 重新计算ECRC:
如果TLP包含ECRC,接收端的事务层会使用与发送端相同的CRC-32算法,对接收到的TLP(TLP前缀、TLP头部和数据负载)进行重新计算,生成一个新的32位ECRC值。
· 比较验证:
接收端将自己计算出的ECRC值与接收到的TLP中附加的ECRC值进行比较。
匹配: 如果两个ECRC值完全匹配,则认为该TLP在整个传输路径中没有发生错误。事务层会继续处理该TLP。
不匹配: 如果两个ECRC值不匹配,则表明TLP在传输过程中发生了错误。接收端会报告一个不可纠正的错误(Uncorrectable Error),因为ECRC无法像LCRC那样触发自动重传。
3) LCRC与ECRC的区别
ECRC与LCRC的区别目的
与LCRC不同,ECRC错误不会触发数据链路层的自动重传(ACK/NAK)。这是因为ECRC是端到端的,错误可能发生在链路层的范围之外(例如在交换机内部)。
当检测到ECRC错误时,通常会触发一个错误报告机制,将错误信息上报给系统软件(如操作系统)。这可能导致系统级别的错误处理,例如驱动程序重试操作、系统日志记录,甚至系统崩溃(取决于错误的严重性和系统配置)。
ECRC错误通常被视为更严重的错误,因为它表明数据在整个路径上受到了损坏,而不仅仅是单个链路上的瞬时问题。
· ECRC与LCRC的区别总结
特性 | ECRC (End-to-End CRC) | LCRC (Link CRC) |
工作层 | 事务层 (Transaction Layer) | 数据链路层 (Data Link Layer) |
保护范围 | 从源设备到目的设备整个传输路径 | 两个直接相连的PCIe设备之间的链路 |
检测对象 | TLP前缀、头部和数据负载 | TLP/DLLP的头部、数据负载、序列号 |
错误处理 | 报告不可纠正错误,不触发自动重传 | 触发ACK/NAK重传机制,纠正错误 |
强制性 | 可选 | 强制性 |
目的 | 端到端数据完整性 | 链路可靠性 |
五,总结
介绍了两种数据包:TLP和DLLP,以及它们在各层中的“穿衣”和“脱衣”过程。并详细对比LCRC和ECRC的不同。
六,抛砖引玉
PCI设备有256Byte的配置空间configuration space。那么,PCIe设备有配置空间吗?PCIe设备有配置空间有多大?
敬请关注下一篇:《PCIe从入门到精通之七:PCIe设备的配置空间简介》
七,参考文献:
需要以下参考文献(PCIe标准)的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载连接。

百度网盘分享的文件
