总目录在此哦~

https://blog.csdn.net/z123canghai/article/details/115644744


目录

2.1 内容概述

2.2 PCIE的事务类型

2.2.1 通用帧头

2.2.2 内存事务

2.2.3 完成事务

2.2.4 配置事务

2.3事务传输方式

2.3.1 Non-Posted事物类型

2.3.2 Posted事物类型

2.3.3 一个案例


2.1 内容概述

本章节的主要内容如下所示。

2.1内容概述

主要理清事务类型、路由方式、3DW和4DW之间的关系;

2.2 事务类型

主要PCIE事务层帧格式、帧内容、不同事务的作用及传输机制,对每种事务都有大致的理解和记录;

2.3 传输机制

介绍四种事务类型的典型传输规则,会应用对应的事务类型;

2.4 处理机制

对PCIE所拥有的事务层处理机制进行介绍。

根据前文可知,事务层数据类型分为四大类,Memory、I/O、配置和消息,每一大类均有很多小类,而且具有三种路由模式即ID路由、地址路由和模糊路由,又有两种传输机制即Non-Posted和Posted,帧格式有分为3DW和4DW两种类型,似乎很乱,接下来就理一下其中关系,首先要说明下为什么要这样搞。

就是为了满足不同功能设备在PCIE架构下进行数据交换的需求。


2.2 PCIE的事务类型

2.2.1 通用帧头

前文说PCIE分为四种事务类型,即内存、I/O、配置和消息。其实除此之外还被分为3DW和4DW。意思是帧头是3个双字还是4个双字,16bit为字,双字就是32bit。4DW就是比3DW包含更多的帧信息。而且把,四种事务类型只是四大类,其中各自还包含很多子事务类型。而这些设置都是在事务层的帧信息中体现,如下图所示。

其实,事务层数据包格式是这样的

其中“TLP Prefix”是前缀,可添加的数据内容,暂且不说了

Header是帧头,也是当前主要阐述的内容,总的来说,帧头形式如下,但根据Type的不同也变化多样。

如下图是所有TLP数据包所具有的帧头,也就是最前面的32bit。

1、Fmt

即Format of TLP,这是一个3bit数,用来确定TLP的格式。注意是格式,不是类型,如下表所示。其中,3DW和4DW意思是帧头是3个双字还是4个双字,16bit为字,双字就是32bit。4DW就是比3DW包含更多的帧信息,且对与不同帧类型其定义也是不同的。例如,fmt=0,表示帧头长度时3个32bit,且不包含数据内容。

2、type

这个是用来表示传输类型的,与fmt结合,就确定了数据包的属性。PCIE对数据类型分为四大类,也称为四大地址空间,每一种都有其独特的用途,分别是存储、I/O、配置和消息,如下图所示。

存储事务(Memory Transactions)包括的事务类型有读请求与响应、写请求、基于原子操作的请求与响应,并且支持3DW和4DW。

I/Ο事务(I/O Transactions),在PCIE3.0规范中说以后可能弃用该类型了,目前还是支持的,支持读、写的请求与响应,并只支持3DW。

配置事务(Configuration Transactions)用来访问设备的配置寄存器的,支持读、写的请求与响应事务类型。

消息事务(Message Transactions)支持设备间的带内通信(in-band),可能是支持设备间的数据交换吧,暂时不理解。

总之,PCIE的事务分为这四大类,并由3DW和4DW的选择共同确定了事务属性,如下表所示。

TLP TYPE

Fmt

TYPE

描述

MRd

000/001

0_0000

存储事务的读请求,支持帧头为3DW和4DW,不含数据段

MRdLK

000/001

0_0001

锁定的存储器读请求,支持帧头为3DW和4DW,不含数据段

MWr

010/011

0_0000

存储事务的写请求,支持帧头为3DW和4DW,含数据段

IORd

000

0_0010

I/O读请求,支持帧头为3DW,不含数据段

IOWr

010

0_0010

I/O写请求,支持帧头为3DW,含数据段

CfgRd0

000

0_0100

Type0的配置读请求,支持帧头为3DW,不含数据段

CfgWr0

010

0_0100

Type0的配置写请求,支持帧头为3DW,含数据段

