説明
set_directive_occurrence
は、領域内の関数呼び出しに適用できます。この機能は、if
文や switch
文などの条件ブロック内のパイプライン関数呼び出しで動作します。この指示子では、パイプライン処理された関数が現在のパイプラインの内部で呼び出される頻度を指定します。set_directive_occurrence
を使用した条件ブロック内関数を特定すると、その領域内の関数およびループがそれを含む関数またはループよりも遅い開始間隔 (II) でパイプライン処理されます。
関数やループをパイプライン処理する場合、set_directive_occurrence
で、パイプライン処理された関数やループ内のパイプライン処理された関数呼び出しが、囲んでいる関数やループよりも実行頻度が低いことを指定します。これにより、実行頻度の少ない呼び出しを低速でパイプライン処理できるので、最上位パイプライン内のリソース共有の可能性が上がります。
set_directive_occurrence -cycle
値は、次のように決定できます。
- ループは
<N>
回反復する。 - ループ本体の一部が条件文で有効になっており、
<M>
回しか実行されない (<N>
は<M>
の整数倍)。 - 条件コードの実行は、ループ本体の残りの部分の
N
/M
倍低速。
たとえば、10 回実行されるループで、ループ内の条件文が 2 回だけ実行される場合、OCCURRENCE の設定値は 5 (10/2) となります。
構文
set_directive_occurrence [OPTIONS] <location>
-
<location>
: 実行速度が遅いパイプライン処理された関数呼び出しを含むコード ブロックを指定します。
オプション
-
-cycle <int>
- OCCURRENCE の N/M (
<N>
は囲む関数またはループの実行回数、<M>
は条件領域の実行回数) を指定します。重要: N は M の整数倍数である必要があります。 -
-off
またはoff=true
- 指定された関数の発生を無効にします。
例
この例では、if 文内の下位関数呼び出し (メモリ読み出しおよび書き込みでないのは、それらがパイプライン関数内にあるため) の OCCURRENCE 値は 4 で、それを含む周囲のコードより 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 に指定します。この領域は、それを含むコードよりも 4 倍低速で実行されます。
set_directive_occurrence -cycle 4 foo/Cond_Region