目录
处理层描述符(Transaction Descriptor)
本文主要内容来自PCI_Express System Architecture 第四章“Packet-Based Transactions”内容学习。
事务层包(TLP)概述
前面介绍过TLP包主要四种类型为:
- 内存Memory
- IO
- 配置Configuration
- 消息Message
对memory的读写包分为读请求包和响应包、写请求包(不需要存储器的响应包);I/O类型的读写请求都需要相应包;配置类型的包的读写请求也有响应包。这些包请求还可以按属性来分类:NP-nonposted, 即请求需要返回completion的响应包;还有一种就是post,不需要completion返回响应包。TLP 包类型如下表
TLP 包结构
事务层包(TLP) 有三部分组成,帧头、数据、摘要(或者称ECRC),如下图所示:
每种TLP包都有一定的格式的帧头,根据不同包的特性还有数据负荷(Data Payload)和摘要(TLP Digest).帧头中的数据用来对包的管理和控制,Data Playload 用啦存放有效数据。TLP Digest中存放32位的ECRC校验。TLP包传递以DW为长度单位,发送端不得超过“Device Control Register” 中的“max payload Size”的数值,接收端中,所接收的数据量也不能超过接收端”Device Control Register”中的“Max Payload Size”数值。
TLP包组件 | 协议层 | 功能 |
帧头(HDR) | 事务层 | TLP 头标长 3 或者 4 个 DW,格式和内容随事物类型变化 |
数据(DATA) | 事务层 | 可选段,为 TLP 帧头定义下的数据段,如果该 TLP 不携带数据,那该段为空 |
摘要(DIG) | 事务层 | 可选段,基于头标、数据字段计算出来的 CRC,称为 ECRC。通常长度为1DW |
TLP 包帧头格式
如下图所示,1个DW为4Byte,头标(HDR)长度可以是3DW或者4DW,图中以4DW为例子。
TLP包帧头格式解析:
Header Field | Header Location | Field Use |
Fmt[1:0] | Byte 0->Bit 6:5 | TLP 头的大小是由 3 个双字还是 4 个双字组成,当前 TLP 是否包含有效负载。 |
Type[4:0] | Byte 0->Bit 4:0 | TLP 使用的总线事务 |
TC(Traffic Class) | Byte 1->Bit 6:4 | TLP 的服务层次和用于映射的虚拟通道,PCIe 总线规定了 8 种传输虚拟通道,分别为TC0~TC7,缺省值为 TC0 |
TD(TLP Digest Field Present) | Byte 2->Bit 7 | 表示 TLP 中的 TLP Digest 是否有效,为 1 表示有效,为 0 表示无效 |
EP(Poisoned Data) | Byte 2->Bit 6 | 表示当前 TLP 中的数据是否有效,为 1 表示无效,为 0 表示有效 |
Attr(Attribus) | Byte 2->Bit 5:4 | Bit5示是否支持 Relaxed Ordering;bit4表示该 TLP 在经过 RC 到达存储器时,是否需要进行 Cache 共享一致性处理。
|
Length[9:0] | Byte 2->Bit 1:0 Byte 3->Bit 7:0 | 描述 TLP 的有效负载(Data Payload)大小。PCIe 总线规范规定一个 TLP的 Data Payload 的大小。PCIe 总线设置 Length 字段的目的是提高总线的传送效率。Length 字段以 DW 为单位,其最小单位为 1 个 DW。
|
1st DW Byte Enables | Byte 7->Bit 3:0 | Bit3=1 表述数据payload 第一个双字节3有效 Bit2=1 表述数据payload 第一个双字节2有效 Bit1=1 表述数据payload 第一个双字节1有效 Bit0=1 表述数据payload 第一个双字节0有效 |
Last DW Byte Enables | Byte 7->Bit 7:4 | Bit7=1 表述数据payload 最后一个双字节3有效 Bit6=1 表述数据payload 最后一个双字节2有效 Bit5=1 表述数据payload 最后一个双字节1有效 Bit4=1 表述数据payload 最后一个双字节0有效 |
Ps:R为保留信息为,一般设置为0,路由器switch对此位不做修改,接收端忽略该bit信息。
TLP包类型编码
Fmt[1:0] 和 Type[4:0] 字段确认当前 TLP 使用的总线事务,TLP 头的大小是由 3 个双字还是 4 个双字组成,当前 TLP 是否包含有效负载。Fmt+Type配置信息如下
TLP包类型 | Fmt[1:0] | Type [4:0] |
Memory Read Request (MRd) 存储器读请求 | 00 为3DW的帧头, 无数据 01 为4DW的帧头, 无数据 | 0 0000 |
Memory Read Lock Request (MRdlk) 锁定存储器读请求 | 00 为3DW的帧头, 无数据 01 为4DW的帧头, 无数据 | 0 0001 |
Memory Read Request (MWr) 存储器写请求 | 10 为3DW的帧头, 有数据 11 为4DW的帧头, 有数据 | 0 0000 |
IO Read Request (IORd) IO读请求 | 00 为3DW的帧头, 无数据
| 0 0010 |
IO Write Request (IOWr) IO写请求 | 00 为3DW的帧头, 有数据
| 0 0010 |
Config Type 0 Read Request (CfgRd0) Type 0 配置写请求 | 00 为3DW帧头,无数据 | 0 0100 |
Config Type 0 Write Request (CfgWr0) Type 0 配置写请求 | 10 为3DW帧头,有数据 | 0 0100 |
Config Type 0 Read Request (CfgRd1) Type 1 配置写请求 | 00 为3DW帧头,无数据 | 0 0101 |
Config Type 1 write Request (CfgWr1) Type 1 配置写请求 | 10 为3DW帧头,有数据 | 0 0101 |
Message Request (Msg) 消息请求 | 01为4DW帧头,无数据 | 10 rrr* |
Message Request W/data (MsgD) 带数据的消息请求 | 11 为4DW帧头,有数据 | 1 0rrr* |
Completion (Cpl) 完成 | 00 为3DW帧头,无数据 | 0 1010 |
Completion W/Data (CplD) 带数据的完成 | 10 为3DW帧头,有数据 | 0 1010 |
Completion-Locked (CplLk) 锁定完成 | 00 为3DW帧头,无数据 | 0 1011 |
Completion-Locked W/Data 带数据的锁定完成 | 10 为3DW帧头,有数据 | 0 1011 |
处理层描述符(Transaction Descriptor)
Transaction Descriptor 用来请求设备和应答设备之间传送处理层信息。包括三部分,Traffic class (TC). 、Attributes、Transaction ID如下图红色部分所示:
其中Transaction ID 包括了Request ID字段和 Tag字段,Request ID包含“生成返个 TLP 报文”的 PCIe 设备的总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)。Tag 由请求包的设备生成,如果请求设备需要应答,则每个Tag和Function Number是唯一的。Transaction ID 是 一个屈居标识符用于响应包寻址请求。
TLP寻址
TLP 寻址主要由三种方式:地址路由(address)、ID识别路由、间接路由(implicit)。地址路由主要用于Memory和I/0请求包,memory 读写请求包支持64位地址和32位地址,I/O请求只支持32位地址。ID 寻址方式主要用在configuration 请求包、部分message包、响应包中。ID中包含了Bus Number、Device Number、Function Number为TLP 定位目标设备。ID寻址中包长度有3DW和4DW两种。Implicit路由也可以称为隐式路由,只能用于Message路由,包长度 都是4DW.
包请求和完成过程的帧头格式详解
I/O request 包
I/O request包只有32位地址寻址,每次只传输一个DW数据,格式如下:
Ps:TC/Attr/AT/Length/Last DW BE 均为固定值。
Memory request 包
采用直接地址寻址,有64bit地址和32bit地址两种地址。其中读请求包的长度不能大于Max_Read_Request_Size寄存器中设置的值。请求设备不能请求一个超过4KB空间的read request 包。下图是两种不同地址长度的Memory request 包格式:
Configuration request包
Configuration request包采用ID寻址方式,PCIE支持Type 0 和 Type 1 两种配置操作。帧头固定长度为3DW, 如下图示:
Ps:TC/Atre/AT/Length/ Last DW BE为固定值
Completions 完成包
完成包是对应以下几种包的响应包:
完成包里的信息和请求包里面的信息有很多事相同的,如traffic Class, Attribute bits, 以及 原始的Requester ID. 固定长度为3DW,格式如下图:
Message Request 包
Message Request 可以用来取代早期协议中中断,错误,电源管理信号。所有的Message 都使用4DW帧头格式,可以使用ID/地址/间接三种寻址方式。格式如下图示:
TLP报文例子
这是一个内存写请求的TLP报文:CPU 给32bit地址0xfdaff040写数据 0x12345678
报文内容0000000f40000001+12345678fdaff040,由于一次发送64位,因此这个报文的前64位是标头,后64位是数据和地址。
按照上图的数据格式可知
Request ID:16’b0000_0000_0000_0000
Tag:8’b0000_0000
Last DW BE:4’b0000
First DW BE:4’b1111
Fmt:2’b10
Type:5’b0_0000
Length:10’b00_0000_0001
Data:32’h12345678
Address:32’h3f6bfc10(低两位无效)