先简单了解一下PCIe 总线的通信机制:假设某个设备(Requester)要对另一个设备(Completer)进行读取数据的操作,首先Requester需要向Completer发送一个Request,然后Completer通过Completion Package返回数据或者错误信息。在PCIe Spec中,规定了四种类型的请求(Request):Memory、IO、Configuration、Messages。其中,前三种都是从PCI/PCI-X总线中继承过来的,第四种Messages是PCIe新增加的类型。详细的信息如下表所示:
从表中我们可以发现,只有Memory Write和Message是Posted类型的,其他的都是Non-Posted类型的。所谓Non-Posted,就是Requester发送了一个包含Request的包之后,必须要得到一个包含Completion的包应答,这次传输才算结束,否则会进行等待。所谓Posted,就是Requester的请求并不需要Completer通过发送包含Completion的包进行应答,当然就不用进行等待了。显然,Posted类型的操作对总线的利用率(效率)要远高于Non-Posted型。
那么为什么要分为Non-Posted和Posted两种类型的呢?对于Memory Writes来说,对效率要求较高,因此采用了Posted的方式。但是这并不意味着Posted类型的操作完全不需要Completer发出应答,Completer任然可以采用另一种应答机制-Ack/Nak的机制(在数据链路层实现)。
PCIe的TLP包共有如下几种类型:
TLP的示意图如下:
TLP在整个PCIe包结构的位置如以下两张图所示:(第一张为发送端,第二张为接收端)
其中,TLP包的结构图如下图所示:
图中的TLP Digest即ECRC(End-to-End CRC),是可选向。此外,TLP的长度(包括其中的Header、Data和ECRC)是以DW(double words,4个字节)为单位。