基于64位事务层接口的AXI4-Stream接口设计主要涉及信号定义、数据传输规则以及接口行为等方面。
本文为7 Series FPGAs Integrated Block for PCI Express IP核中基于64位事务层接口的AXI4-Stream接口设计(一)一文后续。
4 Source Throttling on the Transmit Datapath(在数据传输路径中的源节流)
源节流在数据传输路径中是一个重要的机制,它允许在用户应用没有数据可供传输时减少数据传输的速率或暂时停止数据传输。
源节流机制的工作流程:
当用户应用没有数据可供传输时,它会在相应的时钟周期内将s_axis_tx_tvalid
置为低。AXI4-Stream接口检测到s_axis_tx_tvalid
为低后,会忽略s_axis_tx_tdata[63:0]
上的数据,不进行任何处理或传输。当用户应用准备好传输新的数据时,它会再次将s_axis_tx_tvalid
置为高,并将数据放在s_axis_tx_tdata[63:0]
上。AXI4-Stream接口检测到s_axis_tx_tvalid
为高后,会开始接收和处理s_axis_tx_tdata[63:0]
上的数据。
图3-8展示了源节流机制的工作原理。在该图中,可以看到s_axis_tx_tvalid
信号在何时被置为高或低,以及这如何影响AXI4-Stream接口对s_axis_tx_tdata[63:0]
上数据的处理。
4 Destination Throttling of the Transmit Datapath
用于在AXI4-Stream接口的传输数据路径上控制用户应用的发送速率。当AXI4-Stream接口的内部传输缓冲区没有空间容纳新的TLP时,它会通过特定的信号通知用户应用降低发送速率。
信号机制:
s_axis_tx_tready
信号用于指示AXI4-Stream接口是否准备好接收新的TLP。- 当AXI4-Stream接口的内部传输缓冲区满时,它会将
s_axis_tx_tready
信号置为低(deasserted),通知用户应用停止发送新的TLP。
节流操作:
- AXI4-Stream接口会在当前数据包传输完成后开始节流用户应用。
- 如果在当前数据包传输完成后立即开始传输另一个数据包,节流操作会在
tlast
信号之后立即进行。
图3-9展示了当IP核传输 AXI4-Stream接口的内部传输缓冲区满时,通过置低s_axis_tx_tready
信号来节流用户应用的场景。
当IP核传输AXI4-Stream接口通过断言s_axis_tx_tready
信号来接受一个TLP(Transaction Layer Packet,事务层数据包)的开始时,它保证会接受整个TLP,只要这个TLP的大小不超过PCIe设备能力寄存器(偏移地址04H)中的Max_Payload_Size
字段所指定的值。
s_axis_tx_tready信号的去断言的情况:
- 当IP核没有足够的缓冲区(因为来自链路伙伴的信用不足导致数据包未被排空)时;
- 当IP核正在传输一个内部生成的TLP(如由于配置读写、错误消息TLP或用户应用程序在
cfg_err
接口上请求的错误响应而生成的完成TLP)时,并且在用户应用程序通过断言tx_cfg_gnt
信号授予其使用传输数据路径的权限后,AXI4-Stream接口也会去断言s_axis_tx_tready
信号。IP核在传输完内部生成的TLP后会重新断言s_axis_tx_tready
信号。 - 当PCI电源管理功能结构中的电源管理控制/状态寄存器(偏移地址0x4)中的电源状态字段更改为非D0状态时,AXI4-Stream接口也会去断言
s_axis_tx_tready
信号。在这种情况下,任何正在进行的TLP都会被完全接受,然后s_axis_tx_tready
信号会被去断言,禁止用户应用程序在核心处于非D0电源状态时发起任何新的事务。
当IP核去断言s_axis_tx_tready
信号时,用户应用程序需要保持所有的控制和数据信号不变,直到IP核重新断言s_axis_tx_tready
信号。这是为了确保在核心准备好接收新的TLP之前,用户应用程序不会尝试发送任何数据。
5 Discontinuing Transmission of Transaction by Source
在IP核传输AXI4-Stream接口中,用户应用程序如何通过特定的用户信号(s_axis_tx_tuser[3]
,标记为tx_src_dsc
)来终止一个正在传输的TLP(Transaction Layer Packet,事务层数据包)?以下是对这段描述的详细解释:
-
s_axis_tx_tuser[3]
(或标记为tx_src_dsc
)允许用户应用程序通过断言这个信号来终止一个正在传输的TLP。为了成功终止TLP的传输,s_axis_tx_tvalid
、s_axis_tx_tready
和tx_src_dsc
这三个信号必须同时被断言。 -
tx_src_dsc
信号不能在新数据包开始的地方被断言。它可以在IP核接受新数据包的第一拍之后的任何时钟周期上被断言,直到并包括s_axis_tx_tlast
被断言的时钟周期。如果传输接口上没有TLP事务正在进行,断言src_dsc
将不会产生任何效果。
图3-10展示了用户应用程序如何使用tx_src_dsc
来终止一个数据包。断言src_dsc
与s_axis_tx_tlast
一起是可选的,但如果你选择这样做,它必须在s_axis_tx_tlast
之前或与其同时被断言。
-
如果不使用流模式(streaming mode),即
s_axis_tx_tuser[2]
(或标记为tx_str
)等于0b,并且数据包被中断,则该数据包在串行链路上传输之前会被丢弃。 -
如果使用流模式(
tx_str = 1b
),则在串行链路上,数据包会以EDB(End of Data Block,数据块结束)符号终止。这意味着数据包不会被完全传输,而是在到达数据块结束时通过EDB符号来指示数据包的结束。
6 Discarding of Transaction by Destination
IP核传输AXI4-Stream接口在以下三种情况下会丢弃TLP:
- PCI Express链路故障:
如果PCI Express链路出现故障或断开,正在传输的TLP将被丢弃。
- 违反Max_Payload_Size限制:
如果提交的TLP的大小超过了PCI Express设备能力寄存器(偏移地址04H)中的Max_Payload_Size
字段所指定的值,该TLP将被丢弃。
- 流模式(Streaming Mode)下的不连续数据:
如果在流模式(s_axis_tx_tuser[2](tx_str)
被断言)下,数据没有在连续的时钟周期上呈现,即s_axis_tx_tvalid
在TLP传输过程中被去断言,那么当前的TLP将被丢弃。
当上述任何一种情况发生时,传输AXI4-Stream接口将继续接收剩余部分的已提交TLP,并在被丢弃的TLP的s_axis_tx_tlast
之后的第二个时钟周期或之前断言tx_err_drop
信号。这个信号用于通知用户应用程序一个TLP已被丢弃。
图3-11展示了IP核如何通过tx_err_drop
信号来指示一个数据包已被丢弃。开发者应该根据这个信号来采取相应的错误处理措施。
7 Packet Data Poisoning on the Transmit AXI4-Stream Interface
这里说明了用户应用程序如何标记传输的TLP的数据载荷为“中毒”状态,通常表示数据已损坏或无效。以下是两种标记方法:
- 在TLP头中设置EP位:
如果在AXI4-Stream接口上向IP核呈现TLP头的第一个DWORD时已知数据载荷是“中毒”的,则可以在TLP头中设置EP(Error Pointer)位为1。这将指示接收端TLP的数据载荷是无效的。
- 断言s_axis_tx_tuser1:
在数据包传输过程中的任何时刻,对于至少一个有效的数据传输周期,用户应用程序可以断言s_axis_tx_tuser[1](tx_err_fwd),如下图所示
。这将导致IP核在将数据包传输到PCI Express fabric时,在TLP头中设置EP位为1。这种方法适用于用户应用程序在数据包传输开始时不知道数据包是否可能“中毒”的情况。
需要注意的是,当s_axis_tx_tuser[2](tx_str)
(流模式传输数据包)被断言时,不支持使用tx_err_fwd
。在流模式下,如果数据包变得损坏,你可以选择中断数据包的传输。
另外,如果正在使用ECRC(End-to-End CRC,端到端循环冗余校验),那么用户应用程序不应该通过设置TLP的EP位来转发错误。相反,应该通过断言src_dsc(s_axis_tx_tuser[3])
块输入来废弃有错误的TLP,并使用cfg_err
接口报告错误。这样可以在数据包被发送到PCI Express fabric之前,在发送端就处理掉有问题的数据包,从而避免在接收端造成不必要的麻烦。
8 Streaming Mode for Transactions on the Transmit Interface
该功能允许用户应用在某些情况下启用流(Streaming或cut-through)模式来传输TLP,以减少操作的延迟。
当可能时,为了减少操作延迟,用户应用可以启用流模式来传输TLP。 在流模式下,TLP在PCIe链路上的传输延迟会减少,因为它允许数据包在接收到完整的TLP之前就开始转发。
为了启用流模式,用户应用必须在整个传输的TLP期间保持`s_axis_tx_tuser[2](tx_str)`断言(即设置为高电平或逻辑真)。 `s_axis_tx_tuser[2]`是一个用户定义的信号,用于传输额外的信息给PCIe核心。在这里,它被用来指示是否启用流模式。
用户应用还必须在每个时钟周期上呈现有效的帧,直到TLP的最后一个周期。这意味着用户应用在整个呈现的TLP期间,不应取消断言`s_axis_tx_tvalid`(即应持续保持高电平或逻辑真)。
如果在流模式操作中发生源节流(即源端不能提供足够的数据来满足PCIe链路的带宽需求),则该事务将被丢弃。当这种情况发生时,`tx_err_drop`会被断言(即设置为高电平或逻辑真),并且会在PCIe链路上发出一个被无效的TLP(即一个标记为错误的TLP)。
图3-13展示了流模式操作的示例,其中第一个TLP是以流模式传输的,而第二个TLP由于源节流而被丢弃。
9 Using ECRC Generation
该IP核支持自动ECRC(End-to-End Cyclic Redundancy Check,端到端循环冗余校验)生成。为了启用此功能,用户应用必须在AXI4-Stream接口的发送端TLP的开始处断言s_axis_tx_tuser[0](tx_ecrc_gen)
信号。如果需要,这个信号可以在整个数据包传输期间保持断言状态。如果传出的TLP没有包含校验和(digest),PCIe核心将生成一个并附加在TLP的末尾,并设置TD(TLP Digest)位。在数据包末尾,s_axis_tx_tready
信号会有一个单时钟周期的取消断言,以允许插入校验和。图3-14展示了ECRC生成操作的示例。
简而言之,通过断言s_axis_tx_tuser[0](tx_ecrc_gen)
信号,用户应用可以启用PCIe IP核的自动ECRC生成功能,确保TLP在传输过程中具有完整性校验。如果TLP原本没有校验和,PCIe IP核将生成并附加一个,并通过设置TD位和在数据包末尾插入校验和来完成操作。