pragma HLS loop_merge - 2021.2 Chinese

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

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

描述

将连续循环合并到单个循环内,以缩短总体时延、增加共享,并提升逻辑最优化。合并循环:

  • 减少 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
...