资源描述
1. PCIE说明
PCIE协议定义了多种设备:根复合体(Root Complex),交换器(Switch),端点(Endpoingt),断就(Port),PCIE到PCI/PCI-X的桥(Bridge)等。根复合体是将CPU和主存储器连接到PCIE线路结构上的设备,能带包CPI启动PCIE事务和访问主存储器;交换器可以将任务由一个端口路由到另一个端口,在系统中用于多设备的互联,具体的路由方法包括ID路由,地址路由,隐含路由;Endpoint是指一个世纪的设备(请求者或完成者);port是设备与链路的接口;Bridge则是用来实现PCIE设备与PCI/PCI-X设备之间的连接,实现两种不同协议之间的相互转换。
PCIE核在多种模式中使用包来互换信息。包是在事务和数据链层中形成来从发送端到接收端的信息传递。必要的信息被添加到传输的包中。在接收结束,接收单元的每一层处理接收到的包,提取相关的信息并发送包到下一层。接收到的包是从他们物理层发送到数据链层和事务层的。
PCIe 规范对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都分为发送和接收两功能块。
PCIe的事务层是协议的最上层,其主要功能是根据应用层提供的信息生成相应的请求包传递给数据链路层,并且处理由数据链路层发来的包,将其转换成应用层能识别的信息,协助数据链路层完成信用管理,实现协议规定的配置事务,IO事务,存储事务和消息事务。
在设备的发送部分,首先根据来自设备核和应用程序的信息,在事务层形成事务层包(TLP),储存在发送缓冲器里,等待推向下层;在数据链路层,在TLP 包上再串接一些附加信息,这些信息是对方接收TLP 包时进行错误检查要用到的;在物理层,对TLP 包进行编码,占用链路中的可用通道,从查封发送器发送出去。
事务层包(TLP),数据链路层包(DLLP),物理层(PLP)产生于各自所在层,最后通过电或光等介质和另一方通讯。这其中数据链路层包(DLLP),物理层(PLP)的包平常不需要关心,在 IP核中封装好了。在 FPGA上做 PCIe的功能,变成完成事务层包(TLP)的处理。
待移动数据的PCI-Express协议的请求均由主CPU发出。
l 当CPU向存储器映射输入/输出(MMIO)地址存储器发出命令时,数据向下游移动。Root Complex通常会生成一个具有对应MMIO位置地址、字节使能和寄存器内容的存储器写TLP。Endpoint接收存储器写TLP更新响应的本地寄存器后事务即终止。
l 当CPU发出从MMIO地址加载寄存器的命令时,数据向上游移动。Root Complex通常会生成一个具有响应MMIO位置地址和字节使能的存储器读TLP。Endpoint在收到存储器读TLP后会生成带数据完成型TLP。完成包传送到Root Complex,有效载荷加载至目标寄存器后事务即完成。
2. PICE核接口
2.1系统接口
表1 系统信号
信号名
方向
定义
Sys_rst_n
Input
异步信号。sys_rst_n在上电和热复位操作期间,必须被断言至少1500ns
Sys_clk
Output
参考时钟:可选频率为100MHZ,125MHZ或者500MHZ
2.2 PCIE接口
PCIE接口由不同的发送(对)和接收(对)所构成的多线程组成。一个PCIE线由一对发送差分信号(pci_exp_txp, pci_exp_txn)和一对接收差分信号(pci_exp_rxp, pci_exp_rxn)组成。单线的只支持0线,双线只支持01线,四线支持0-3线,八线支持0-7线。下表2定义了4线核的发送和接收信号。(只给了一线的信号)
表2 PCIE接收和发送信号
线
信号名字
方向
定义
0
pci_exp_txp0
Output
PCIE发送正:串行差分输出
0
pci_exp_txn0
Output
PCIE发送负: 串行差分输出
0
pci_exp_rxp0
Input
PCIE接收正:串行差分输入
0
pci_exp_rxn0
Input
PCIE接收负:串行差分输入
1
pci_exp_txp1
Output
PCIE发送正:串行差分输出
1
pci_exp_txn1
Output
PCIE发送负: 串行差分输出
1
pci_exp_rxp1
Input
PCIE接收正:串行差分输入
1
pci_exp_rxn1
Input
PCIE接收负:串行差分输入
2
pci_exp_txp2
Output
PCIE发送正:串行差分输出
2
pci_exp_txn2
Output
PCIE发送负: 串行差分输出
2
pci_exp_rxp2
Input
PCIE接收正:串行差分输入
2
pci_exp_rxn2
Input
PCIE接收负:串行差分输入
3
pci_exp_txp3
Output
PCIE发送正:串行差分输出
3
pci_exp_txn3
Output
PCIE发送负: 串行差分输出
3
pci_exp_rxp3
Input
PCIE接收正:串行差分输入
3
pci_exp_rxn3
Input
PCIE接收负:串行差分输入
2.3 事务接口
事务接口为用户设计提供了一个机制来产生和消耗TLP。
2.4 发送接口
信号名
位宽
方向
描述
S_axis_tx_tlast
1
O
帧发送结尾:标记包的结尾,只有在S_axis_tx_tvalid申明时才有效。
S_axis_tx_tdata
64
O
发送的数据
S_axis_tkeep
8
O
传输数据选通,决定所给定拍子数据有效字节。数据在s_axis_tx_tvalid 和 s_axis_tx_tready都有效时才有效。
此信号的最低位决定数据低字节的有效性。
当last信号没有断言时,只有0xFF有效。
当last信号已断言时,只有0x0F和0xFF是有效的。
S_axis_tx_tvalid
1
O
数据有效信号,拉高表明发哦少年宫数据已准备好。
S_axis_tx_tready
1
I
置1表明核准备好接收数据。
S_axis_tx_tuser
[3]
O
传输停止。可以在开始传输后的任意时间断言。
S_axis_tx_tuser
[2]
O
传输流。表明一个包在连续时钟周期上被提供并且在链路上能在确认的包写入核之前开始传输。
S_axis_tx_tuser
[1]
O
此信号标志当前进程中的包是错误的。此信号能在开始到结束传输的任意时刻被拉高。但是tx_err_fwd信号必须在s_axis_tx_tuser[2]断言时拉低。
S_axis_tx_tuser
[0]
O
端对端循环冗余检查摘要被附加。必须在TLP的开始时就被断言。
Tx_buf_av
6
I
发送buffer可用:表明核中空闲发送buffer的数量。每个空闲的传输buffer能够调节TLP来支持最大负载size。发送buffer的最大数量由支持的MPS和所选的块RAM配置决定。
Tx_err_drop
1
I
传输错误。表明核因为长度不匹配或者流传的时候数据在连续时钟周期上没有提供而丢弃了一个包。
Tx_cfg_req
1
I
发送配置请求。当核准备好发送一个配置或者其他内部生成的TLP时置1.
Tx_cfg_gnt
1
O
1.同意传输配置。是配置请求的响应。允许核传输一个内部产生的TLP。
2.tx_cfg_req信号子在核生成的包已被服务,在任何请求生成之前总算解除断言的。因此,用户设计能够根据tx_cfg_req的上升沿来决定什么时候断言tx_cfg_gnt。
3.在tx_cfg_req给定要传输的用户创建的TLP相对于核生成的TLP更高的优先级之后保持tx_cfg_gnt为非断言状态。
4.在断言tx_cfg_gnt一个时钟州后当tx_cfg_erq断言导致下一个要输出的包为核内部生成的包时拉高tx_cfg_gnt一个时钟周期。
5.当没有buffer空间来存储内部包时,tx_cfg_req甚至在tx_cfg_gnt已经断言后保持断言状态。
6.设计需要再次断言tx_cfg_gnt信号,因为最初的断言已经被捕捉到。
7.如果不想改变内部生成TLP传输的优先次序,保持此信号为高。
2.5 接收接口
信号名
位宽
方向
描述
m_axis_rx_tlast
1
I
接收帧结尾:包结尾信号。在tvalid断言时才有效。
m_axis_rx_tdata
64
I
接收的数据
m_axis_rx_tkeep
8
I
接收数据选通
决定接收数据的有效字节。
m_axis_rx_tlast信号没有断言时,只有0xFF为有效值
m_axis_rx_tlast信号断言时,有效值为0x0F额0xFF
m_axis_rx_tvalid
1
I
接收数据有效。
m_axis_rx_tready
1
O
接收端准备好接收数据。
m_axis_rx_tuser
[9:2]
rx_bar_hit[7:0]
I
接收bar:表明当前接收事务的目标bar,从包的开头到m_axis_rx_tlast都保持断言。
• (rx_bar_hit[0])m_axis_rx_tuser[2]: BAR0
• (rx_bar_hit[1])m_axis_rx_tuser[3]: BAR1
• (rx_bar_hit[2])m_axis_rx_tuser[4]: BAR2
• (rx_bar_hit[3])m_axis_rx_tuser[5]: BAR3
• (rx_bar_hit[4])m_axis_rx_tuser[6]: BAR4
• (rx_bar_hit[5])m_axis_rx_tuser[7]: BAR5
• (rx_bar_hit[6])m_axis_rx_tuser[8]: Expansion ROM Address
• m_axis_rx_tuser[8:4] 不适用于 Root端口配置
• m_axis_rx_tuser[9] is reserved for future use.
m_axis_rx_tuser
[1]
I
接收有错误
m_axis_rx_tuser
[0]
I
表明当前包存在EREC无措。只有在包的帧结尾才会断言
3. PCIE设计参考
3.1 设计64位事务层接口
下图代表了典型的32位可寻址内存写请求TLP(Transaction Layer Specification)
图3-1 PCIE字节命令基础规范
PCIE标头各字段定义如下:
l Fmt[1:0] 定义了头标长度和该TLP是否有数据载荷的信息。
l Type[4:0] 与Fmt[1:0]共同定义了TLP的事务类型、头标长度和是否有数据载荷
l TC[2:0] (优先级设定)定义了设备核施加于请求TLP及完成TLP的传输类别编号。PCIE总线规定了8种传输类型,分别为TC0~TC7,默认值为TC0,该字段与PCIE的QoS相关。PCIE设备以传输类别(TC)、虚通道(VC)、TC/VC映射以及优先级仲裁机制为TLP传输提供有区别的服务质量。传输类别对应TLP头标中的3位TC字段,由软件根据TLP的紧要程度设置。虚通道是设备端曰中的TLP缓冲器,每个端口中可设置l~8个VC缓冲器,对应可编号为VC0~VC7,每个编号的VC中可以缓冲若干个TLP。PCIE设备内部有逻辑电路负责将不同TC的TLP到推入到对应编号VC中,每个TLP只能被映射到一个VC中,使通过该端口的TLP在对应编号的VC缓冲器中排队送上链路。
l TD TLP的Digest(ECRC)字段存在位。若TD=1,表明TLP含有Digest字段,其值是ECRC;若TD=0,则表明TLP不含有Digest字段。
l EP 错误和中毒位。EP=1,则表示事务正常完成,但是应该将包视为无效。
l Attr[2:0] 位5为宽松排序位:为1时,表示使用PCI-X式宽松排序;为0时,表明使用PCI式严格排序。位4为不监听Cache位:为1时,表明TLP不存在处理器Cache一致性问题,不要求系统硬件去监听处理器Cache;为0时,则要求PCI时的Cache监听。
l 长度Length[9:0] 指示TLP的数据载荷长度,以双字DW为单位,最大长度为1024双字,即4KB
l AT字段 AT字段与PCIE总线的地址转换相关。在一些PCIE设备中设置了ATC(Address Translation Cache)部件,这个部件的主要功能是进行地址转换。只有在支持IOMMU技术的处理器系统中,PCIE设备才能使用该字段。AT字段可以用作存储器域与PCI总线域之间的地址转换,但是设置这个地段的主要目的是为了方便多个虚拟主机共享同一个PCIE设备。(此处设置为0)
l Requester ID字段 :Requester ID用来标识事务的请求者,以便对应的完成能够返回,在Requester ID[15:0]中,[15:8]为总线号,[7:3]为设备号,[2:0]为功能
l Tag字段 :标签Tag字段用来用来标识由请求者发出的未完成的非转发事务的请求序号,以便相应的完成返回时带有与原请求相同的序号,请求者将事务包与相应挂起的请求对号,解除对应的挂起请求。
l First DW BE和Last DW BE为字节使能字段,连个字节是能位以允许比整双字小的数据长度和偏离DW边界的起止地址。
当使用AXI4-Stream接口时,包被安排在确定的64位数据通路上。下图展示了在AXI4-Stream接口上的包的例子。从图上可看到,包的第0字节就是s_axis_tx_tdata[31:24](发送)或者m_axis_rx_tdata[31:24] (接收)的对应位。同样,第1字节在s_axis_tx_tdata[23:16]或者m_axis_rx_tdata[23:16]所对应的位。在第二个64位数据组合时,就是PCIE的第8字节对应的s_axis_tx_tdata[31:24]或者m_axis_rx_tdata[31:24]所对应位。发送到核的包必须遵从TLP的传输规则。
图3-2 断点综合块字节
用户应用负责确认包的有效性。核不会去检查包的格式是否正确并且这样可能导致传输一个畸形的TLP。给定的TLP变化的精确度依赖于正在传输的包的类型。
Fmt和Type字段确认当前TLP使用的总线事务,TLP头的大小是由3个双字还是4个双字组成(32位地址为3DW,64位地址则对应4DW),当前TLP是否包含有效负载。其具体含义如下表所示。
表3.1 TLP类型字段定义
Fmt[2:0]
TLP的格式
0b000
TLP大小为3个双字,不带数据。
0b001
TLP大小为4个双字,不带数据。
0b010
TLP大小为3个双字,带数据。
0b011
TLP大小为4个双字,带数据。
0b100
TLP Prefix
其他
PCIe总线保留
其中所有读请求TLP都不带数据,而写请求TLP带数据,而其他TLP可能带数据也可能不带数据,如完成报文可能含有数据,也可能仅含有完成标志而并不携带数据。在TLP的Type字段中存放TLP的类型,即PCIe总线支持的总线事务。该字段共由5位组成,其含义如下表所示。
表3-2 PCIE总线事务类型
TLP类型
Fmt[2:0]
Type[4:0]
描述
MRd
存储器读请求
0b000
0b001
0b0 0000
3DW,不带数据
4DW,不带数据
MRdLk
带锁的存储器读请求
0b000
0b001
0b0 0001
3DW,不带数据
4DW,不带数据
MWr
存储器写请求
0b010
0b011
0b0 0000
3DW,带数据
4DW,带数据
IORd
IO读请求
0b000
0b0 0010
3DW,不带数据
IOWr
IO写请求
0b010
0b0 0010
3DW,带数据
CfgRd0
配置0读请求
0b000
0b0 0100
3DW,不带数据
CfgWr0
配置0写请求
0b010
0b0 0100
3DW,带数据
CfgRd1
配置1读请求
0b000
0b0 0101
3DW,不带数据。
CfgWr1
配置1写请求
0b010
0b0 0101
3DW,带数据
TCfgRd
0b010
0b1 1011
对这两种总线事务不做介绍。
TCfgWr
0b001
0b1 1011
Msg
消息请求
0b001
0b1 0r2r1r0
4DW,不带数据。
“rrr”字段是消息请求报文的Route字段,下文将详细介绍该字段。
MsgD
带数据的消息请求
0b011
0b1 0r2r1r0
4DW,带数据
Cpl
完成
0b000
0b0 1010
3DW,不带数据。
包括存储器、配置和I/O写完成。
CplD
带数据的完成
0b010
0b0 1010
3DW双字,包括存储器读、I/O读、配置读和原子操作读完成。
CplLk
锁定的完成
0b000
0b0 1011
3DW,不带数据。
CplDLk
带数据的锁定完成
0b010
0b0 1011
3DW,带数据。
由上表所示,存储器读和写请求,IO读和写请求,及配置读和写请求的type字段相同,如存储器读和写请求的Type字段都为0b0 0000。此时PCIe总线规范使用Fmt字段区分读写请求,当Fmt字段是“带数据”的报文,一定是“写报文”;当Fmt字段是“不带数据”的报文,一定是“读报文”。
PCIe总线规定所有Non-Posted存储器请求使用Split总线方式进行数据传递。当PCIe设备进行存储器读、I/O读写或者配置读写请求时,首先向目标设备发送数据读写请求TLP,当目标设备收到这些读写请求TLP后,将数据和完成信息通过完成报文(Cpl或者CplD)发送给源设备。
其中存储器读、I/O读和配置读需要使用CplD报文,因为目标设备需要将数据传递给源设备;而I/O写和配置写需要使用Cpl报文,因为目标设备不需要将任何数据传递给源设备,但是需要通知源设备,写操作已经完成,数据已经成功地传递给目标设备。
在PCIe总线中,进行存储器或者I/O写操作时,数据与数据包头一起传递;而进行存储器或者I/O读操作时,源设备首先向目标设备发送读请求TLP,而目标设备在准备好数据后,向源设备发出完成报文。
PCIe总线规范还定义了MRdLk报文,该报文的主要作用是与PCI总线的锁操作相兼容,但是PCIe总线规范并不建议用户使用这种功能,因为使用这种功能将极大影响PCIe总线的数据传送效率。
与PCI总线并不相同,PCIe总线规范定义了Msg报文,即消息报文。分别为Msg和MsgD,这两种报文的区别在于一个报文可以传递数据,一个不能传递数据。
PCIe总线支持四种事务——配置事务,IO事务,存储事务和消息事务,如表3-3所示。PCIe设备使用路由的方式来实现事务认领,路由方式基于事务类型,系统存储器和IO地址分配等因素。路由方式分为三种,分别是地址路由,ID路由和隐含路由。存储事务和IO事务仅使用地址路由方式,配置事务和完成使用ID路由方式,消息事务可以使用任何一种路由方式,每种事务所对应的具体路由方式如表3-4所示。
表3-3 PCIE地址空间和事务类型
地址空间
事务类型
用途
存储器
读写
传送数据自/至系统存储器空间的单元
IO
读写
传送数据自/至系统IO空间的单元
配置
读写
传送数据自/至PCI兼容的设备配置空间的单元
消息
底线/厂商定义
通常用于带内的消息传递和时间报告
表3-4 PCIE TLP的路由选择
TLP类型
使用的路由方法
MRd、MRdlk、MWr
地址路由
IDRd、IOWr
地址路由
CfgRd0,CfgRd1、CfgWr0、CfgWr1
ID路由
Msg、MsgD
地址路由,ID路由或隐含路由
Cpld
ID路由
3.2 事务层关键技术
3.2.1 事务层发送部分
事务层接收Device Core的信息,产生相应的事务层包(TLP),存放在虚拟通道中的VC缓冲器里等待发送。TLP的主要组成是:头标,数据载荷和可选的ECRC。事务层包中包含数据类型,数据长度和路由方式等信息。
3.2.2 事务层接收部分
事务层接发来的事务层包,存放在接收VC缓冲器里。接收端检查ECRC字段,确定事务层包在通过线路结构的过程中是否发生错误,若无错误,ECRC字段被剥除,剩下的TLP头标信息及数据载荷被送到设备核。
3.2.3 流量控制
在PCI中,当接收方没有足够的空间接收发送方发出的事务时,会以切断信号来阻止事务发送,然后每隔一段时间后会自动重发,直到发送成功。但是往往这个间隔时间并不能使接收方有足够的空间来接收上次被阻止的事务,不断的重试造成了资源的浪费[13]。在PCIe中,接收方会以信用的方式定期向发送方报告自己接收缓冲中的剩余空间,以此来保证没有不能被接收的事务发出,从而提高了总线效率。流控过程如图3-3所示:
图3-3 流控制过程
3.2.4 服务质量,传输类别和虚拟通道
PCIe提供QoS,即以有区别的优先级和确定的等待时间及带宽运输来自不同应用的包。PCIe所提供的服务质量与传输类别(TC)和虚拟通道(VC)密切相关。
PCIe设备以传输类别(TC),虚通道(VC),TC/VC映射以及优先级仲裁来支持服务质量(QoS)。
从传输要求的角度来看,PCI Express事务可分为等时事务和异步事务。等时事务要求在每个相等的,固定的时间间隔里保证固定的数量传送;异步事务是除等时事务以外的其它事务。无论是哪种事务,从系统的角度来看,就是有不同的优先级,各类事务以一个TC(Traffic Class)值表达所想要得到的QoS(Quality of Service),PCIe配置软件能够建立起传输类别的值与设备端口虚拟通道(VC)之间的映射关系。
理论上等时事务所对应的VC应被配置为最高优先级,等时事务的请求者,完成者及中间路过设备都应该将TC所映射的VC配置为最高优先级。等时事务的请求者以所要求的速率(服务间隔)将等时包注入线路结构,沿路的中间设备将具有该TC的等时包投入对应的VC,以接受仲裁,仲裁的结果是等时事务得到所想要的带宽和等待时间。
虚拟通道的主体是缓冲器,位于设备端口处的事务层内,虚通道数可配置,最多支持8个(VC0—VC7)。VC0为默认虚通道,VC1~VC7可配置。规范要求下列事务只使用TC0/VC0——配置事务,IO事务,INTx消息事务,电源管理消息事务,错误报告消息事务,解锁消息事务,设置插槽电源限额消息事务。
端口VC的配置,事务TC值到端口VC的映射以及端口仲裁和VC仲裁都由VC配置寄存器实现,这些VC配置寄存器组成虚通道能力寄存器组,位于设备的扩展配置空间内,有系统软件对他们进行设置。每三个资源寄存器为一组,服务于不同的虚通道。
3.2.5 端口仲裁和VC仲裁
不同TC号的包通过交换开关时,从多个入端口进来的,涌向同一个出端口的包,竞争该出端口的使用权,交换开关对该出端口执行两方面的仲裁:端口仲裁和VC仲裁。端口仲裁是对在不同入端口上到达的都映射到公共出端口的同一虚通道上的包进行仲裁;VC仲裁发生在端口仲裁之后,对已经进入不同VC的,要从同一端口发送到连路上的包进行仲裁。
端口仲裁方法分为硬件固定仲裁方式和加权轮转仲裁方式。VC仲裁方法有以下三种:
a) 对所有VC执行严格优先序仲裁;
b) 分组是优先序仲裁;
c) 对所有VC执行轮转优先序仲裁(均等轮转仲裁和加权的轮转仲裁)。
3.2.6 事务排序
PCIe中的事务分为三种,转发事务,非转发事务和完成。针对每个事务都有其独立的缓存空间,因此不同类型的事务间没有排序的问题。但是同种类型的事务会严格按照先后顺序执行,有时候急需的事务会因为先前事务未完成而被阻塞,对于映射到统一VC中的事务,宽松事务排序位为1的事务被允许可以插到宽松式无排序位为0的同类事务前执行。
3.2.7 电源管理
事务层支持电源管理。事务层中的硬件在某种情况下能自主的将设备置入低功耗电源状态,这种自动的电源管理不涉及软件,被称为主动的电源管理。
3.2.8 配置寄存器
设备的配置寄存器是与事务层联系在一起的,在初始化和总线枚举期间,配置软件对这些寄存器的进行配置,然后,由运行期软件/OS使用核访问。
3.3 outbound传输包
3.3.1 基础TLP传输操作
7系列FPGA集成块的PCIE核会自动传输这些类型的包。
l 完成一个远程设备响应配置空间的请求
l 核的inbound请求的错误消息响应是畸形或者不被认可的
Note:某些未被认可的请求,例如:意想不到的完成,只能被负责生成合适响应的用户应用侧被检测到。
用户应用程序负责这些类型的outbound包类型:
l 内存,Atomic Ops,和远程设备的I/O请求
l 完成对用户应用程序请求进行响应。例如:内存读请求。
l 在允许的情况下,完成对用户执行配置空间请求的应答。这些请求包括PCI™ 遗留功能寄存器寄存器侧的地址BFh和PCIE扩展功能寄存器侧的地址1FFh。
当配置为断点时,核关注用户应用程序的内部生成的通过断言tx_cfg_req来调节传输数据通路的TLP。用户应用程序能够通过始终置高tx_cfg_gnt信号来选择给定核生成的TLP的优先级。以此来防止在核生成的TLP等待时,传输了用户应用程序生成的TLP。或者用户应用程序能够通过拉低tx_cfg_gnt直到用户传输完成来保留生成的TLP的优先级从而越过核生成的TLP而。当用户传输完成时,用户应用程序能够断言tx_cfg_gnt信号至少一个时钟周期来允许传输核生成的TLP。断言tx_cfg_gnt信号的时候不能延迟,因为延迟的话可能导致请求方完成超时。
为了传输一个TLP,用户应用程序必须在传输事务接口上执行这一系列的事务:
1.用户应用程序逻辑断言s_axis_tx_tvalid并且在s_axis_tx_tdata[63:0]信号上附上第一个TLP QWORD。如果核断言s_axis_tx_tready,那么这个QWORD就会被立马接收。否则,用户应用程序必须保持QWORD不变直到核断言s_axis_tx_tready。
2.用户应用程序断言s_axis_tx_tvalid并且在随后的时钟周期中在s_axis_tx_tdata[63:0]信号上附上剩余的TLP QWORDS。(s_axis_tx_tready有效的情况下)
3.用户应用程序在传输最后的QWORD数据时,同时断言s_axis_tx_tvalid和s_axis_tx_tlast信号。如果所有的最后传输8个数据字节是有效的,并且s_axis_tx_tkeep信号被驱动为0xFF。否则,s_axis_tx_tkeep信号被驱动为0xFF,则s_axis_tx_tdata[31:0]信号的4个字节数据被有效传输。
4.在成功传输s_axis_tx_tdata[63:0]数据有效的下个时钟周期,用户应用程序驱动s_axis_tx_tvalid为低。
下图显示了不传输数据的只有3个DWORD的TLP包头。32位可寻址内存读请求。当用户断言s_axis_tx_tlast信号时,同时将s_axis_tx_tkeep的值设为0x0F,表明s_axis_tx_tdata只有低32位数据为有效数据。
图3-3 3个DWORD的TLP头传输
下图显示了不传输数据的有4个DWORD的TLP包头。32位可寻址内存读请求。当用户断言s_axis_tx_tlast信号时,同时将s_axis_tx_tkeep的值设为0xFF,表明s_axis_tx_tdata信号的64数据都有效数据。
图3-4 4个DWORD的TLP头传输
下图显示了一个带有数据的3个DWORD的TLP事务传输。此图keep信号最终为0xFF,表明64位数据都有效。(如果以32位数据为一个单位,就是奇数个单位。)
图3-5 3个DWORD的TLP事务传输
下图显示了一个带有数据的4个DWORD的TLP事务传输。此图keep信号最终为0x0F,表明低32位数据有效。(如果以32位数据为一个单位,就是4DWORD带有奇数个单位。)
图3-6 3个DWORD的TLP事务传输
下图显示了拼接形式的事务传输。从图可看出,传输了两个TLP事务,当第一个事务传输完成并且last断言时,valid保持高,继续传输第二个TLP事务,知道2个事务都传输完成。
图3-7 传输接口上的对头拼接事务
当用户应用程序在某个时钟周期上没有数据需要传输时,保持valid为低。如下图:
图3-8 无连续数据传输
PCIE核的buffer如果没有空间剩余来接收一个新的TLP时,就会遏制用户的传输。而这只会在链路处理输入数据的速度与用户端相同或者比用户端更低时才会出现。如下图:
图3-9 不可连续接收数据
如果核传输AXI4流接口通过置高s_axis_tx_ready信号,确认接收了TLP事务的包头,则就保证有足够的空间来接收PCIE设备能力寄存器中定义的最大数据负载所对应的数据量。
当核接收了TLP的第一个64位时,就一定会将此TLP事务接收完。当然事务的数据大小不能超过PCIE的最大数据大小。核的接口只有在一下情况时会驱动s_axis_tx_tready信号为低:
l 核没有足够用的buffer
l 当核正在传输一个内部生成的TLP,在用户应用程序通过置高tx_cfg_gnt来充分利用传输数据通道以后。在传输内部生成的TLP后,核紧随的置高s_axis_tx_tready信号。
l 当电源管理控制状态寄存器的电源状态域的PCI管理能力结构变为一个non-D0状态时。当这种情况出现时,任何待传的TLP被完全接收,并且s_axis_tx_tready随之拉低,不允许用户应用程序继续发送一个新的事务。
当核将s_axis_tx_tready置0后,用户应用程序的所有控制和数据信号保持到s_axis_tx_tready置1为止。
用户终止传输
用户应用程序可以通过将s_axis_tx_tuser[3] (tx_src_dsc) 置1来终止事务的传输。当然,此情况必须要在valid和ready都有效的情况下,才会终止。在新的包传输的开始tx_src_dsc信号必须为0。tx_src_dsc信号可以在包传输的第一个拍子被接收以后的任何周期上被拉高(包括last信号有效时)。终止传输不会影响数据被接收,只会终止下一个数据被传输。
如果流模式没有使用,s_axis_tx_tuser[2] = 0b(tx_str),并且包被终止,然后包会在串行链路上继续传输数据之前被丢弃。如果流模式被使用,那么包终止的同时串行链路上会有EDB标志。
图3-10 源驱动发送接口终止传输
目的端丢弃事务
核传输AXI4-Stream接口丢弃TLP的三个原因:
l PCIE链路连接失败
l 改变PCIE设备性能寄存器的值,从而改变TLP的最大负载大小。不能违反设备控制寄存器的最大数据负载大小。
s_axis_tx_tuser[2](tx_str)被拉高并且数据在时钟周期上不连贯,就是valid信号在TLP传输的过程中被拉低。
下图给定一个TLP事务被丢弃的时序图:
图3-11 目的传输接口丢弃事务
用户可以通过保持s_axis_tx_user[2]为高来使能传输TLP的Streaming模式。在传输TLP期间,用户必须保持valid为高。如果在一个TLP传输中间valid被拉低,会导致真个TLP被丢弃。如下图:
图3-12 streaming模式传输
用户可以在一个TLP传输的开始将s_axis_tx_tuser[0](tx_ecrc_gen)信号拉高一个有效周期,来使能ECRC generation,从而让输出的TLP有一个digest。在包允许插入一个digest后,这个包传输结束后,ready信号会被拉低一个时钟周期。如下图:
图13 生成EREC
3.4 inbound接收包
3.4.1 基础TLP接收操作
1. 当用户应用程序准备好接收数据时,置高m_axis_rx_tready信号
2. 当核准备好传输数据时,核会将m_axis_rx_tvalid信号拉高并且将数据准备好。
3. 核保持m_axis_rx_valid为高时,并且将TLP QWORD在随后的时钟周期附上数据线。
4. 核将valid和last拉高,并且将最后的QWORD附上数据线。0xFF对应64位有效,0x0F对应32位有效。
5. 如果在下个时钟周期没有可用的TLP,核会将valid信号在传输最后一个数据后拉低。
用户只需根据valid来驱动ready是否拉高,其他data,keep,last等信号都不会关心。valid信号永远不会再包传输的中间被拉低。
4. PCIE核生成参数配置
4.1 基本参数配置
(1) Component Name
核名称
(2) PCIE Device /Port Type
选择PCIE逻辑设备类型
(3) PCIe Block Location
从可用的集成块中选择块来产生本地特定的约束文件和引脚。
当Xilinx Development Board已选时,此选项无效
(4) Xilinx Development Board
选择Xilinx Development Board来产生Xilinx Development Board特定约束文件。
(5) Silicon Revision
选择硅版本。可用选择为Initial_ES和GES_and_Produciton
(6) Number of Lanes
链路数量。
(7) Maximum Link Speed
最大链路速度。
Lane Width
Link speed
X1
2.5 Gb/s, 5 Gb/s
X2
2.5 Gb/s, 5 Gb/s
X4
2.5 Gb/s, 5 Gb/s
X8
2.5 Gb/s, 5 Gb/s
(8) AXI Interface Frequency
AXI接口频率。
1lane
2.5 Gb/s
64 bit
62.5 MHZ
125 250 MHZ
1lane
5
64
62.5
125 250
2lane
2.5
64
62.5
125 250
2lane
5
64
125
250
4lane
2.5
64
125
250
4lane
5
64
250
-
4lane
5
128
125
-
8lane
2.5
64
250
-
8lane
2.5
128
125
-
8lane
5
128
250
-
(9) Reference Clock Frequency
(10) Additional Transc
展开阅读全文