TripTheWorld

PCIe总线何去何从? 实际的需求催生了技术的变革。 PCIe就像是计算机王国里的一场“交通革命”,它替代了PCI成为计算机领域主要的互联总线。那么它的发展趋势如何?让我们一步一步揭开它神秘的面纱。欢迎关注微信公众号“硬件工程师宝典”,获取更多资讯。

PCIe从入门到精通之六:PCIe数据包packet的神奇之旅

0
阅读(1322)

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),如图中绿色部分所示。

23.png

最后在物理层打包好的数据包(packet),在每个Lane上加扰码,经8/10或128/130编码或Flit编码,最后通过物理传输介质传输给接收方。

接收方在接受数据包(packet)后,执行逆操作。如下图所示,在最先到达的物理层脱去外套(两个Framing);在数据链路层,脱去秋衣(校验序列号Sequence Number和LCRC);在事务层,脱去内衣(Header和ECRC);最后,员工(Data Payload)恢复到原生态的一丝不挂,接收端获得原始的数据。

24.png

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

二,PCIe数据包packet传输流程

25.png

数据包流向总结: 如上图所示,当数据从发送端发出时,首先在事务层被封装成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)。

26.png

总结:如果把上面所提到的数据包(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”,将获取标准下载连接。

15_baidu_file.png


百度网盘分享的文件