2. 事务层说明

2.1. 事务层概述

下图为事务层在PCIE整体结构中的示意图

PCIe Base Specification 3.0

从一个较高的层级来看,事务层所涉及的关键内容包括:

  • 一种流水线的完全拆分事务协议
  • 用于区分事务层数据包(TLP)的排序和处理需求的机制
  • 基于信用的流控制
  • 用于数据中毒检测和端到端数据完整性检测的可选支持

事务层主要包括如下内容:

  1. 构建和处理TLP
  2. 与设备资源相关的事务层机制,包括:
    • 流控制
    • 虚拟通道管理
  3. 用于TLP排序和管理的规则
    • 与PCI/PCI-X兼容的排序方式
    • 包括流类别的划分

2.1.1. 地址空间、事务类型和用法

“事务”是在请求者和完成者之间进行信息传输的基础。下表中定义了四种地址空间和不同的事务类型,每种地址空间都有其特有的用法。

地址空间 事务类型 基本用法
内存(memory) 读/写 向内存映射的地址传输数据
I/O 读/写 向I/O映射的地址传输数据
配置(configuration) 读/写 设备功能配置/设置
消息(message) 基线 从事件信令机制到通用消息
2.1.1.1.内存事务

内存事务包括如下类型:

  • 读请求/读完成
  • 写请求
  • 请求/完成的原子操作

内存事务使用了两种不同的地址格式:

  • 短地址格式:32位地址
  • 长地址格式:64位地址
2.1.1.2. I/O事务

PCIE支持I/O空间,以兼容老设备的使用需求。未来可能会不再使用I/O空间。I/O事务包括如下类型:

  • 读请求/读完成
  • 写请求/写完成

I/O事务仅使用一种地址格式:

  • 短地址格式:32位地址
2.1.1.3.配置事务

配置事务用于访问设备的配置寄存器。

配置事务包括如下类型:

  • 读请求/读完成
  • 写请求/写完成
2.1.1.4.消息事务

消息事务或简称消息,用于支持设备之间事件的带内通信。

除了规定的消息之外,PCIE还支持由厂商定义的使用特定消息格式的消息。

2.1.2.数据包格式概述

事务由”请求“和”完成“构成,并使用数据包进行通信。下图展示了TLP的结构,主要由一个或多个可选的TLP前缀、一个TLP头部、一个数据负载和一个可选的TLP摘要构成。

PCIe Base Specification 3.0

如上如所示,从概念上而言,PCIE将信息按照序列化的字节流进行传输。注意,在字节层面来看,将最先传输上图中的最左边的字节。

下图展示了TLP前缀、TLP头部和TLP摘要的细节内容。其中,为了提高串行互联的性能,对头部的布局进行了优化,以满足首先传输对时间要求最严格的信息的需求。例如,在TLP头部中,在地址域中最高位字节首先被传输,以尽早用于地址解码。

PCIe Base Specification 3.0

根据数据包的类型,数据包头部将会包括如下类型的域:

  • 数据包格式
  • 数据包类型
  • 任何相关数据的长度
  • 事务描述符,包括:
    1. a.事务ID
    2. b.属性
    3. c.流类型
  • 地址/路由信息
  • 字节使能
  • 消息编码
  • 完成状态

2.2.事务层协议:数据包定义

对于在链路上相互通信的两个组件,PCIE将使用基于数据包的协议在事务层进行信息交换。PCIE支持如下基本的事务类型:内存、I/O、配置和消息。内存请求支持两种地址格式:32位和64位。

事务是使用“请求”和“完成”展开的。“完成”是按需使用的,例如,为了返回读取的数据,或为了确认I/O完成以及配置写事务。“完成”与它们所对应的请求相关联,这种关联可通过数据包头部中的事务ID域的值确定。

