PCIe协议类似于传输协议,分为3层,物理层,链路层,事务层。其中流控就发生在链路层,用于对其上层事务层进行流控。
PCIe流控为点到点的流控,即只适用于相邻节点之间,当接受端表示没有credit时,发送端就不能发送TLP报文给接收端,类似于TCP接收窗口流控。
TLP(事务层报文)一共有三大类:Posted Transactions(包括Memory Writes和Messages)、Non-Posted Transactions(包括Memory Reads、Configuration Reads and Writes、IO Reads and Writes)以及Completions(包括Read and Write Completion)。并且知道,TLP可以分为两个部分,Header和Data部分。Flow Control为了获得更高的数据传输效率,将这三类TLP分开存放,同时将Header与Data部分也分开存放。因此,一共存在六种不同的Flow Control Buffer类型。
在 PCIe 总线的节点中, 一个 VC 的接收缓存由 PH ( Posted Header) 缓存、 PD ( Posted Data) 缓存、 NPH (Non⁃Posted Header) 缓存、 NPD (Non-Posted Data) 缓存、 CplH ( Com-pletion Header) 缓存和 CplD (Completion Data) 缓存组成。
● PH 缓存存放存储器写请求 TLP 和 Message 报文使用的 TLP 头。
● PD 缓存存放存储器写请求 TLP 和 Message 报文使用的 Payload。
● NPH 缓存存放 Non⁃Posted 请求 TLP 使用的 TLP 头。
● NPD 缓存存放 Non⁃Posted 请求 TLP 使用的 Payload。 在 Non-Posted 请求 TLP 中, 如存 储器读请求 TLP 并不含有 Payload 字段, 但是 I / O 和配置写请求 TLP 使用 Payload 字段。
● CplH 缓存存放完成报文使用的 TLP 头。
● CplD 缓存存放完成报文使用的 Payload。
Flow Control Buffer的存储单元(Unit)被称作Flow Control Credits。对于Header来说,Requests TLP每个unit等于5DW,而Completions TLP每个unit等于4DW。对于Data来说,每个unit等于4DW,即Data Buffer是按照16个字节对齐的。
对于各种类型的Buffer的最小值如下表所示:
最大值如下表所示:
注:0 unit表示无限(Infinite)。
PCIe 总线使用 FCP (Flow Control Packets) 传递 Credit 信息, FCP 是一种 DLLP, 该报文 的使用与事务层的接收缓存直接相关, 但是对事务层透明, 该报文产生于数据链路层, 终止 于数据链路层。
FCP 共分为三大类 InitFC1、 InitFC2 和 UpdateFC。 在这三类报文中有 3 个重 要的字段。 其中 HdrFC 字段存放 Header 的 Credit; DataFC 字段存放 Data 的 Credit; 而 VC ID 字段存放不同的 VC (Virtual Channel)号。
InitFC1、 InitFC2的初始化流程如下:
PCIe 总线完成流量控制的初始化之后, Current 节点、 Upstream 节点和 Downstream 节点 通过发送 UpdateFC⁃P、 UpdateFC⁃NP 和 UpdateFC⁃Cpl 报文进行流量控制。
update报文格式如下:
实际发生的流控报文如下所示:
分别是InitFC1、 InitFC2 和 UpdateFC-cpl