CfgRd1

000

0_0101

Type1的配置读请求,支持帧头为3DW,不含数据段

CfgWr1

010

0_0101

Type1的配置写请求,支持帧头为3DW,含数据段

TCfgRd

000

1_1011

PCIE3.0规范不推荐的数据类型,以前用于受信任的配置空间(TCS),如果接收方未实现TCS,则接收方必须将此类请求视为格式错误的数据包。

TCfgWr

010

1_1011

Msg

001

10r2r1r0

消息请求–子字段r [2:0]指定消息路由机制

000:路由到RC

001:

010:

011:

100:

101:

110-111:

MsgD

011

10r2r1r0

Cpl

000

0_1010

Completion without Data。支持帧头为3DW,不含数据段,用于各种数据类型的读完成。

CplD

010

0_1010

Completion with Data。支持帧头为3DW,含数据段,用于各种数据类型的读完成。

CplLk

000

0_1011

锁定的完成报文,TLP 头大小为 3 个双字,不带数据。

CplDLk

010

0_1011

带数据的锁定完成报文,TLP 头大小为 3个双字,带数据。

FetchAdd

010/011

0_1100

Fetch and Add 读取添加原子操作

Swap

010/011

0_1101

交换,原子操作

CAS

010/011

0_1110

CAS,原子操作

LPrfx

100

0L3L2L1L0

Local TLP Prefix

EPrfx

100

1L3L2L1L0

End-End TLP Prefix

3、TC

位宽3bit,是Traffic Class的缩写。表示事务的优先级,默认是0,数越大优先级越高。但对它的理解并不是我们通常所说的的优先级,是和虚拟通道有关系的。PCIE总线支持虚拟通道,也就是VC(Virtual Channel)技术,优先级不同的数据报文可以使用不同的虚拟通路,每一路虚通路可以独立设置缓冲,从而可以使得优先级高的有限传输。这也解决了服务质量的问题。默认是0,因为大多EP是没有该功能的。

(题外话,服务质量,即Quality of Service(QoS),百度百科说是指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。重点就是解决网络延迟和阻塞,前往也说了,PCI是没有该功能的)

4、Attr

Attributes的缩写,属性的意思。“属性”字段用于提供允许修改事务的默认处理的方式。

其中第0位表示TLP经过RC到达存储器时,是否需要与Cache保持一致性,第一位表示是否支持“Relaxed Ordeing”模式,这种模式可以使得后一个存储器写TLP包穿越前一个,提高PCIE总线的利用率,第二位是是否支持“ID-Based Ordering”,这是PCIE V2.1引入的一种新的模型,IDO模型,该模型主要是用于switch,实现一进多出转变为一一对应。

5、TH

位宽1bit,表示当前 TLP 中含有 TPH(TLP Processing Hint)信息, TPH 是 PCIe V2.1 总线规范引入的一个重要功能。 TLP 的发送端可以使用 TPH 信息, 通知接收端即将访问数据的特性, 以便接收端合理地预读和管理数据

6、TD位

表示 TLP 中的 TLP Digest 是否有效, 为 1 表示有效, 为 0 表示无效。 而 EP 位表示当前 TLP 中的数据是否有效, 为 1 表示无效, 为 0 表示有效。

7、AT

AT 字段与 PCIe 总线的地址转换相关。 在一些 PCIe 设备中设置了 ATC(Address

Translation Cache)部件, 这个部件的主要功能是进行地址转换。 只有在支持 IOMMU 技术的处理器系统中, PCIe 设备才能使用该字段。

AT 字段可以用作存储器域与 PCI 总线域之间的地址转换, 但是设置这个字段的主要目的是为了方便多个虚拟主机共享同一个 PCIe 设备。 对这个字段有兴趣的读者可以参考 Address Translation Sevices 规范, 这个规范是 PCI 的 IO Virtualization 规范的重要组成部分。

8、Length

Length 字段用来描述 TLP 的有效负载(Data Payload)大小。 PCIe 总线规范规定一个 TLP的 Data Payload 的大小在 0B~ 4096B 之间。 PCIe 总线设置 Length 字段的目的是提高总线的传送效率。


2.2.2 内存事务