当构建一个TLP时,对于TLP中标记了“保留”(简写为“R")的域,必须使用”0"进行填充。接收者必须忽略这些保留域中的值,交换器在进行转发时也不能进行修改。值得注意的是,某些域可能同时是“定义的”和“保留的”——对于这些情况的保留值需要单独处理。

2.2.1. 常见的数据包头部域

所有事务层数据包(TLP)的前缀和头部都包含如下域,如下图所示:

  • Fmt[2:0],TLP格式(见Table 2-2),字节0的7~5位
  • Type[4:0],TLP类型,字节0的4~0位

PCIe Base Specification 3.0

Fmt域表示存在一个或多个TLP前缀,类型域表示了相关的TLP前缀类型。

TLP头部的Fmt和类型域中提供了用于确定TLP头部其余部分大小的信息,还可以用于说明数据包在头部之后是否包含了数据负载。

TLP头部中的Fmt、类型、TD和长度域,包含了用于确定TLP中非前缀部分整体大小的所有信息。类型域除了定义了TLP的类型之外,还确定了交换器将如何路由该TLP。

  • Table 2-3中给出了Fmt[2:0]和Type[4:0]所允许的值。
  • TC[2:0],流类型,字节1的6~4位
  • TH,在TLP头部中用于表示存在TLP处理提示(TLP Processing Hints,TPH),以及可选的TPH TLP前缀(如果有),字节1的第0位
  • Attr[1:0],属性,字节2的5~4位
  • Attr[2],属性,字节1的第2位
  • TD,表明在TLP末尾,存在构成单个DW的TLP摘要,字节2的第7位
  • EP,表明TLP中毒了,字节2的第6位
  • Length[9:0],DW中的数据负载长度,包括字节2中的1~0位和字节3中的7~0位
  1. a.TLP数据必须4字节对齐,并按4字节(Double Words,DW)增长
  2. b.为不包含或引用数据有效载荷的TLP保留 ,包括Cpl,CplLk和消息

PCIe Base Specification 3.0

PCIe Base Specification 3.0

PCIe Base Specification 3.0

PCIe Base Specification 3.0

2.2.2. 带数据负载的TLP:规则

  • Length必须为整数个DW
  • Length[9:0]为所有消息所保留,除了那些显示给出数据长度的消息
  • 由TLP 长度域指定的发送方数据负载长度,不能超过发送方设备控制寄存器Max_Payload_Size域所指定的长度
  • 对于ARI设备,Max_Payload_Size仅有Function 0设定。其他Function中的Max_Payload_Size设定将被忽略
  • 对于一个和非ARI多功能设备相关的上游端口,如果Max_Payload_Size的设定在所有Function中都是一样的,发送的TLP数据负载不能超过这个通用的Max_Payload_Size设定
  • 对于一个和非ARI多功能设备相关的上游端口,如果Max_Payload_Size的设定在所有Function中不全相同,发送的TLP数据负载不能超过特定的Max_Payload_Size设定

a. 实现Transmitter时,尽量使用由产生事务的Function中所设定的Max_Payload_Size,或者所有Function中最小的Max_Payload_Size

b. 软件不能在不同Function中设定不同的Max_Payload_Size,除非软件知晓具体的实现

  • 接收到的TLP的数据负载长度由TLP的长度域指定,该长度不能超过由接收者的设备控制寄存器所指定的Max_Payload_Size大小
  • 接受者必须验证这一规则是否被违背。如果接受者确定一个TLP违背了该规则,那么这个TLP就是一个畸形的TLP。
  • 对于ARI设备,Max_Payload_Size仅有Function 0设定。其他Function中的Max_Payload_Size设定将被忽略
  • 对于一个和非ARI多功能设备相关的上游端口,如果Max_Payload_Size的设定在所有Function中都是一样的,接收的TLP数据负载不能超过这个通用的Max_Payload_Size设定
  • 对于一个和非ARI多功能设备相关的上游端口,如果Max_Payload_Size的设定在所有Function中不全相同,接收的TLP数据负载不能超过特定的Max_Payload_Size设定
  • 实现Receiver时,尽量使用由产生事务的Function中所设定的Max_Payload_Size,或者所有Function中最小的Max_Payload_Size
  • 软件不能在不同Function中设定不同的Max_Payload_Size,除非软件知晓具体的实现
  • 对于包含数据的TLP,Length域中的值必须TLP中实际包含的数据长度相匹配
  • Length域中的值仅用于指定数据长度,TLP摘要的长度不包含在Length域中
  • 当一个数据负载被包含在一个TLP中,而非一个AtomicOp Request或一个AtomicOp Completion中,那么数据的第一个字节将紧跟头部之后,后续字节将按字节序递增
  • 例:将16字节数据写到地址100h,头部之后的第一个字节应该写到地址100h,第二个字节应该写到地址101h,以此类推,最后一个字节写在地址10Fh
  • 在AtomicOp Requests和AtomicOp Completions中的数据负载必须按照如下格式进行排列:TLP头部之后的第一个数据字节应该是第一个数据值的最低有效字节,后续数据字节要严格安汇总啊有效位递增。对于CAS Requests,第二个数据值必须紧跟第一个数据值,并且使用相同格式。

2.2.3 TLP摘要规则

  • 对于任何TLP,TD位中的值表明了在TLP的最后存在包括ECRC值的TLP摘要。
    1. 如果TLP的TD位的值与观察到的值不一致,那么这个TLP就是一个存在错误的TLP
  • 如果处于中间或最后的PCIE 接受者不支持ECRC检查,那么接受者必须忽略TLP摘要。
    1. 如果接收者支持ECRC检查,那么接收者将把TLP摘要中对应的域解释为ECRC值。

2.2.4 路由和寻址规则

值表明了在TLP的最后存在包括ECRC值的TLP摘要。

  1. 如果TLP的TD位的值与观察到的值不一致,那么这个TLP就是一个存在错误的TLP
  2. 如果处于中间或最后的PCIE 接受者不支持ECRC检查,那么接受者必须忽略TLP摘要。
  • 如果接收者支持ECRC检查,那么接收者将把TLP摘要中对应的域解释为ECRC值。