二、PCIE的TLP包的封包解包原理

内容来源:V3学院和 【PCIE】PCIE TLP包解析

前言:开始pcie项目之前需要知道,本次项目我们是使用现有的框架RIFFA框架去完成设计的,因此比起具体代码的含义,更注重框架的使用。在开始项目之前需要了解PCIE的组建包过程。

先解释两个重要的概念:MPS(Maximum Payload Size)、RCB(Read Completion Boundary)
在PCI Express (PCIe) 中,数据包的分割主要参考的是最大负载大小(MPS),而不是读完成边界(RCB)。

MPS

MPS(Maximum Payload Size)是指 PCIe 传输中单个数据包的最大有效负载大小有效负载是指不包括协议开销的实际数据部分。在 PCIe 链路的配置过程中,MPS 的值可以是 128 字节、256 字节、512 字节、1024 字节、2048 字节或 4096 字节。选择合适的 MPS 值是优化 PCIe 性能的关键因素之一。
在这里插入图片描述

MPS实例:

  • GPU到CPU的数据量:假设GPU需要传输一个包含2048字节的图像数据块给CPU。
  • 设定MPS:在这个例子中,我们比较两种MPS设置:128字节和512字节。
MPS设置为128字节:
  • 数据包分割:由于MPS设置为128字节,2048字节的数据需要被分割成16个单独的数据包(每个包128字节)。
  • 传输次数:GPU需要发送16个独立的数据包到CPU。
  • 处理开销:每个数据包都需要独立的处理和确认,这可能增加处理开销和延迟。
MPS设置为512字节:
  • 数据包分割:同样的2048字节数据现在只需要被分割成4个数据包(每个包512字节)。
  • 传输次数:GPU只需发送4个数据包。
  • 处理开销:减少的数据包数量意味着减少了处理和确认的次数,从而可能降低总体延迟和提高数据传输效率。

RCB

RCB(Read Completion Boundary)是指 PCIe 设备在处理读请求时返回数据的对齐边界。RCB 的值通常是 64 字节或 128 字节,表示设备在处理完成读操作时,数据包的边界需要对齐到该值。

RCB实例:

场景:在PCIe系统中,一块设备正在请求从另一块设备读取一段数据。假设读取的数据长度为150字节,而PCIe设备的读完成边界(RCB)设置为64字节。这个设置将如何影响数据传输?

以下是详细步骤:

  1. 数据请求:设备A发送一个读请求给设备B,请求从某个特定地址开始读取150字节的数据。

  2. 根据RCB分割数据:由于RCB设置为64字节,设备B必须按照这个边界对返回的数据进行分割和对齐。这意味着,尽管请求是150字节,数据将被分割为多个部分:

    • 第一部分包含64字节。
    • 第二部分包含64字节。
    • 第三部分包含剩余的22字节。
  3. 数据传输:设备B将这三部分数据分别作为独立的事务层包(TLP)发送回设备A。每个包都精确地对齐到64字节边界(除了最后一个包,因为数据不足64字节)。

  4. 接收与重组:设备A接收到这三个数据包后,需要根据包的顺序将数据重新组合,以构建出原始请求的150字节数据。

总结: 通过这个例子可以看出,RCB的设置对数据传输的效率有直接影响。如果RCB较大,可能减少传输的总包数,但增加了在某些情况下传输不必要数据的风险。相反,较小的RCB虽然使数据包更精确地对应于请求的数据量,但可能增加需要传输的总包数,从而影响总体性能。因此,适当设置RCB是优化PCIe性能的关键考虑之一。

一、TLP包的基本格式:

1.1整体包结构概述

1、TLP 包是由 PCIE 的 Endpoint 或者 Root Complex 组建发送。
在这里插入图片描述

2、TLP 包只包含两种包头长度 3DW 和 4DW(double word is 32bit),数据
内可以选择包含和不包含 ECRC 1DW(循环校验字 32bit)
在这里插入图片描述
由红色圈圈出的是用户的 TLP 包,也就是接下来我们要重点讲解的部分。(此部分如果选择使用框架那么由框架创建例如 Riffa 和 XDMA,如果完全自定义那么就是需要自己的写这些 TLP)

