如果设计中有多个循环,默认这些循环不会重叠,而是按顺序执行。本节介绍了顺序循环的数据流最优化概念。请考虑以下代码示例:
void adder(unsigned int *in, unsigned int *out, int inc, int size) {
unsigned int in_internal[MAX_SIZE];
unsigned int out_internal[MAX_SIZE];
mem_rd: for (int i = 0 ; i < size ; i++){
#pragma HLS PIPELINE
// Reading from the input vector "in" and saving to internal variable
in_internal[i] = in[i];
}
compute: for (int i=0; i<size; i++) {
#pragma HLS PIPELINE
out_internal[i] = in_internal[i] + inc;
}
mem_wr: for(int i=0; i<size; i++) {
#pragma HLS PIPELINE
out[i] = out_internal[i];
}
}
在上述示例中,显示了 3 个顺序循环:mem_rd
、compute
和 mem_wr
。
-
mem_rd
循环会从存储器接口读取输入矢量数据,并将其存储在内部存储空间中。 - 主
compute
循环会从内部存储空间读取,执行增量操作,并将结果保存到另一个内部存储空间中。 -
mem_wr
循环会将数据从内部存储空间写回存储器中。
此代码示例使用 2 个不同循环来读取和写入存储器输入/输出接口,以推断突发读取/写入。
默认情况下,这些循环按顺序执行,无任何重叠。首先,mem_rd
循环完成读取所有输入数据,然后,compute
循环开始其操作。同样,compute
循环完成处理数据后,mem_wr
循环再开始写入数据。但这些循环可重叠执行,即当有足够数据可供 compute
(或 mem_wr
)循环处理时,允许前一个循环在 mem_rd
(或 compute
)循环完成处理其数据之前尽快开始操作。
循环可使用数据流最优化来重叠执行,如 数据流最优化 中所述。