HLS高层次综合设计-AXI接口
一、AXI接口
1.数组可以使用AXI4接口
2.指针参数可以使用AXI4接口
3.Ref参考参数可以使用AXI4接口
二、AXI4接口的两种应用
1.单独的数据传输方式
这种传输效率低,将AXI4-full模式退化为axi4_lite接口了;
单独的数据传输模式,每次读取或者写入数据的时候,都要写地址。
2.突发模式数据传输
这种是一种高效的数据传输模式。
单次地址,多次数据顺序传输或者采样。
这种模式支持更高的数据吞吐量。
三、AXI4的burst设计方式
1.使用循环+pipeline的方式来实现
注意:循环并非只是for循环,使用while循环也是可以的;
2.使用memcpy的方式来实现
注意memcpy只有在顶层函数中使用才是AXI4的burst传输,请不要在
非顶层函数内部使用memcpy来进行设计。
四、burst式设计注意问题
1.循环需要pipeline
2.设计需要索引升序设计,不要使用降序设计;
注意:
升序,可以index索引按照step步进来递增,step可以是1,2,3,4,但是,
必须是递增升序,不可以降序。
3.不要将进行burst的设计放入if-else或者switch-case的语句中,这种方式会破坏burst的设计
注意:如果有条件判断,需要将条件判断放在循环的内部,这样才不影响burst的传输效率。
4.AXI4 burst传输要求连续的数据访问,如果放在条件语句(如if、switch等)内部,会导致访问不连续,无法形成burst,从而降低效率。
burst被打断案例一:
void burst_bad1(int* in, int* out, int len, int enable) {
#pragma HLS INTERFACE m_axi port=in offset=slave bundle=gmem
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=gmem
for (int i = 0; i < len; i++) {
if (enable) { // ❸ 访问被条件包裹
out[i] = in[i];
}
}
}
burst被打断案例二:
void burst_bad2(int* src1, int* src2, int* out, int len, int sel) {
#pragma HLS INTERFACE m_axi port=src1 offset=slave bundle=gmem
#pragma HLS INTERFACE m_axi port=src2 offset=slave bundle=gmem
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=gmem
for (int i = 0; i < len; i++) {
if (sel == 0) {
out[i] = src1[i]; // 访问 src1
} else {
out[i] = src2[i]; // 访问 src2,地址跳跃到另一个内存区域
}
}
}
