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." 应该支持未对齐的事务。
这让我想到了。假设我开始未对齐的突发:
- AWLEN = x"01"(2 拍)
- AWSIZE = x"02"(传输中为 4 个字节)
并执行以下操作:
AX (32-bit word #0: send hi16)
XB (32-bit word #1: send lo16)
其中 A、B 是我的 16 位字,它们从未对齐(2 字节对齐)地址开始。 X 表示 WSTRB 对于指定的 16 位无效。
- 即使通过 AWSIZE = x"02"(传输中的 4 个字节)而不是 AWSIZE = x"01"(传输中的 2 个字节),这是否受支持或属于 "narrow burst" 类别?
现在,如果这仅适用于 AXI4,我可能不会太在意这个用例,因为 AXI4 外设需要使用 WSTRB 信号。然而,AXI 参考指南 UG761 声明“[AXI4L] 从接口可以选择忽略 WSTRB(假设所有字节有效)。”
我读了here那么多(但不是全部;没有列表?)Xilinx AXI4L 外设选择忽略 WSTRB。
- 这是否意味着我基本上被禁止进行窄突发 ("not recommended") 以及未对齐的突发 ("WSTRB can be ignored"),或者是否有一种简单的方法可以卸载一些实现工作从我的主机到互连,保证访问 AXI4L 外围设备时系统行为正确?
您的示例不是窄脉冲串,应该有效。
不推荐窄突发的原因是它提供了次优的性能。窄突发和数据重新对齐都会在面积上产生成本,恕我直言,不推荐使用。然而,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 互连完成。此外,这些核心都是来源明确的,因此您可以轻松查看它们的运行方式。
我目前正在编写一个应该也支持 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." 应该支持未对齐的事务。
这让我想到了。假设我开始未对齐的突发:
- AWLEN = x"01"(2 拍)
- AWSIZE = x"02"(传输中为 4 个字节)
并执行以下操作:
AX (32-bit word #0: send hi16)
XB (32-bit word #1: send lo16)
其中 A、B 是我的 16 位字,它们从未对齐(2 字节对齐)地址开始。 X 表示 WSTRB 对于指定的 16 位无效。
- 即使通过 AWSIZE = x"02"(传输中的 4 个字节)而不是 AWSIZE = x"01"(传输中的 2 个字节),这是否受支持或属于 "narrow burst" 类别?
现在,如果这仅适用于 AXI4,我可能不会太在意这个用例,因为 AXI4 外设需要使用 WSTRB 信号。然而,AXI 参考指南 UG761 声明“[AXI4L] 从接口可以选择忽略 WSTRB(假设所有字节有效)。”
我读了here那么多(但不是全部;没有列表?)Xilinx AXI4L 外设选择忽略 WSTRB。
- 这是否意味着我基本上被禁止进行窄突发 ("not recommended") 以及未对齐的突发 ("WSTRB can be ignored"),或者是否有一种简单的方法可以卸载一些实现工作从我的主机到互连,保证访问 AXI4L 外围设备时系统行为正确?
您的示例不是窄脉冲串,应该有效。
不推荐窄突发的原因是它提供了次优的性能。窄突发和数据重新对齐都会在面积上产生成本,恕我直言,不推荐使用。然而,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 互连完成。此外,这些核心都是来源明确的,因此您可以轻松查看它们的运行方式。