AT([11:10])

Address Type,地址种类,与 PCIe 总线的地址转换相关,可暂时不考虑。

Length([9:0])

用来描述 TLP 的有效负载(Data Payload)大小。PCIe 总线设置 Length 字段的目的是提高总线的传送效率。Length 字段以 DW 为单位,其最小单位为 1 个 DW。

3. 报文举例

因为PICe的报文种类非常多,只举两个进行举例说明。

3.1 寄存器读报文

如下图所示,是一个32位寻址的寄存器读的完整报文(上节只介绍了第一个DW)。首先解释一下多的几个字段的含义。

详解PCIe总线协议

Requester ID

该字段字段包含生成TLP报文的PCIe设备的总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)。唯一的找到目标设备,那是因为不同的Endpoint设备空间会映射到Host内存空间的不同位置。

Tag

Requester ID、Tag合起来组成Transaction ID,在同一时间段内,PCIe设备发出的每一个Non-Posted数据请求TLP,其Transaction ID必须唯一。也就是Tag必须唯一。

Last DW BE和1st DW BE

在PCIe 总线以字节为基本单位迕行数据传递,但是 Length 字段以 DW 为最小单位。为此TLP 使用 Last DW BE 和 First DW BE 返两个字段迕行字节使能,使得在一个 TLP中,有效数据以字节为单位。

Address

对一个PCIe设备来说,它开放给Host访问的设备空间首先会映射到Host的内存空间,Host如果想访问设备的某个空间,TLP Header当中的地址应该设置为该访问空间在Host内存的映射地址。

值得注意的是:报文是以DW划分来进行说明,但实际过程中,顶层应用与PCIe IP核采用64位数据的AXI4通信,所以在发送TLP所需字段数据时,主要大小端的问题。

3.2 完成报文

有non-posted request TLP,才有Completion TLP。有因才有果。前面看到,Requester 的TLP当中都有Requester ID和Tag,来告诉接收者发起者是谁。那么响应者的目标地址就很简单,照抄发起者的源地址就可以了。因此,Completion TLP的Header如下:

详解PCIe总线协议

compl Status

完成情况指示。000--成功完成;001--不支持该请求。其余情况可查阅规范。

Byte Count

是指还剩下多少字节的数据需要读取。其余字段可自行查阅规范。

4. 机制简述

4.1 Non-Posted和Posted

PCIe总线规定了两类数据传送方式,分别是Non-Posted和Posted数据传送方式。

在PCIe总线中,Non-Posted总线事务分两部分进行,首先是发送端向接收端提交总线读写请求,之后接收端再向发送端发送完成(Completion)报文。PCIe总线使用Split传送方式处理所有Non-Posted总线事务,存储器读、I/O读写和配置读写这些Non-Posted总线事务都使用Split传送方式。简单的说就是“一问一答”的方式。