M_AXI 捆绑 - 2023.2 简体中文

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

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

Vitis Unified IDE 和 v++ 命令会将兼容选项的函数实参组合到单个 m_axi 接口适配器中。将端口捆绑到单个接口中有助于通过消除 AXI 逻辑来节省 FPGA 资源,但它可能限制内核性能,因为所有存储器传输都必须经过同一个端口。m_axi 接口具有独立的读取 (READ) 和写入 (WRITE) 通道,因此单个接口即可同时执行读取和写入,但仅限单一位置。使用多个捆绑会创建多个接口来连接到多个存储体,故而会导致内核带宽和吞吐量增加。

在以下示例中,所有指针实参都使用接口选项 bundle=BUS_A 组合到单个 m_axi 适配器中,并为 m_axi 偏移、标量实参 size 和函数返回添加单个 s_axilite 适配器。

extern "C" {
void vadd(const unsigned int *in1, // Read-Only Vector 1
          const unsigned int *in2, // Read-Only Vector 2
          unsigned int *out,     // Output Result
          int size                 // Size in integer
          ) {
 
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=out
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=in1
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=in2
#pragma HLS INTERFACE mode=s_axilite port=in1
#pragma HLS INTERFACE mode=s_axilite port=in2
#pragma HLS INTERFACE mode=s_axilite port=out
#pragma HLS INTERFACE mode=s_axilite port=size
#pragma HLS INTERFACE mode=s_axilite port=return
图 1. MAXI 和 S_AXILITE

您还可选择将函数实参捆绑到独立接口适配器内,如以下代码所示。此处实参 in2 通过 bundle=BUS_B 组合到独立的接口适配器内。这样会为端口 in2 创建新的 m_axi 接口适配器。

extern "C" {
void vadd(const unsigned int *in1, // Read-Only Vector 1
          const unsigned int *in2, // Read-Only Vector 2
          unsigned int *out,     // Output Result
          int size                 // Size in integer
          ) {
 
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=out
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=in1
#pragma HLS INTERFACE mode=m_axi bundle=BUS_B port=in2
#pragma HLS INTERFACE mode=s_axilite port=in1
#pragma HLS INTERFACE mode=s_axilite port=in2
#pragma HLS INTERFACE mode=s_axilite port=out
#pragma HLS INTERFACE mode=s_axilite port=size
#pragma HLS INTERFACE mode=s_axilite port=return
图 2. 2 个 MAXI 捆绑

捆绑规则

全局配置命令 syn.interface.m_axi_auto_max_ports=false 将把接口捆绑数量限制到所需的最小值。它允许工具将兼容的端口组合到单个 m_axi 接口内。此命令默认设置为禁用 (false),但可通过为每个端口创建独立的 m_axi 适配器来将其启用,从而最大化带宽。

禁用 m_axi_auto_max_ports 时,对于该工具在不同环境下处理捆绑的方式存在相应的规则,包括但不限于:

  1. 默认捆绑名称:该工具将不含捆绑名称的所有接口端口都组合到单个 m_axi 接口端口内,并使用工具默认名称 bundle=<default>,将 RTL 端口命名为 m_axi_<default>。以下编译指示:
    #pragma HLS INTERFACE mode=m_axi port=a depth=50 
    #pragma HLS INTERFACE mode=m_axi port=a depth=50
    #pragma HLS INTERFACE mode=m_axi port=a depth=50 
    

    会生成以下消息:

    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    
  2. 用户指定的捆绑名称:该工具会将具有相同用户指定的 bundle=<string> 的所有接口端口都组合到同一个 m_axi 接口端口中,并以 m_axi_<string> 指定的值来命名 RTL 端口。未分配 bundle 的端口则组合到默认捆绑中,如上所述。以下编译指示:
    #pragma HLS INTERFACE mode=m_axi port=a depth=50 bundle=BUS_A
    #pragma HLS INTERFACE mode=m_axi port=b depth=50
    #pragma HLS INTERFACE mode=m_axi port=c depth=50
    

    会生成以下消息:

    INFO: [RTGEN 206-500] Setting interface mode on port 'example/BUS_A' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    
    重要: 如果对不兼容的接口进行捆绑,那么该工具会发出消息并忽略捆绑分配。