AMBA 总线接口访问明细
一、AXI主接口说明
1.可以在数组或者pointer/refrencen可以使用AXI4接口
2.AXI4接口:单独数据传输 & 突发模式数据传输
二、单独数据传输
1.单独数据传输,vivado hls会读取或者写入每个地址一个数据元素。
三、突发模式数据传输
1.突发传输,可以单一基地址读取或者写入数据
2.后面接着多次顺序数据采样
3.突发传输支持更高的数据吞吐量
4.可以使用C memcpy函数或者流水线化的for循环,来实现突发传输
5.memcpy作为burst传输只能在顶层函数中对顶层函数接口的参数来执行才有效,其他方式一律不认;
四、for循环实现突发传输需要满足条件
1.将循环进行pipeline流水线约束
2.地址访问是升序,不能是降序
3.请不要将access访问放在条件语句之内
4.对于嵌套循环,不要使用flatten扁平设计,这样会影响突发传输。
五、不要将对接口参数进行突发传输的访问放在条件语句内
1.硬件生成的角度,如果内存的读取或者写入在if内部,
可能导致流水线的停顿或者无法推断连续的突发访问模式;
2.编译器/综合工具无法保证每次循环迭代都会执行该访问,从而破坏突发传输的连续性。突发传输需要一系列连续的地址访问,如果有时不访问(比如条件不成立),就会插入气泡或者地址不连续,不能形成高效的突发。
六、突发传输的硬件条件
一次比较高效的突发读写需要满足条件:
1.地址连续,并且是要升序访问
2.每个周期都发起一次访问,中间没有任何气泡
3.请求一旦开始,就不应该被条件打断
4.如果把load加载数据,或者store存储数据放在if内部,综合工具会认为你这个访问
在某些循环迭代中可能不发生,这样就无法保证地址的的连续;
因为有些拍子没有请求,或者地址序列出现了空洞
5.将load/store放在if内部,流水线中会插入无效周期,打乱固定的访问节凑
6.将load/store放在if内部,编译器有可能放弃突发优化,转为
单节拍传输,或者低效的传输;
七、案例分析
int sum = 0;
for (int i = 0; i < N; i++) {
#pragram pipeline II=1
if (valid[i]) {
sum += A[i]; // 访问被条件包裹
}
}
上述A的访问在if条件内,上述可以实现流水化,但是这里是为了实现burst传输,但是这个A数组的访问在if判断内,所以会造成burst访问受限;
