AXI4 (Lite) 窄突发与未对齐突发 Clarification/Compatibility

AXI4 (Lite) Narrow Burst vs. Unaligned Burst Clarification/Compatibility

我目前正在编写一个应该也支持 AXI4 Lite (AXI4L) 的 AXI4 master。

我的 AXI4 主机正在从 16 位接口接收数据。这是在 Xilinx Spartan 6 FPGA 上,我计划使用 EDK AXI4 互连 IP,它的最小 WDATA 宽度为 32 位。

起初我想使用narrow burst,即AWSIZE = x"01" (2 bytes in transfer)。但是,我发现 Xilinx 的 AXI Reference Guide UG761 指出 "narrow bursts [are] supported but [...] not recommended." 应该支持未对齐的事务。

这让我想到了。假设我开始未对齐的突发:

并执行以下操作:

AX (32-bit word #0: send hi16)
XB (32-bit word #1: send lo16)

其中 A、B 是我的 16 位字,它们从未对齐(2 字节对齐)地址开始。 X 表示 WSTRB 对于指定的 16 位无效。

现在,如果这仅适用于 AXI4,我可能不会太在意这个用例,因为 AXI4 外设需要使用 WSTRB 信号。然而,AXI 参考指南 UG761 声明“[AXI4L] 从接口可以选择忽略 WSTRB(假设所有字节有效)。”

我读了here那么多(但不是全部;没有列表?)Xilinx AXI4L 外设选择忽略 WSTRB。

您的示例不是窄脉冲串,应该有效。

不推荐窄突发的原因是它提供了次优的性能。窄突发和数据重新对齐都会在面积上产生成本,恕我直言,不推荐使用。然而,DRE 具有最小的带宽成本,而窄突发则有。如果您的 AXI 端口是 100MHz 32 位,则最大吞吐量为 3.2GBit,如果 50% 的时间使用 16 位的窄突发,那么您的最大吞吐量将减少到 2.4GBit(32 位 X 50MHz + 16 位 X 50Mhz)。另外,我不确定 AXI-Lite 是否支持窄突发或数据重新对齐。

您的示例有 2 个主要缺陷。首先,它需要 3 个数据节拍来传输 32 位,这比窄突发更糟糕(我认为 AXI 不够聪明,无法取消最后一个 WSTRB 为 0 的突发)。其次,您一次不能突发超过 2 个 16 位,如果您有大量数据要传输,这将影响 AXI 基础架构的性能。

处理此问题的最佳方法是将 16 位连接在一起以在您的块中形成 32 位。然后你缓冲这 32 位并在你有足够的时候突发它们。这是执行此操作的 AXI 高性能方法。

但是,如果您接收 16 位数据,似乎您最好使用支持 16 位但没有地址概念的 AXI-Stream。您可以使用 Xilinx 的 IP 内核将 AXI-Stream 映射到 AXI-4。 AXI-Datamover 或 AXI-DMA 都可以做到这一点。两者的作用相同(事实上,AXI-DMA 包括一个数据移动器),但 AXI-DMA 是通过 AXI-Lite 接口控制的,而数据移动器是通过附加的 AXI-Streams 控制的。

最后一点,Xilinx 内核从不需要窄突发或 DRE。如果您需要 AXI-DMA 中的 DRE,则由 AXI-DMA 内核而非 AXI 互连完成。此外,这些核心都是来源明确的,因此您可以轻松查看它们的运行方式。