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];

}

...

}


本文标签: 端口 综合 地址 实现 循环