pragma HLS occurrence - 2023.2 简体中文

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

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

描述

OCCURRENCE 编译指示或指令可应用于区域内的函数调用。该功能特性适用于条件块内的流水打拍函数调用,例如,if 语句或 switch 语句。该编译指示用于指定当前流水线内调用流水打拍函数的频率。如果以 OCCURRENCE 编译指示来标识条件块内的某个函数,即可允许该区域中的函数和循环采用流水打拍、启动时间间隔更高,且比外层函数或循环更慢。

执行函数或循环流水打拍时,OCCURRENCE 编译指示可用于指定流水打拍函数或循环内某个流水打拍函数调用的执行频率低于其外层函数或循环的执行频率。这样流水打拍的函数调用在以较低频率执行时即可以较慢的速率进行流水打拍,这可能有助于改善顶层流水线内的资源共享。

以下进程可用于判定 OCCURRENCE 周期值:

  • 循环迭代 <N> 次。
  • 但由于循环主体中某部分是通过条件语句来启用的,因此仅执行 <M> 次,其中 <N><M> 的整数倍。
  • 条件代码的出现次数比循环主体的其他部分慢 N/M 次。

例如,在执行 10 次的循环中,其中的条件语句仅执行 2 次,则出现次数为 5(即 10/2)。

语法

将 C 语言源代码中的编译指示布局在包含流水打拍的子函数调用的条件代码块中。

#pragma HLS occurrence cycle=<int> off=true

其中:

cycle=<int>
指定出现次数值为 N/M,其中 <N> 是外层函数或循环的执行次数,<M> 是条件区域的执行次数。
重要: <N> 必须为 <M> 的整数倍。
off=true
为指定函数禁用 occurrence。

示例

在此示例中,在 if 语句中调用子函数(但不包括存储器读写,因为它们不在流水打拍函数内)会发生 4 次(其执行频率是包含此代码的外部代码的四分之一以下)。因此,虽然没有 OCCURRENCE 编译指示,但仍会以与调用程序相同的 II 来对其进行流水打拍,包含 OCCURRENCE 编译指示时,将以 II=4 来执行流水打拍。这将在其自身内部以及与其他函数之间增加资源共享的机会。

void subfunction(...) {
#pragma HLS pipeline II=...
// Without the occurrence pragma, 
// this will be automatically pipelined with an II=1, 
// regardless of its own pipeline pragma, 
// since it is called in a pipeline with II=1
// With the pragma, it has an II=4.
  ...
}
for (int i = 0; i < 16; i++) {
#pragma HLS pipeline II=1
  if (i % 4 == 0) {
#pragma HLS occurrence cycle=4
    subfunction(...);
    a[i+1] = b[i];
  }
}