1.2包结构的通用字段含义

在这里插入图片描述

在这里插入图片描述

1.3 Memory write TLP 包结构

  1. 3DW的头,32bit 地址可以请求 2^32 也就是 4GB 的字节地址空间
    在这里插入图片描述
  2. 4DW 头,64bit 地址可以请求 2^64 也就是 16GB 的字节地址空间
    在这里插入图片描述
    其中:
    在这里插入图片描述

1.4 Memory read TLP 的包结构

  1. 3DW的头,32bit 地址可以请求 2^32 也就是 4GB 的字节地址空间
    在这里插入图片描述
  2. 4DW 头,64bit 地址可以请求 2^64 也就是 16GB 的字节地址空间
    在这里插入图片描述
    结构上发现其实和Memory write TLP 包没什么区别。
    不同之处在于:
    Mrd 是一个 Non-posted 事物:需要一个独立的反馈事务来反馈读取的数据。(一般一个mrd可能会有多个完成响应包来完成一次数据读取请求)
    Mwr是一个posted事物:不需要一个独立反馈事务(因为写事务中本省就带有数据了,写成功与否的状态信息是可选的反馈信息,并不是必须的。)

1.5 Completion/Completion with Data TLPs 完成相应包

在这里插入图片描述
注:MPS(Max Payload Size) 这个参数非常重要,每一个 EP 和 RC 都可以设置此值,
那么系统的 MPS 会取所有 MPS 的最小值,如下图:

在这里插入图片描述
系统中最小的 MPS 是 128byte,那么系统的 MPS 是 128,此值会通过 IP 核接口呈现出来。

二、Mrd 和 Cpld 包组包和完成包过程分析

在这里插入图片描述

现在模拟一个 Mrd 和一个 CplD,已知信息:
MPS=512 字节 RCB=128 字节
读起始地址:0x0010_00f8
读请求长度:272 字节
Requester ID:0x0001
Completer ID:0x1000
Tag:0x00

2.1 Mrd 包格式:

在这里插入图片描述

2.2 Cpld包格式:

例一:

在这里插入图片描述
在这里插入图片描述

例二:

在这里插入图片描述
在这里插入图片描述

注:图中WD的地方应改为:DW

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCI Express (PCIe) TLP (Transaction Layer Packet) 是 PCI Express 协议的一个重要部分,它用于在不同的 PCIe 设备之间传输数据。PCIe TLP 由四个部分组成:头部、有效载荷、可选的可扩展有效载荷和 FCS(帧校验序列)。 具体来说,PCIe TLP 的格式如下: |---------------------------| | PCIe TLP 头部 (12 字节) | |---------------------------| | 有效载荷 (0 - 1024 字节) | |---------------------------| | 可扩展有效载荷 (0 - 1024 字节) | |---------------------------| | FCS(帧校验序列)(4 字节) | |---------------------------| PCIe TLP 头部括以下字段: - TC(传输类别):指定 TLP 的类型,比如请求(Memory Read/Write)、Completion 等。 - TD(传输方向):指定 TLP 的传输方向,是从上游设备到下游设备还是相反。 - EP(端点):指定 TLP 的目标设备端口号。 - Length(长度):指定有效载荷的长度。 - First DW BE(第一个双字节字节 Enable):指定有效载荷的第一个双字节的哪些字节是有效的。 - Last DW BE(最后一个双字节字节 Enable):指定有效载荷的最后一个双字节的哪些字节是有效的。 - Tag(标签):可选字段,用于匹配请求和 Completion TLP。 - Requester ID(请求者 ID):可选字段,用于标识发起 TLP 的设备。 - Completer ID(完成者 ID):可选字段,用于标识处理 TLP 的设备。 PCIe TLP 的有效载荷可以是数据、地址或控制信息。可扩展有效载荷在某些情况下用于传输额外的数据或信息。FCS 是一个校验序列,用于检测传输中的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值