找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 183|回复: 0

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

[复制链接]

27

主题

0

回帖

248

积分

管理员

积分
248
发表于 2026-1-17 14:37:28 | 显示全部楼层 |阅读模式 来自 LAN

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

0. 引言

PCIe是硬件工程师跨不过去的坎。我刚开始工作就接触PCIe,工作中遇到的所有产品都有PCIe总线。在此想把自己学习PCIe的一些经历和感悟,以及踩过的坑分享在这里。所有PCIe主题的文章都会收录在《深入浅出聊PCIe》合集里,每篇文章涵盖一个PCIe的主题,预计会有几十篇文章,我会尽量用通俗的语言和大家介绍PCIe设备内部的奥妙。

在上一篇文章《PCIe从入门到精通之五:PCIe分层结构》中,我们介绍了PCIe分为四层(应用层、事务层、数据链路层和物理层)。在这一篇文章中我们继续介绍PCIe数据包packet如何在各层之间传输的。

需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号"硬件工程师宝典",在对话框内回复"PCIe",将获取标准下载链接。

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

PCIe数据包结构

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

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

PCIe数据包解包过程

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

2. PCIe数据包packet传输流程

PCIe数据包传输流程

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

3. 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)的加持下,那是满血复活(信号品质恢复了),穿上新衣服,精神抖擞地前往下一站(Endpoint)。

Switch内部数据传输流程

总结:如果把上面所提到的数据包(packet)发送和接收过程,称之为穿衣脱衣的过程的话,那么,从Root Complex传输的数据包到达switch的upstream端口时,upstream端口时会对数据包执行一次脱衣过程,脱完衣服的数据包会被传到对应的下游端口,下一个端口又执行一次穿衣过程,穿完衣服以后的数据包会发往下一站。

4. 错误处理机制(LCRC和ECRC)

PCIe交换机还负责错误检测和报告。如果检测到链路层错误(如LCRC错误),数据链路层会请求重传。事务层也会进行端到端的数据完整性校验(ECRC,如果启用)。交换机能够识别和报告各种错误,包括可纠正错误和不可纠正错误,以维护系统的稳定性和数据完整性。

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,表示接收失败。

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那样触发自动重传。

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重传机制,纠正错误
强制性 可选 强制性
目的 端到端数据完整性 链路可靠性

5. 总结

介绍了两种数据包:TLP和DLLP,以及它们在各层中的"穿衣"和"脱衣"过程。并详细对比LCRC和ECRC的不同。

6. 抛砖引玉

PCI设备都有256Byte的配置空间configuration space。那么,PCIe设备有配置空间吗?PCIe设备有配置空间有多大?

敬请关注下一篇:
《PCIe从入门到精通之七:PCIe设备的配置空间简介》


7. 参考文献:

  1. PCI Express® Base Specification Revision 5.0 Version 1.0
  2. PCI Express® Base Specification Revision 6.4
  3. PCI Express® Base Specification Revision 7.0

需要PCIe学习资料的朋友,请关注本微信公众号"硬件工程师宝典",在对话框内回复"PCIe",将获取标准下载链接如下。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|PCIe技术圈-专注PCIe技术的中文社区 ( 皖ICP备17021150号-5 )|网站地图

GMT+8, 2026-2-16 05:00 , Processed in 0.050123 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表