自动循环流水打拍 - 2023.2 简体中文

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

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

syn.compile.pipeline_loops 配置命令支持根据迭代计数对循环进行自动流水打拍。循环次数大于指定限值的所有循环都会自动流水打拍。默认限值为 64。

给定以下示例代码:

loop1: for (i = 0; i < 5; i++) {
   // do something 5 times ... 
} 

如果 syn.compile.pipeline_loops 命令设为 4,那么 for 循环 (loop1) 会进行流水打拍。这等同于添加 PIPELINE 编译指示,如下代码片段所示:

loop1: for (i = 0; i < 5; i++) {
#pragma HLS PIPELINE II=1 
   // do something 5 times ... 
} 

但对于嵌套循环,该工具会从最内层循环开始,判定它是否能流水打拍,然后沿循环嵌套上移。在以下示例中,syn.compile.pipeline_loops 阈值仍为 4,最内层循环 (loop1) 标记为等待流水打拍。随后,该工具会对该循环对的父循环 (loop2) 进行求值,发现它仍能流水打拍。在此情况下,该工具会将 loop1 展开到 loop2 内,并将 loop2 标记为等待流水打拍。随后,它将上移至父循环 (loop3) 并重复分析操作。

loop3: for (y = 0; y < 480; y++) {
   loop2: for (x = 0; x < 640; x++) {
      loop1: for (i = 0; i < 5; i++) {
         // do something 5 times ... 
      } 
   }
}

如果设计中有部分无需使用自动流水打拍的循环,请对此类循环应用含 off 选项的 PIPELINE 指令。off 选项可阻止自动循环流水打拍。

重要: 该工具会在执行所有用户指定的指令后应用 syn.compile.pipeline_loops 命令。例如,如果向循环应用用户指定的 UNROLL 指令,那么会首先展开该循环,但无法应用自动循环流水打拍,因为此循环已被消除。