描述
将连续循环合并到单个循环内,以缩短总体时延、增加共享,并提升逻辑优化。合并循环:
- 减少 RTL 中循环主体实现间转换所需时钟周期数。
- 允许并行实现循环(如果可能)。
LOOP_MERGE 编译指示将尝试合并其布局范围内的所有循环。例如,如果对循环应用 LOOP_MERGE 编译指示,那么 Vitis HLS 工具会将编译指示应用于该循环内的所有子循环,但不会将其应用于该循环本身。
合并循环的规则是:
- 如果循环边界为变量,则值(迭代数)必须相同。
- 如果循环边界为常量,那么最大常量值用作为合并循环的边界。
- 具有变量边界的循环与具有常量边界的循环无法合并。
- 要合并的循环之间的代码不得产生不同结果。多次执行此代码应生成相同结果(允许使用 a=b,不允许使用 a=a+1)。
- 包含 FIFO 读取的循环无法合并。合并会更改读取顺序。从 FIFO 或 FIFO 接口执行读取必须始终按顺序进行。
语法
将 C 语言源代码中的编译指示置于所需的代码范围或区域内。
#pragma HLS loop_merge force
其中:
-
force
- (可选)关键字,使用此关键字表示即使 HLS 工具发出警告,仍强制合并循环。重要: 在此情况下,您必须手动确保合并后的循环功能正常。
示例
将函数 foo
中的所有连续循环都合并到单一循环中。
void foo (num_samples, ...) {
#pragma HLS loop_merge
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
...
loop_2
内的所有循环(不包含 loop_2
本身)均通过使用 force
选项来合并。将编译指示置于 loop_2
主体内。
loop_2: for(i=0;i< num_samples;i++) {
#pragma HLS loop_merge force
...