PCIe系列第二讲、PCIe的OSI模型与事务层分析(上)

作者:叫什么好呢啊 文章来源:根究FPGA微信公众号

本打算分析一下PCI与PCIe的结构体系,但是这样切入正题太慢了,我的打算是介绍完PCIe的OSI模型后,对各个层进行分析,然后直接分析应用实例,工作量有些大,有些地方十分担心总结的不好,再次请诸位大哥体谅!

PCIe的OSI模型与事务层概述
PCIe协议定义了三层结构,分别是:物理层、数据链路层、事务层,每个层次按照协议中规定的内容,完成相应的数据处理功能,各层都分为发送和接收两功能块。

在Xilinx芯片内部集成有PCIe硬核端点模块,能够自动完成数据链路层和物理层的数据处理,采用该方法时,用户只需要设计事务层的逻辑电路,完成事务层包(TLP)的处理即可。

事务层:产生TLP包(Transaction Layer Packet)

数据链路层:产生DLLP包(DataLink Layer Packet)。

物理层:产生PLP包(Physical Layer Packet)

接下来对事物层进行分析,从作用、格式、post与posted事务类型、路由方式,所涉及的知识点较多,暂定为分上中下三次完成,接下来的数据链路层和物理层相对来说较为简单。

因为事务层在FPGA应用中是需要用户设计参与的,所以掌握事务层的相关知识非常重要,请保持一点耐心,本系列的最后会分析几个PCIe工程应用。

PCIe事务层作用
事务层的作用是产生TLP包,接收PCIe设备核心层的数据请求,并将其转换为PCIe总线事务,PCIe总线使用的这些总线事务在TLP头中被定义,如存储器读写、IO读写、配置读写总线事务,并增加了Message总线事务(应用于中断模块)和原子操作等总线事务。

除此之外,事务层还支持流量控制、虚通路管理(VC映射,后面的传输优先级部分会将)等一些列特性,而PCI总线并不支持这些特性。

PCIe总线使用的数据报文首先在TL(事务层)中产生,这个数据报文也被称为事务层数据报文,即TLP。TLP经过数据链路层时被加上sequence number和CRC后缀,然后发向物理层。

需要特别注意的是!数据链路层还可以产生DLLP(Data Link LayerPacket),DLLP和TLP并没有直接关系。DLLP是产生于数据链路层,终止于数据链路层,并不会传递到事务层。DLLP不是TLP加上前缀和后缀形成的。

数据链路层的报文DLLP经过物理层时,需要经过8b/10b编码(参考之前推送),然后再进行发送,数据的接收过程是发送过程的逆过程,但是在具体实现上接收过程与发送过程并不是完全相同。

PCIe事务层格式
当处理器或其他的PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP,之后才能通过PCIe总线的各个层次发送出去。

一个完整的TLP由1个或多个TLP Prefix、TLP头、Data Payload和TLP Digest构成。其中TLP头是TLP最重要的标志,不同类型的TLP头的定义并不相同,TLP头包含了当前TLP的总线事务类型、路由信息等一系列信息,在一个TLP中,Data Payload的长度可变,最小为0,最大为1024(DW)。

TLP = 帧前缀 + 帧头 + 数据 + 摘要

帧前缀:TLP Prefix由PCIe V2.1 Spec总线规范引入,分为Local TLP Prefix和EP-EP TLP Prefix,主要目的是扩展TLP头,并以此支持PCIe V2.1规范的一些新功能。。

Loacl TLP Prefix:在PCIe链路的两侧传递信息

EP-EP TLP Prefix:在发送设备和接收设备之间传递信息。

帧头:为3DW或4DW,格式和内容随事务类型变化。

数据:TLP Digest Datapayload也是一个可选项,有些TLP并不需要Data Payload,如存储器读操作、配置和IO写完成操作并不需要Data Payload。

摘要Digest:是基于帧头、数据段计算出来的CRC(事务层和数据链路层使用的CRC校验公式还不一样,这点在介绍物理层时介绍),称为ECRC(Endpoint to endpoint CRC,端到端CRC)。是一个可选项,一个TLP是否需要TLP Digest由TLP头决定。一般Digest段由IP核填充,所以PCIe的处理在用户层表现为处理层TLP中的头标和数据段。

推荐阅读