admin 管理员组文章数量: 1086019
2024年4月16日发(作者:系统架构设计师工资薪酬)
HLS系列–High Level Synthesis(HLS)的端口综合4
在上一章HLS提到了axi lite端口的综合方式,以及directive的一些语法规
则。这一章里面,介绍一下axi-stream和full axi端口的综合实现问题。
AXI FULL端口的实现
HLS支持在数组或者指针参数上,AXI MasterInterface的实现。AXI Master
端口支持以下2种传输模式之一:
A. Individual data transfers
在这种模式下,HLS每次只从端口读/写一个数据。下面就是一个例子,综合
后,AXI端口会生成2个地址,一个地址用作读单个数据,另一个地址用作写
单个数据。
void bus (int *d) {
static int acc = 0;
acc+= *d;
*d= acc;
}
B. Burst mode data transfers
在这种模式下,HLS从一个base address开始,连续的产生读/写操作,因此
这种模式下,数据的传输效率和吞吐量都比较高。这种模式可以用memcpy函数
或者pipelined for函数来实现。下面是一个例子。
void example(volatile int *a){
#pragma HLS INTERFACE m_axi depth=50 port=a
#pragma HLS INTERFACE s_axilite port=return
//Port a is assigned to an AXI4 masterinterface
inti;
intbuff[50];
//memcpy creates a burst access to memory
memcpy(buff,(const int*)a,50*sizeof(int));
for(i=0; i < 50; i++){
buff[i] = buff[i] + 100;
}
for(i=0; i < 50; i++){
#pragma HLS PIPELINE
a[i] = buff[i];
}
}
综合后,对应的rtl模块端口如下(AXI Master端口被合并到一起了):
当使用for循环来实现AXI burst mode时,必须遵循以下规则:
Pipeline the loop
Access addresses inincreasing order 访问地址必须递增
Do not place accessesinside a conditional statement 不要使用条件判
断
For nested loops, do not flatten loops不要打平for循环
注意:在一个for循环里面,一般情况下,只允许一个读,或一个写,除非这
多个读写端口被明确指明分配到不同的AXI总线上。下面是一个例子,用
bundle约束读端口b被综合成到d2_port。
void example(volatile int *a, int *b){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=50 port=a
#pragma HLS INTERFACE m_axi depth=50 port=bbundle=d2_port
inti;
intbuff[50];
//copy data in
for(i=0; i < 50; i++){
#pragma HLS PIPELINE
buff[i] = a[i] + b[i];
}
...
}
版权声明:本文标题:HLS系列–High Level Synthesis(HLS)的端口综合4 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1713250631a625980.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论