PCie协议之-TLP Header详解(一)

✨前言:

在PCIe通信过程中,事务层数据包(Transaction Layer Packets,简称TLP)扮演着非常重要的角色。TLP用于在设备之间传递数据和控制信息,它们是PCIe的基本信息传输单元。
TLP可分为几个部分,最核心的是TLP Header,它负责携带有关数据包的关键信息,包括数据包类型、长度以及传输方向等等。下面是TLP Header的详细结构以及各部分的作用:
格式(Format)和类型(Type)字段:这个字段由多个比特组成,两者相结合定义了TLP的类型,例如内存读取、内存写入、I/O操作等等。格式字段告诉我们这个TLP是32位还是64位地址,而类型字段告诉我们是进行读取还是写入等操作。
长度(Length)字段:长度字段告知接收设备这个TLP包含了多少个数据载荷(Data Payload)DWORDs(32-bit words)。这对于正确解析TLP非常重要。
请求者ID(Requester ID)和目标ID(Completer ID)字段:这些字段包含了发起TLP的设备和预期接收这个TLP的设备的ID。在回应一个操作时,这两个字段会互换其值。
标记(Tag)字段:标记字段用于将具体的TLP关联到发起它的特定事务。这对于支持多个并发事务的设备来说尤其重要。
第一和最后的DW地址(First and Last DW Byte Enables)字段:对于内存写入操作,这些字段指示了在数据包的第一个和最后一个DWORD中,哪些字节是有效的。这对于包括不是4字节倍数的内存写入操作很重要。
地址(Address)字段:对于需要访问特定硬件地址的操作(例如内存读/写),此字段包含所需的地址。其精确格式和长度(32-bit或64-bit)取决于TLP的格式和类型

✨TLP格式

事务层包(TLP)的一般格式如下图所示:
在这里插入图片描述
TLP Header为3DW或者4DW,Data Payload为1-1024DW,最后的TLP Digest(ECRC)是可选的,为1DW。
TLP Header在整个TLP的位置如下图所示,需要注意的是,TLP Header的格式和内容都会随着TLP的类型和路由方式的改变而改变。
在这里插入图片描述
TLP的类型和路由方式由Fmt和Type所决定,这在前面关于TLP路由的文章中已经详细的介绍过。上图显示的是各种不同格式的TLP Header的相同的部分。
每一个Field的作用与意义如下表所示:
在这里插入图片描述
在这里插入图片描述

✨Byte Enable

下面分别详细地介绍一下Byte Enable,在PCIe中Data Payload的单位是DW,也就是说数据大小(地址)需要以DW作为对齐。但是很多情况下,数据的大小并不是DW的整数倍,因此PCIe引入了Byte Enable来解决这一问题。
使用Byte Enable需要遵循一下原则:
· Byte Enable为高电平有效,低电平(0)表示Data Payload的对应Byte将被认为是无效的,即不被Completer使用。
· 如果有效数据小于1DW,则Last DW Byte Enable应全部为0。
· 如果Data Payload大于1DW,则First DW Byte Enable至少有一位是有效的。
· 如果Data Payload大于或等于3DW,则First DW Byte Enable和Last DW Byte Enable当中的有效位必须是连续的。即这种情况下,Byte Enable只能用于调整起始地址和结束地址。
· 如果Data Payload等于1DW,则First DW Byte Enable中的有效位可以是不连续的。
· 如果Data Payload等于2DW,则First DW Byte Enable和Last DW Byte Enable中的有效位都可以是不连续的。
· 写请求中的DW等于1,但是First DW Byte Enable中没有任何一位是有效的,也是允许的,但是这样的请求对于Completer没有任何作用。
· 如果读请求DW等于1,但是First DW Byte Enable中没有任何一位是有效的,此时Completer会返回1DW的Data Payload,只是其中的数据都是无效的。这一方式常备用于Flush Mechanism。

一个简单的Byte Enable使用的例子,如下图所示:
在这里插入图片描述

🌟Byte Enable的作用

Byte Enable的主要作用是提供字节级别的访问控制,这使得PCIe能够更加灵活和高效地处理数据。它的存在允许:

