[PCIE] 3 - 协议回顾示例

本文通过一个示例详细阐述PCI Express协议的内存读取请求过程,从Requester发起请求到Completer返回数据,涉及TLP构建、序列号、LCRC校验、物理层传输等多个环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章目录:
[PCIE] 1 - PCI Express 简介
[PCIE] 2 - 设备层简介
[PCIE] 3 - 协议回顾示例


协议回顾示例

现在,让我们通过一个示例来回顾整个 Link 协议,以说明从 Requester 发起内存读取请求到从 Completer 获得请求的数据所发生的步骤。

内存读取请求

有关讨论的第一部分,请参阅图 2-32。请求者的设备内核或软件层向事务层发送请求,并包括以下信息:32 位或 64 位内存地址、事务类型 ,以双字计算的要读取的数据量,流量类别,字节启用,属性等。
在这里插入图片描述
事务层使用此信息来构建 MRd TLP。 TLP 数据包格式的详细信息将在后面描述,但现在可以说根据地址大小(32 位或 64 位)创建 3 DW 或 4 DW 标头就足够了。此外,事务层将请求者 ID(总线#、设备#、函数#)添加到标题中,以便完成者可以使用它来返回完成。 TLP 被放置在适当的虚拟通道缓冲区中以等待轮到传输。一旦选择了 TLP,流控制逻辑会确认相邻设备的接收缓冲区 (VC) 中有足够的可用空间,然后将内存读取请求 TLP 发送到数据链路层。

数据链路层向数据包添加一个 12 位序列号和一个 32 位 LCRC 值。带有序列号和 LCRC 的 TLP 副本存储在重放缓冲区中,数据包被转发到物理层。

在物理层中,开始和结束字符被添加到数据包中,然后在可用通道上进行字节条带化、加扰和 8b/10b 编码。最后,这些位在每个通道上被序列化,并通过链路以不同的方式传输到邻居。

Completer 将传入的比特流反序列化为 10 位符号,并将它们传递给弹性缓冲区。 10 位符号被解码回字节,所有通道的字节都被解扰和非条带化。开始和结束字符被检测并删除。 TLP 的其余部分被转发到数据链路层。

完成者的数据链路层检查接收到的 TLP 中的 LCRC 错误,并检查序列号中是否存在丢失或失序的 TLP。如果没有错误,它会创建一个包含与读取请求中使用的相同序列号的 Ack。计算 16 位 CRC 并将其附加到 Ack 内容以创建一个 DLLP,该 DLLP 被发送回物理层,物理层添加适当的成帧符号并将 Ack DLLP 传输给请求者。

请求者物理层接收 Ack DLLP,检查并删除成帧符号,并将其转发到数据链路层。如果 CRC 有效,它将确认的序列号与存储在重放缓冲区中的 TLP 的序列号进行比较。识别与接收到的 Ack 相关联的存储的存储器读取请求 TLP,并且从重放缓冲区中丢弃该 TLP。如果请求者收到了 Nak DLLP,它将重新发送存储的内存读取请求 TLP 的副本。由于 DLLP 仅对数据链路层有意义,因此不会向事务层转发任何内容。
除了生成 Ack 之外,完成者的链路层还将 TLP 转发到它的事务层。 在完成者的事务层中,TLP 被放置在适当的 VC 接收缓冲区中以进行处理。 可以执行可选的 ECRC 检查,如果未发现错误,则将标头的内容(地址、请求者 ID、内存读取事务类型、请求的数据量、流量类别等)转发到完成者的软件层。

完成数据

关于本讨论的后半部分,请参阅图 2-33。为了服务内存读取请求,完成者设备核心/软件层将完成数据 (CplD) 请求发送到其包含请求者的事务层 从原始内存读取请求中复制的 ID 和 Tag、事务类型、完成头内容的其他部分和请求的数据。
在这里插入图片描述
事务层使用此信息构建 CplD TLP,它始终具有 3 个 DW 标头(它使用 ID 路由并且从不需要 64 位地址)。它还将自己的完成者 ID 添加到标题中。该数据包也被放入适当的 VC 传输缓冲区,一旦选择,流控制逻辑将验证相邻设备是否有足够的空间来接收该数据包,一旦确认,将数据包向下转发到数据链路层。

和以前一样,数据链路层向数据包添加一个 12 位序列号和一个 32 位 LCRC。带有序列号和 LCRC 的 TLP 副本存储在重放缓冲区中,数据包被转发到物理层。

和以前一样,物理层在数据包中添加一个开始和结束字符,在可用通道上对其进行字节条带化,对其进行加扰,然后 8b/10b 对其进行编码。最后,CplD 数据包在所有通道上被串行化,并通过链路以不同的方式传输到邻居。

请求者将传入的串行比特流转换回 10 位符号,并通过弹性缓冲区传递它们。 10 位符号被解码回字节、解扰和非条带化。开始和结束字符被检测和删除,并且生成的 TLP 被发送到数据链路层。

和以前一样,数据链路层检查接收到的 CplD TLP 中的 LCRC 错误,并检查序列号是否存在丢失或失序的 TLP。如果没有错误,它会创建一个 Ack DLLP,其中包含与使用的 CplD TLP 相同的序列号。一个 16 位 CRC 被添加到 Ack DLLP 并被发送回物理层,物理层添加适当的成帧符号并将 Ack DLLP 传输到 Completer。

Completer Physical Layer 检查并从 Ack DLLP 中删除成帧符号,并将剩余部分发送到检查 CRC 的数据链路层。如果没有错误,它将序列号与存储在重放缓冲区中的 TLP 的序列号进行比较。与接收到的 Ack 相关的存储的 CplD TLP 被识别,并且该 TLP 从重放缓冲区中丢弃。如果 Completer 收到 Nak DLLP,它将重新发送存储的 CplD TLP 的副本。

同时,请求者事务层在适当的虚拟通道缓冲区中接收 CplD TLP。可选地,事务层可以检查 ECRC 错误。如果没有错误,它将标头内容和数据负载(包括完成状态)转发到请求者软件层,然后我们就完成了。


如果你想了解更多
[PCIE] 1 - PCI Express 简介
[PCIE] 2 - 设备层简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山猫Show

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值