内存事务是指存储器和I/O的读写请求还有原子请求操作,并且支持地址长度为32位或64位两种,如下图是两种格式,下面就简单介绍。

1、Length

表示数据包中的数据长度,大小为0到0x3FF,当该值为0时则表示数据长度为1024DW,那么是不是意味着必须含有数据信息呢?按理说读写数据含有数据信息是必然的,但设计者还是提供了一种方式表示不含数据包的形式,用于实现读刷新工作,成为“Zero-Length”。实现方式是将Length置一,且“Last DW BE”和“1st DW BE”均为0。

2、DW EB字段

PCIE总线以字节为单位就那些数据的传递存储,但Length的最小单位是32bit。所以需要用“Last DW BE”和“1st DW BE”这两个字段进行字节使能,使得在一个TLP中,有效数以字节为单位。其中“Last DW BE”表示数据的最后一个双字中的有效位,“1st DW BE”表示字段的每一位对应数据Payload第一个双字的字节使能位。

3、Requester ID和Tag字段

“Requester ID”的15bit包括生成报文的总线号(8bit ,Bus Number)、设备号(5bit,Device Number)和功能号(3bit,Function),但对于存储器写请求的TLP,“Requester ID”并不是必须的,因为目标设备并不需要对接收数据进行应答。但对于存储器的读请求、I/O和配置读写请求则必须该字段。

存储器、I/O读请求TLP中含有Requester ID和Tag字段,合称为“Transaction ID”,格式如下所示,主要是用于请求TLP的目标设备用于返回确定完成数据包的返回地址。Tag用来标识Requester ID相同的同类不同类型的数据包。对于PCIE总线,所有的Non-Posted数据请求都需要完成报文作为应答,才能结束一次完整的数据传递。一个源设备发出请求若没有收到完成数据包就会保存“Transaction ID”不能再被使用,这里主要的区别就在于Tag字段,Tag决定了发送端能够暂存多少个同类型的TLP。

另外,PCIE2.1总线还提出来另一种Requester ID格式,叫做ARI(Alternative Routing-ID Interpretation)格式,这种格式将Requester ID分为了总线号(8bit ,Bus Number)、功能号(3bit,Function)两种。因为PCIE链路 上仅可能存在一个PCIE设备,因而Device 会为0。

I/O 读写请求与存储器读写请求TLP格式基本类似,但只能是32位地址模式和基于地址的路由方式,且只能使用NON-Posted方式进行传递,这也是为了兼容PCI,在以后的协议几乎要取消I/O 读写请求了。另外,对于I/O读写请求,TC必须为0、Attr的低两位必须为0、AT必须为0、Length必须为1,Last DW必须为0。


2.2.3 完成事务

以我理解,PCIE会有读请求、会有需要响应的写内存等操作,这时候需要目标设备的返回数据包,这个数据包我们不能严格意义上称之为响应数据包,因为有些数据是用来传递数据的,所以我们将其称为完成事务,因为这类事务或者说数据包都是被动发起的。

完成报文如下图所示,完成报文主要用于两类操作,一类是用于数据传递的,例如一个设备发来了读请求(MDR)、I/O读请求(IORd)、配置读请求(CFGRdx)以及原子操作,当我们接收到这类数据包时需要返回对应内容,返回的数据内容必然携带数据信息。另一类是I/O写请求(IORd)、配置写请求,它们时Non-Poste模式,需要对其响应(应答),当收到这样一包数据后就会发送一包不含数据信息的数据,也就是完成报文。无论何种类型,完成事务都采用ID路由的方式,即BDF路由方案,下面我们就解析下完成事务的帧格内容。

1、第一行(Byte0~Byte3)

这行内容是通用帧头,Fmt有“010”和“000”两种,分别表示含有有效数据和不含有有效数据内容。Type也分为“01010”和“01011”两种,表示不锁定的完成报文和锁定的完成报文。

2Requester ID(Byte 8)

首先说请求ID,这个与内存事务的请求ID一致,该字段与Tag组成“Transaction ID”用来实现数据包的路由。当收到了上文所说的读请求(MDR)、I/O读请求(IORd)、配置读请求(CFGRdx)以及原子操作,需将接收数据包中的“Transaction ID”填充到此进行返回。

