偏移和操作模式 - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文
重要:Vitis 内核流程中,默认操作模式为 offset=slave 且不应更改。在 Vivado IP 流程中,默认模式同样是 offset=slave,但可更改。

AXI4 主接口具有读/写地址通道,可用于读/写特定地址。默认情况下,m_axi 接口会从地址 0x00000000 启动所有读写操作。例如,给定以下代码时,设计会读取从地址 0x000000000x000000C7(50 个 32 位代码字,提供 200 字节)的数据,它表示 50 个地址值。随后,设计会将数据重新写入相同地址。

#include <stdio.h>
#include <string.h>
 
void example(int *a){
   
#pragma HLS INTERFACE mode=m_axi port=a depth=50
   
  int i;
  int buff[50];
   
  //The use of memcpy is discouraged because multiple calls of memcpy cannot be
  //pipelined and will be scheduled sequentially. Use a dedicated for loop instead
  //memcpy(buff,(const int*)a,50*sizeof(int));
  //Burst read input
  for(i=0; i<50; i++){
    buff[i] = a[i];
  }
   
  // Compute value
  for(i=0; i < 50; i++){
    buff[i] = buff[i] + 100;
  }
   
  //Burst write output
  for(i=0; i<50; i++){
    a[i] = buff[i];
  }
}

该 HLS 编译器提供了如下功能:允许在 Vivado IP 中静态配置这些基址,或者由软件应用或其他 IP 在运行时进行动态配置。

m_axi 接口可作为发起传输事务的主接口,也可以作为接收数据并发送确认的从接口。根据随 INTERFACE 编译指示的 offset 选项指定的模式,HLS IP 可使用多种方法来设置基址。

提示: syn.interface.m_axi_offset 配置命令可以为偏移提供全局设置,对于特定 m_axi 接口,可使用 INTERFACE 编译指示 offset 选项来覆盖此全局设置。
  • 主模式:使用不同 offset 选项充当主接口时,m_axi 接口起始地址可采用硬编码,或者也可在运行时设置。
    • offset=off:将 m_axi 接口的基址设为 0x00000000,在 Vivado IP integrator 中此设置不可更改。这种方法的缺点之一是您在运行时内无法更改基址。请参阅 在 IP integrator 中自定义 AXI4 主接口 以获取有关设置基址的信息。
      以下显示了为函数设置 offset=off 的 INTERFACE 编译指示。
      void example(int *a){
      #pragma HLS INTERFACE m_axi depth=50 port=a offset=off
      ...
      }
    • offset=directVitis HLS 会在 IP 上生成端口用于设置地址。请注意在下图中添加的 a 端口。它支持您在运行时更新地址,这样即可通过同一个 m_axi 接口来读取和写入不同位置。例如,一个 HLS 模块用于将数据从 ADC 读取到 RAM 内,另一个 HLS 模块则用于处理此数据。由于您可更改模块上的地址,因此当其中一个 HLS 模块在处理初始数据集时,另一个模块则可将更多数据读取到其他地址内。
      void example(int *a){
      #pragma HLS INTERFACE m_axi depth=50 port=a offset=direct
      ...
      }
    图 1. offset=direct
  • 从模式:接口的从模式是使用 offset=slave 来设置的。在此模式下,IP 将由主机应用控制或者由微控制器通过 s_axilite 接口来控制。这是 Vitis 内核流程与 Vivado IP 流程的默认行为。以下是操作流程:
    1. 初始情况下,主机/CPU 将使用块级控制协议启动 IP 或内核,此协议需映射到 s_axilite 适配器。
    2. 主机将通过 s_axilite 适配器为 m_axi 接口发送地址偏移。
    3. m_axi 适配器将从 s_axilite 适配器读取起始地址,并将其存储在队列中。
    4. HLS 设计会开始从全局存储器读取数据。

如下图所示,HLS 设计将包含 s_axilite 适配器用于基址,也包含 m_axi 用于对全局存储器执行读写传输。

图 2. 从模式下的 AXI 适配器

偏移规则

以下是与 offset 选项关联的规则:

  • 完全指定偏移:当用户显式设置偏移值时,该工具会使用指定的设置。用户还可在设计中为不同 m_axi 接口设置不同偏移值,工具将使用指定的偏移。
    #pragma HLS INTERFACE s_axilite port=return
    #pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=out offset=direct
    #pragma HLS INTERFACE mode=m_axi bundle=BUS_B port=in1 offset=slave
    #pragma HLS INTERFACE mode=m_axi bundle=BUS_C port=in2 offset=off
  • 不指定偏移:如果在 INTERFACE 编译指示中未指定任何偏移,那么该工具将遵从 syn.interface.m_axi_offset 指定的设置。
    注释: 如果指定了全局 syn.interface.m_axi_offset 设置,并且设计具有 s_axilite 接口,则会忽略全局设置,并假定 offset=slave
    void top(int *a) {
    #pragma HLS interface mode=m_axi port=a
    #pragma HLS interface mode=s_axilite port=a
    }