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
时,对于该工具在不同环境下处理捆绑的方式存在相应的规则,包括但不限于:
-
默认捆绑名称:该工具将不含捆绑名称的所有接口端口都组合到单个
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'.
- 用户指定的捆绑名称:该工具会将具有相同用户指定的
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'.
重要: 如果对不兼容的接口进行捆绑,那么该工具会发出消息并忽略捆绑分配。