pragma HLS loop_flatten - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

描述

允许把嵌套循环平铺为已改善时延的单一循环层级。

在 RTL 实现中,从外层循环移至内层循环需要一个时钟周期,从内层循环移至外层循环同样如此。将嵌套循环平铺即可将其作为单一循环来加以优化。这样可节省时钟周期,从而进一步对循环主体逻辑进行优化。

将 LOOP_FLATTEN 编译指示应用于循环层级的最内层循环的循环主体。仅限完美循环和半完美循环才能以此方式进行平铺:

完美循环嵌套
  • 仅限最内层循环才包含循环主体内容。
  • 在循环语句之间不指定任何逻辑。
  • 所有循环边界均为常量。
半完美循环嵌套
  • 仅限最内层循环才包含循环主体内容。
  • 在循环语句之间不指定任何逻辑。
  • 最外层的循环边界可采用变量。
非完美循环嵌套
当内层循环具有变量边界或者循环主体未完全包含在内层循环内时,请尝试重构代码或者将循环主体中的循环展开以创建完美循环嵌套。

语法

将 C 语言源代码中的编译指示置于嵌套循环的边界内。

#pragma HLS loop_flatten off

其中:

off
可选关键字。此关键字可防止发生循环平铺,它可防止对某些循环进行平铺,同时对指定位置的所有其他循环执行平铺。
重要: 存在 LOOP_FLATTEN 编译指示和指令即表示启用优化。添加 off 则表示禁用优化。

示例 1

foo 函数中的 loop_1 及循环层级中位于其上层的所有(完美或半完美)循环平铺为单一循环。将编译指示置于 loop_1 主体内。

void foo (num_samples, ...) {
  int i;
  ...
  loop_1: for(i=0;i< num_samples;i++) {
   #pragma HLS loop_flatten
   ...
    result = a + b;
  }
}

示例 2

防止在 loop_1 中平铺循环。

loop_1: for(i=0;i< num_samples;i++) {
   #pragma HLS loop_flatten off
   ...