描述
set_directive_occurrence
可应用于区域内的函数调用。该功能特性适用于条件块内的流水打拍函数调用,例如,if
语句或 switch
语句。该指令用于指定当前流水线内调用流水打拍函数的频率。如果以 set_directive_occurrence
来标识条件块内的某个函数,即可允许该区域中的函数和循环采用流水打拍、启动时间间隔更高,且比外层函数或循环更慢。
执行函数或循环流水打拍时,set_directive_occurrence
可用于指定流水打拍函数或循环内某个流水打拍函数调用的执行频率低于其外层函数或循环的执行频率。这样流水打拍的函数调用在以较低频率执行时即可以较慢的速率进行流水打拍,这可能有助于改善顶层流水线内的资源共享。
以下进程可用于判定 set_directive_occurrence -cycle
值:
- 循环迭代
<N>
次。 - 但由于循环主体中某部分是通过条件语句来启用的,因此仅执行
<M>
次,其中<N>
为<M>
的整数倍。 - 条件代码的出现次数比循环主体的其他部分慢
N
/M
次。
例如,在执行 10 次的循环中,其中的条件语句仅执行 2 次,则出现次数为 5(即 10/2)。
语法
set_directive_occurrence [OPTIONS] <location>
-
<location>
用于指定代码块,此代码块中包含执以较低速率执行的流水打拍函数调用。
选项
-
-cycle <int>
- 指定出现次数为 N/M,其中
<N>
是外层函数或循环的执行次数,<M>
是条件区域的执行次数。重要: N 必须是 M 的整数倍。 -
-off
或off=true
- 为指定函数禁用 occurrence。
示例
在此示例中,在 if 语句中调用子函数(但不包括存储器读写,因为它们不在流水打拍函数内)会发生 4 次(其执行频率是包含此代码的外部代码的四分之一以下)。因此,虽然没有 set_directive_occurrence
,但仍会以与调用程序相同的 II 来对其进行流水打拍,包含该指令时,将以 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
Cond_Region:
if (i % 4 == 0) {
subfunction(...);
a[i+1] = b[i];
}
}
subfunction
函数中的 Cond_Region
区域执行 4 次。它的执行速度比其外层的代码更慢,仅为外层代码的四分之一。
set_directive_occurrence -cycle 4 foo/Cond_Region