1. PCIe基础知识
PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准。由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。
PCIe 规范对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都分为发送和接收两功能块。
发送端:应用程序(设备核A)在事务层形成事务层包(TLP——Transaction Layer Package),储存在发送缓冲器里,等待推向下层。在数据链路层,在TLP 包上再串接一些附加信息,这些信息是对方接收TLP 包时进行错误检查要用到的,形成数据链路层包(DLLP——Data Link Layer Package);在物理层,对DLLP 包进行编码,占用链路中的可用通道,从发送器发送出去。
接收端:实际上是发送端的“逆”过程。如果说发送端是在不断组包,那么接收端就是不断的拆包,最后提取出有用的数据信息供B设备的应用程序使用。
整个过程实际上和以太网的过程很相似,都是在不同层级上进行数据的扩展。在FPGA的开发过程中,实际上从事务层到物理层都是封装好了的,组成标准IP核,因此重点点完成事务层度数据解析与组装,即TLP包。用户通过IP核要求的总线协议(如AXI4-Stream)与之进行数据交换。
2. 事务层协议
2.1 数据包结构
有了IP核之后,实际上我们最关心的就是事务层包的数据格式。
事务层数据包(TLP)主要由:一个或多个可选的前缀(TLP Prefixes)、一个帧头(TLP Header)、一个数据有效负载(Data Payload)和一个可选的摘要(TLP Dignest)组成,下面简单介绍一下各部分。
TLP Prefixes:前缀;有PCIe V2.1总规范引入,主要起扩展帧头的作用。如果用不到,可以省去该字段。
TLP Header:帧头;TLP Header是TLP中最重要的标志,不同的TLP其头的定义并不相同。TLP 头标长3 或者4 个DW(DW = double word——双字,32位),格式和内容随事物类型变化。
Data Payload:数据有效负载;即主设备要传输的数据。数据的长度最小为0,最大为1024DW,视具体情况而定。该字段也是一个可选项,因为有些TLP并不需要传递数据,如存储器读请求、配置和I/O写完成TLP也不需要。
TLP Dignest:摘要是一个可选项,长度为1DW。一个TLP是否需要Dignes是由Header中TD字段决定。如果接受设备支持ECRC校验的功能的话,则该字段用来防止TLP中的数据校验码ECRC。
2.2 TLP包头解析
TLP Header长3 DW或者4 DW,格式和内容随事务类型的不同而不同。但是对于所有TLP Header来讲,都拥有相同的第一个DW定义,如下图所示(R:Reserved,为0)。
fmt[31:29]:Fmt是关于头标长度和该TLP是否有数据(字段)的信息,如下图所示。实际上是3 DW还是4 DW是根据要访问目标的地址位宽有关
Type([28:24]:Type的5位编码与Fmt字段一起用于规定事务类型、头标长度和是否有数据负载,如下图所示,介绍了最主要的三种模式。MEM,IO,配置;
TC[22:20]:Traffic Class,传输类型也代表优先级,优先级高的先得到服务。这里是3比特,说明可以分为8个等级,0-7,TC默认是0,数字越大,优先级越高。
Attr[18]、[13:12]:该字段表述TLP的属性,由3位组成,注意不是连续的。具体含义见规范。
TH[16]:位为 1 表示当前 TLP 中含有 TPH(TLP Processing Hint)信息,TPH 是 PCIe V2.1 总线规范引入的一个重要功能。TLP 的发送端可以使用 TPH 信息,通知接收端即将访问数据的特性,以便接收端合理地预读和管理数据。
TD[15]:表示 TLP 中的 TLP Digest(之前说ECRC可选)是否有效,如果这个这个bit置起来,说明该TLP包含ECRC,接收端应该做CRC校验;
EP[14]:表示当前 TLP 中的数据是否有效,为 1 表示无效,为 0 表示有效。
AT[11:10]:Address Type,地址种类,与 PCIe 总线的地址转换相关,可暂时不考虑。
Length[9:0]:用来描述 TLP 的有效负载(Data Payload)大小。PCIe 总线设置 Length 字段的目的是提高总线的传送效率。Length 字段以 DW 为单位,其最小单位为 1 个 DW。
3 xilinx PCIE核
3.1 PCIE核架构
3.2 端口介绍
(1)通用接口
user_clk_out: 用户时钟输出;时钟频率如下:
user_reset_out :用户同步复位输出;
user_lnk_up : PCIE link up状态输出;
fc_ph[7:0] : Posted Header 统计输出
fc_pd[11:0] :Posted Data 统计输出
fc_nph[7:0] :Non-Posted Header统计输出
fc_npd[11:0]:Non-Posted Data统计输出
fc_cplh[7:0]:Completion Header统计输出
fc_cpld[11:0]:Completion Data统计输出
fc_sel[2:0] :选择输入;
(2)数据传输端口
发送数据和接收数据都按AXIS传输;
s_axis_tx_* : AXI数据发送接口信号
s_axis_rx_* : AXI数据发送接口信号
(3)物理层接口:见pg054 22页
(4)配置接口:见pg054 26页
(5)中断相关信号:见pg054 32页
3.3 IP配置
后面补充。