重要: 在 Vitis 内核流程中,默认操作模式为 offset=slave 且不应更改。在 Vivado IP 流程中,默认模式同样是 offset=slave,但可更改。
AXI4 主接口具有读/写地址通道,可用于读/写特定地址。默认情况下,m_axi
接口会从地址 0x00000000
启动所有读写操作。例如,给定以下代码时,设计会读取从地址 0x00000000
到 0x000000C7
(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=direct
:Vitis 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 流程的默认行为。以下是操作流程:- 初始情况下,主机/CPU 将使用块级控制协议启动 IP 或内核,此协议需映射到
s_axilite
适配器。 - 主机将通过
s_axilite
适配器为m_axi
接口发送地址偏移。 -
m_axi
适配器将从s_axilite
适配器读取起始地址,并将其存储在队列中。 - HLS 设计会开始从全局存储器读取数据。
- 初始情况下,主机/CPU 将使用块级控制协议启动 IP 或内核,此协议需映射到
如下图所示,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 }