非对齐访问:使PCIe能够处理非对齐的内存地址访问请求,这是在现代计算系统中常见的需求。
部分字节操作:支持对小于4字节的数据进行写入操作,这有助于减少不必要的数据传输,提高系统的数据处理效率。
数据保护:确保在执行部分字节写入时,同一DWORD内的其他字节内容不会被意外修改,保护了数据的完整性。
总的来说,Byte Enable信号在PCIe架构中提供了重要的字节级别精度和灵活性,是优化数据传输、提高效率和保护数据完整性的关键机制。

🌟关于TLP的Data Payload有:

· Data Payload的大小由TLP Header中的Length决定。
· Data Payload的数据采用的是Little Endian,即低字节存放于低地址中。
· Data Payload的大小并不是有效的数据的大小,有效数据的大小是由Data Payload和Byte Enable共同决定的。
· 当TLP类型为Message时,Length一般是保留的(Reserved),除非该Message是带有数据的(MsgD)。
· TLP的Data Payload大小不得超过Max_Payload_Size的值,该值位于Device Control Register中。对于比较大的数据量,因此只能分多次进行发送。对于读请求来说,并没有Data Payload,也就是说该规则并不适用于读请求。
· 需要特别注意的是,起始地址和结束地址之间不能够跨越4KB的地址边界。

📌下面详细解释为什么buffer bound to 4KB address boundary对系统至关重要:

内存管理和系统架构
计算机的内存管理单元 (MMU)通常以页面为单位管理物理内存,而操作系统中的常见页面大小就是4KB。不允许TLP跨越4KB边界有助于:

确保TLP对应的数据传输在同一个内存页面内,简化内存的管理与分配。 有助于避免产生额外的页面错误或页面交换行为,尤其是在对物理地址访问时。
缓存一致性 多核处理器和系统中的缓存通常按照缓存行(cache
line)进行组织,而缓存行的大小通常不会超过4KB。确保数据传输不跨越4KB边界有助于:

保持缓存行内的数据一致性,避免一个TLP操作需要更新多个缓存行所带来的复杂性。 减少缓存同步协议所需要处理的情况,降低系统的复杂度。
错误检测和处理 硬件通常会实施一些错误检测和纠正机制,比如ECC(错误校验和纠正)。这些机制也以物理页面为基础。不跨越4KB边界有助于:

在发生错误时,能够准确地定位到错误发生的页面,并进行处理,而不涉及多个页面。 降低出现多位错误的可能性,增强数据的可靠性。
总之,为了保证内存、缓存和错误管理的效率与简洁性,PCIe规范要求TLP的data
payload在进行数据传输时不得跨越4KB边界。这规则不适用于读请求的TLP,因为读请求的TLP本身不携带data
payload,而是请求从远端设备获取数据,返回的是Completion with Data的TLP,它们遵守相同的数据载荷规则。

✨小结:

本章主要介绍TLP Header的构成,下一章再详细介绍TLP Header的格式和作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/626237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬盘格式化后能恢复数据吗?这个恢复方法电脑小白也能用!

硬盘格式化后能恢复数据吗?对于这个问题需要先了解清楚硬盘格式化和数据恢复的原理了。 目前我们所说的硬盘格式化通常都是指“快速格式化”,一般来说当我们在清理磁盘空间或者新建磁盘分区时会使用到这个功能,最终的结果就是清除掉磁盘上的…

“打工搬砖记”中吃什么的轮盘功能实现(二)

文章目录 打工搬砖记转盘主要的逻辑实现转盘的素材小结 打工搬砖记 先来一个吃什么轮盘的预览图,这轮盘文案加字呈圆形铺出来,开始后旋转到指定的选项处停下来。 已上线小程序“打工人搬砖记”,可以扫码进行预览观看。 转盘主要的逻辑实现…

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。 理想情况下,屏幕…

AcqKnowledge 5.0使用方法