3Completer ID(Byte4)

首先明确一件事情,对于ID路由模式,依靠的是“Transaction ID”,也就是Requester ID和Tag组合,所以“Completer ID”并不具有路由功能。它的存在是当发送的报文是用来实现应答响应功能时所要添加的。

4Compl Status

这是一个3bit数,该字段保存完成报文的状态,具体如下

Status

描述

0b000

SC(Sucessful Completion),响应成功,正常结束

0b001

UR(Unsupported Request),不支持的数据请求

0b010

CRS(Configuration Request Retry Status),要求数据请求方进行重试。当RC对一个PCIE目标设备发起配置请求时,如果该目标没有准备好,可以向RC发出CRS完成报文,当RC收到该报文时不能结束本次配置请求,必须择时重新发送配置请求。

0b100

CA(Completion Abort),数据夭折,表示目标设备无法完成本次数据请求

其它

保留

5BCMByte Count

BCM(Byte Count Modified)是用于PCI-X设备的。PCI-X设备进行存储器读请求时,目标设备不一定一次就能将所有数据传递给源设备。此时目标设备在进行第一次数据传递时,需要设置Byte Count字段和BCM位,具体的日后有空补充吧,貌似不耽误学习PCIE。

6Lower Address字段

如果完成报文是用来传递数据的,那么该字段存放的是存储器都完成TLP中的第一个数据所对应地址的最低位。因为在完成报文中,并没有“Last DW BE”和“1st DW BE”。但协议格式似乎并没有字段产生该报数据的长度,这些内容是在其它地方定义,称之为“Max_Payload_Size”和“Max_Read_Request_Size”。


2.2.4 配置事务

配置是从PCI就有的机制,PCIE继承了PCI的配置方式。对于PCIE,配置是由RC发起的,采用ID路由方式与目标设备进行数据交换实现配置功能,如下为配置事务的帧格式。

1、第一行(Byte0~Byte3)

这部分是通用帧头,与前文所述一致,但对于配置事务,有些字段是固定的。Fmt=000是配置读,=010是配置写,TC必须为0。Attr必须为0,Length必须为1。last DW必须为0。1st DW 字段根据配置读写请求的大小设置。

2、第二行(Byte4~Byte7)

这部分和内存事务一样,存储本地的BDF。

3、第三行(Byte8~Byte11)

“BDF”指的是目标设备地址。Ext.Reg. Number 和Register Numbers是存放寄存器号的,这部分内容会在配置相关章节进行阐述。

消息报文主要用于INTx中断消息报文、电源管理消息报文、错误消息报文、锁定事务消息报文、插槽电源限制消息报文和Vendor-Defined Messages。


2.3事务传输方式

正如前文所述,数据交换是基于请求与完成(响应)的机制,分为Non-Posted和Posted两种模式。Non-Posted模式即请求端(requester transmits)发送完一包数据到目标设备(completer),目标设备要返回一包数据到请求设备,告知其接收情况。Posted模式则不需要目标设备返回TLP数据包,但在链路层有相关的应答机制用于维护链路传输,如下是不同事物类型的传输机制。

2.3.1 Non-Posted事物类型

如上表,Non-Posted模式有可分为两类,第一类是读事物,即MRd、MRdLk、IORd、CfgRd0/1,第二类是写事物,即IOWr、CfgWr0\1。

首先看第一类读事物,如下图所示。

第二类写事物,如下图所示。

2.3.2 Posted事物类型

post事物类型包括MWr、Msg和MsgD。

2.3.3 一个案例


欢迎关注“沧小海的FPGA”微信公众号,回复“PCIE”可获取相关资料,其中包括

1、协议规范的中文翻译

2、相关英文资料

3、PCIE的使用教程

