説明
関数、ループ、および領域の完了するまでの最小レイテンシまたは最大レイテンシ、あるいはその両方を指定します。
- レイテンシ
- 出力を生成するのに必要なクロック サイクル数。
- 関数レイテンシ
- 関数がすべての出力値を計算して戻るまでに必要なクロック サイクル数。
- ループ レイテンシ
- ループのすべての反復を実行するのにかかるサイクル数。
Vitis HLS では常に、デザインのレイテンシを最短にするよう試みられます。LATENCY プラグマを指定すると、ツールで次のように処理されます。
- レイテンシが最小値より大きく、最大値未満: 制約は満たされています。これ以上の最適化は実行されません。
- レイテンシが最小値未満: HLS ツールで指定の最小レイテンシ未満を達成できる場合は、レイテンシが指定値に拡張されます。リソース共有を増加できる可能性があります。
- レイテンシが最大値を超える: HLS ツールで最大値以下でスケジューリングできない場合は、指定された制約を満たすことができるようエフォート レベルが上げられます。それでも最大レイテンシを満たすことができない場合は、警告が表示され、達成可能な最短のレイテンシでデザインが作成されます。
ヒント: LATENCY プラグマを使用すると、ツールで最良のソリューションを探すエフォートを制限することもできます。コード内のループ、関数、または領域にレイテンシ制約を指定すると、そのスコープ内で可能なソリューション数が削減され、ツールの実行時間を短縮できます。詳細は、合成ランタイムおよび容量の改善 を参照してください。
すべてのループ反復のレイテンシ合計を制限するのが目的の場合は、次の例のようにループ全体を含む領域にレイテンシ指示子を指定する必要があります。
Region_All_Loop_A: {
#pragma HLS latency max=10
Loop_A: for (i=0; i<N; i++)
{
..Loop Body...
}
}
この場合、ループが展開されていたとしても、レイテンシ指示子ですべてのループ演算の最大制限が設定されます。
Vitis HLS で最大レイテンシ制約を満たすことができない場合、レイテンシ制約が緩和され、できるだけ最適な結果が達成されます。
最小レイテンシ制約を設定し、Vitis HLS で必要とされる最小値よりも短いレイテンシでデザインが生成される場合は、最小レイテンシが満たされるようにダミー クロック サイクルが挿入されます。
構文
レイテンシを制御する関数、ループ、または領域内に配置します。
#pragma HLS latency min=<int> max=<int>
説明:
-
min=<int>
- 関数、ループ、またはコードの領域の最小レイテンシを指定します (オプション)。
-
max=<int>
- 関数、ループ、またはコードの領域の最大レイテンシを指定します (オプション)。
注記: min および max はオプションですが、少なくともいずれかを指定する必要があります。
例 1
関数 foo
のレイテンシの最小値を 4、最大値を 8 に指定します。
int foo(char x, char a, char b, char c) {
#pragma HLS latency min=4 max=8
char y;
y = x*a+b+c;
return y
}
例 2
次の例では、loop_1
の最大レイテンシを 12 に指定しています。プラグマはループ本体内に記述します。
void foo (num_samples, ...) {
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
#pragma HLS latency max=12
...
result = a + b;
}
}
例 3
次の例では、コード領域を作成し、同じクロック サイクルで変化する必要のある信号を 0 レイテンシを指定してグループ化しています。
// create a region { } with a latency = 0
{
#pragma HLS LATENCY max=0 min=0
*data = 0xFF;
*data_vld = 1;
}