説明
PERFORMANCE プラグマまたは指示子を使用すると、ループの連続した開始間のクロック サイクル数を定義する高位の制約 target_ti
または target_tl
を指定し、目的の結果を得るために必要な下位の UNROLL、PIPELINE、ARRAY_PARTITION、および INLINE 指示子をツールで推論できます。PERFORMANCE プラグマまたは指示子を指定される値は必ず達成されとは限らず、あくまでもターゲットです。
target_ti
は、ループの連続した開始間隔、またはループの最初の反復の開始と、次のループの最初の反復の開始の間の間隔です。次のコード例では、target_ti=T
は L1
の連続する 2 回の反復間の L2
ループ開始の目標間隔が 100 サイクルである必要があることを示しています。
const int T = 100;
L1: for (int i=0; i<N; i++)
L2: for (int j=0; j<M; j++){
pragma HLS performance target_ti=T
...
}
target_tl
は、ループの開始から終了までの間隔、またはループの最初の反復の開始からループの最後の反復の完了までの間隔です。たとえば、前述のコード例の場合、target_tl=T
は、L1
の 1 回の反復間の L2
ループの目標完了が 100 サイクルである必要があることを示しています。
#pragma HLS INLINE off
を使用します。トランザクション間隔は、ループの開始間隔 (II) に反復回数 (tripcount) を掛けた値 (target_ti = II * loop tripcount) になります。逆に、target_ti
は FreqHz/毎秒ごとの演算になります。
たとえば、呼び出しごとに 1 つのフレームを処理する画像処理関数のスループット目標が 60 fps の場合、関数のターゲット スループットは毎秒 60 呼び出しになります。クロック周波数が 180 MHz の場合、target_ti
は、関数呼び出しごとに 180M/60 なので、300 万クロックサイクルになります。
構文
このプラグマは、ループの境界内に配置するか、ループ ネストの外側のループ内に配置します。
#pragma HLS performance target_ti=<value> target_tl=<value> unit=[sec|cycle]
説明:
-
target_ti=<value>
- 反復を完了するための関数、ループ、またはコード領域のクロック サイクル数として定義されたターゲット トランザクション間隔を指定します。<value> は、整数、浮動小数点、または定数式として指定できます。この式は、ツールによって整数に変換されます。 注記: 切り捨てがあった場合は、警告メッセージが表示されます。
-
target_tl=<value>
-
ループがすべての反復を完了するまでのクロック サイクル数として定義されるターゲット レイテンシを指定します。トランザクション レイテンシは、ループの最初の反復の開始から、ループの最後の反復の完了までの間隔のことです。<value> は、整数、浮動小数点、または定数式として指定できます。この式は、ツールによって整数に変換されます。
- unit=[sec | cycle]
-
target_ti
またはtarget_tl
の値に対する単位を指定します。単位は秒かクロック サイクルで指定できます。単位が秒の場合は、ナノ秒 (ns)、ピコ秒 (ps)、マイクロ秒 (us) を指定できます。
例 1
外部ループは、ターゲット トランザクション間隔を 1000 クロック サイクルにするように指定されています。
for (int i =0; i < 1000; ++i) {
#pragma HLS performance target_ti=1000
for (int j = 0; j < 8; ++j) {
int tmp = b_buf[j].read();
b[i * 8 + j] = tmp + 2;
}
}