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