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


总目录在此哦~

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的使用教程

  • 9
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值