Biopac 数据导入 matlab 处理方法 第一步:在 AcqKnowledge 软件中,将数据通道的 mark 信息导入到 Graph,并将数据存储为 acq3 的格式 第二步:MATLAB中读取acq3文件脚本 clc clear %%%所有被试这一层路径 pathsub fullfile(file…

【JavaEE】HTTP 协议

文章目录 一、HTTP 协议1、HTTP 是什么2、理解 "应用层协议"3、理解 HTTP 协议的工作过程4、HTTP 协议格式5、HTTP 请求 (Request)5.1 认识 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作过程3.1 对称加密3.2 非对称加密3.3 证书3.4 完…

iOS——消息传递和消息转发

消息传递(Message Passing): 在 iOS 中,消息传递机制是基于 Objective-C 语言的动态性质的一种编程方式。这种机制主要涉及到两个概念:发送者(即消息的发送对象)和接收者(即消息的接…

RS422一主多从MAX3490

RS422一主多从MAX3490 最近项目用到了RS422一主多从,一个主机4个从机。芯片用的MAX3490,几经折腾,最终只能从一拖4改为一拖2。 主机发送端,从机4个接收端都是正常的,没有问题。波形非常完美,没有太大变形 …

matlab使用2-基础绘图

matlab使用2-基础绘图 文章目录 matlab使用2-基础绘图1. 二维平面绘图2. 三维立体绘图3. 图形窗口的分割 1. 二维平面绘图 % 创建一些二维数据 x 0:0.01:10; % x轴的数据点,从0到10,间隔为0.01 y sin(x); % y轴的数据点,是x的正弦…

版本控制:软件开发的基石(一文读懂版本控制)

未经允许,禁止转载! 在现代软件开发中,版本控制是不可或缺的工具。它帮助开发者跟踪和管理代码的变化,协作完成项目,并确保代码的完整性和安全性。本文将基于Git官网的视频“什么是版本控制”来深入探讨版本控制的基本…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt(中的一个控件,它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…

转发_重定向

1.Servlet/JSP单独使用的弊端 当我们用Servlet或者JSP单独处理请求的时候 Servlet:拼接大量的html字符串 造成可读性差、难以维护JSP:使得html和Java代码互相交织 也造成了可读性差、难以维护的后果 最合适的做法就是两者结合使用 2.ServletJSP处理请…

宿舍管理系统代码详解(主页面)

本篇将对管理系统的主页面的代码进行详细的介绍。 目录 一、主页面前端代码 1.样式展示 2.代码详解 (1)template部分 (2)script部分 (3)路由导航守卫 (4)在vue中引用vue 一、主页…

数据库的三大范式!!!初学者必看

数据库的三大范式!!!初学者必看 三大范式是 Mysql数据库设计表结构所遵循的规范和指导方法目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。 三大范式之间是具有依赖关系的,比如第…

java 并发线程应用

java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…

对关系型数据库管理系统的介绍

1.数据库的相关介绍 关系型数据库管理系统:(英文简称:RDBMS) 为我们提供了一种存储数据的特定格式,所谓的数据格式就是表, 在数据库中一张表就称为是一种关系. 在关系型数据库中表由两部分组成&#xf…

【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库

今天是第七专题,主要内容是:导入ArduinoUZlib功能库,借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据,进行解压缩和t解析,在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容,请…

物联网应用开发--STM32与新大陆云平台通信(云平台控制开发板上蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标:(1)创建5个执行器:蜂鸣器,LED1,LED2,ED3,LED4;(2)执行器能对…

CodeGeeX 智能编程助手 6 项功能升级,在Visual Studio插件市场霸榜2周!

CodeGeeX是支持适配Visual Studio 2019的唯一一款国产智能辅助编程工具,已经在Visual Studio趋势上霸榜2周! CodeGeeX v1.0.4版本上线Visual Studio插件市场,带来了多项新功能和性能优化,提升编程体验。 新功能亮点速览&#xf…

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写,程序结构基本上都是这样的: // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…

Docker 基础认识

文章目录 概念铺垫(1)概念铺垫(2)概念铺垫 (3)概念铺垫(4)Docker 定义Docker 特点Docker 架构 概念铺垫(1) 虚拟化相关概念 物理机:实际的服务器…