沧小海笔记之PCIE协议解析——第二章 详述PCIE事务层相关推荐

  1. 【沧小海笔记】之基于FPGA的以太网设计相关知识——第三章 xilinx 三速以太网IP核(TEMAC)的介绍

    总目录在这里哦~ https://blog.csdn.net/z123canghai/article/details/114649502 Xilinx为我们提供了一个叫做"Tri-Mode ...

  2. 沧小海笔记之基于xilinx的三速以太网相关知识的学习与理解

    目录 第一章 读<图解TCP/IP>笔记 第二章  互联网概述 第三章  物理层介绍(基于88E1111) 第四章  xilinx 三速以太网IP核(TEMAC)的介绍 第一章 读< ...

  3. 沧小海基于xilinx srio核的学习笔记之第二章 Rapidio技术概述

    总的目录在这哦~ https://blog.csdn.net/z123canghai/article/details/114648658 目录 第二章 Rapidio技术概述 2.1 总体原则 2.2 ...

  4. 沧小海详解面试的必答题——I2C协议

    目录 第一部分:I2C协议的概述 第二部分:I2C协议的阐述 第三部分:AT24C04简述 第四部分:基于verilog的程序设计(暂无) 对于大多从事FPGA行业的应届生来说,在面试过程中很可能会被 ...

  5. 沧小海笔记本之xilinx srio核的学习记录之目录

    目录 第一章:互连问题 第二章 Rapidio技术概述 第三章 xilinx srio核结构 3.1 xilinx srio核的结构介绍 3.2 ilinx srio核的HELLO格式和流控 3.3  ...

  6. 沧小海笔记本之A7系列FPGA资源介绍

    目录 第一部分:I / OBANK部分资源介绍 1.1  I/O BANK概述与ILOGIC资源概述 1.2  IDELAYE2.IDELAYCTRL和OLOGIC的资源介绍 1.3  OSERDES ...

  7. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算1

    内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...

  8. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算2

    内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...

  9. 叉积 微分 恒等式_考研真题分章解析 | 第二章 导数与微分

    高数思维 导读:本系列专辑为考研真题分章解析,主要包括:函数.极限与连续.一元函数微分学.一元函数积分学.多元函数微分学.多元函数积分学.空间解析几何.级数.微分方程等内容,共计12章,整理了近32年 ...

  10. 沧小海读《图解TCP/IP》笔记——第六章 TCP与UDP

    总目录在这里~ https://blog.csdn.net/z123canghai/article/details/107855399 子目录 6.1 传输层的作用 6.2 UDP 6.3 TCP 6 ...

最新文章

  1. mysql server远程连接_MySql server:开放mysql远程连接
  2. Bit-Z转入GXS、PPS、SPHTX、EOS未到账解决方案
  3. ​年底大会火爆,看“瑶台”如何搭建一场高质量沉浸式大会
  4. skynet源码阅读5--协程调度模型
  5. AIDL Service,跨进程调用Services
  6. Ubuntu用户Steam控制器不工作的解决办法
  7. javascript数组去重方法汇总
  8. ZigBee 快速入门(协议栈,协调器,路由器,终端设备,加入网络,安全,路由功能,频段)
  9. [笔记]numpy中的tile与kron的用法
  10. CISCO ASR9000 密码恢复
  11. dede获取顶级栏目
  12. Java8新特性——Map的新方法
  13. ajax,HTTP原理 : 网络传输协议,网页从输入url到渲染的流程,函数防抖和节流
  14. 用函数编程实现输出 m~n之间所有素数,并求和,m和n由键盘输入。(c语言)
  15. Java二叉树和红黑树
  16. 氢os android 7.0,氢OS 3.0正式推送!基于Android 7.0,简洁纯净
  17. 【EI会议推荐】第四届机器人、智能控制与人工智能国际学术会议(RICAI 2022)
  18. My97DatePicker 日期控制,开始时间不能大于结束时间,结束时间不能小于开始时间
  19. JAVA Json-Schema接口校验利器
  20. 本证方程的本征值 与 特征方程的特征值 的 区别 辨析

热门文章

  1. M3U8视频下载为mp4
  2. python中的对象有哪些_python中的对象
  3. CCS10.2安装步骤
  4. CRC校验码计算公式
  5. Modbus RTU CRC校验码计算方法
  6. Mac上Fortran环境搭建
  7. java webrtc视频会议_JAVA webRtc的实现视频会议系统
  8. Ubuntu视频教程
  9. 软件测试自学指南---从入门到精通V1.0
  10. Python微信打飞机游戏编程学习笔记04