AXI4 主接口 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

AXI4 存储器映射 (m_axi) 接口允许内核在全局存储器(DDR、HBM、和 PLRAM)内读写数据。存储器映射接口便于跨加速应用的不同元素共享数据,例如,在主机与内核之间或者在加速器卡上的内核之间共享数据。请参阅 GitHub 上的 Vitis-HLS-Introductory-Examples/Interface/Memory,以获取这些概念的部分示例。

以下列出了 m_axi 接口的主要优势:

  • 此接口有独立的读取通道和写入通道
  • 它支持基于突发的访问,潜在性能可达 ~17 GB/s
  • 它可为未完成传输事务提供支持
  • 它可包含高速缓存用于改善性能,此高速缓存由 CACHE 编译指示或指令来表示。

Vitis 内核流程中,默认情况下,会将 m_axi 接口分配到指针和实参。在此流程中,它支持以下默认功能:

  • 将指针和阵列实参自动映射到 m_axi 接口
  • Vitis 中,默认操作模式是 offset=slave,并且不应更改此模式
  • 所有指针和阵列实参都映射到单个接口捆绑,以节省器件资源,并且各端口在活动期间共享读取和写入访问
  • Vitis 流程中的默认对齐设置为 64 字节
  • 默认情况下,最大读/写突发长度设置为 16

虽然 Vivado IP 流程默认不使用 m_axi 接口,但指定该接口时,它具有下列默认功能特性:

  • 默认操作模式为 offset=off,但可对此进行更改,如 偏移和操作模式 中所述
  • 已分配的指针和阵列实参都映射到单个接口捆绑,以节省器件资源,并且在活动期间共享该接口
  • Vivado IP 流程中的默认对齐设置为 1 字节
  • 默认情况下,最大读/写突发长度设置为 16

Vivado IP 流程与 Vitis 内核流程中,m_axi 接口的全局默认值均由 syn.interface.xxx 命令来定义,如 接口配置 中所述。INTERFACE 编译指示或指令可用于按需修改特定接口的默认值。有些自定义设置有助于提升设计性能,如 AXI 系统性能最优化 中所述。您还可按 pragma HLS cache 中的描述指定 CACHE 编译指示或指令,以改善 m_axi 接口的性能。

您可在阵列或指针/参考实参上使用 AXI4 主接口,Vitis HLS 通过以下任一模式来实现该接口:

  • 单独数据传输
  • 突发模式数据传输

对于单独数据传输,Vitis HLS 会为每个地址读取或写入单个数据元素。以下示例显示了单一读取操作和单一写入操作。在此示例中,Vitis HLS 可在 AXI 接口上生成 2 个地址,1 个用于读取单个数据值,另 1 个用于写入单个数据值。该接口会为每个地址传输 1 个数据值。

void bus (int *d) {
 static int acc = 0;

 acc += *d;
 *d  = acc;
}

对于突发模式传输,Vitis HLS 会使用单一基址读取或写入数据,后接多次顺序数据采样,因此,该模式支持更高的数据吞吐量。使用流水打拍的 for 循环时,可使用操作的突发模式。如需了解更多信息,请参阅 AXI 突发传输

重要: 由于 memcpy 无法内联或流水打拍,因此不鼓励使用。由于使用它时,会将实参的类型更改为 char,使用 array_partitionarray_reshape 或结构体 disaggregate 时此更改可能导致出错,这就可能会导致各种问题。建议您改为自行编写 memcpy,利用显式阵列和循环来提供更好的控制。

对先前的示例进行综合时,会生成如下图所示接口。

注释: 在此图中,AXI4 接口处于折叠状态。
图 1. AXI4 接口

使用 for 循环实现突发读取或写入时,请遵循如下要求:

  • 对循环进行流水打拍
  • 按升序访问地址
  • 请勿将访问置于条件语句内
  • 对于嵌套循环,请勿手动将循环平铺(使用 LOOP_FLATTEN 编译指示或指令),因为这样有碍突发操作
注释: 在任一 for 循环内只允许 1 次读取和 1 次写入,除非端口捆绑在不同 AXI 端口内。