ザイリンクスでは、正規形式を使用してデータフロー領域内でコードを記述することをお勧めしています。関数およびループのデータフロー最適化には、正規形式があります。
- 関数: 関数内のデータフローの正規形式のコーディング ガイドラインは、次のとおりです。
- データフロー領域内では、次のタイプの変数のみを使用します。
- ローカルの非スタティック スカラー/配列/ポインター変数。
- ローカルのスタティック
hls::stream
変数。
- 関数呼び出しは、データを前方向にのみ送信します。
- 配列または
hls::stream
には、プロデューサー関数 1 つと コンシューマー関数 1 つのみが含まれます。 - 関数引数 (データフロー領域外から入ってくる変数) は読み出されるか書き込まれますが、両方が実行されることはありません。読み出しと書き込みを同じ関数引数で実行する場合は、読み出しが書き込みよりも前に発生する必要があります。
- ローカル変数 (前方向へのデータ転送する変数) は読み出しよりも前に書き込まれる必要があります。
次のコード例は、関数内のデータフローの正規形式を示しています。上記のコードでは、最初の関数 (
func1
) で入力が読み出され、最後の関数 (func3
) で出力が書き込まれます。各関数で作成された出力値は、次の関数に入力パラメーターとして渡されます。void dataflow(Input0, Input1, Output0, Output1) { UserDataType C0, C1, C2; #pragma HLS DATAFLOW func1(read Input0, read Input1, write C0, write C1); func2(read C0, read C1, write C2); func3(read C2, write Output0, write Output1); }
- データフロー領域内では、次のタイプの変数のみを使用します。
- ループ: ループ本体内のデータフローの正規形式のコーディング ガイドラインには、上記で定義される関数のコーディング ガイドラインが含まれるほか、次も指定されます。
- 初期値は 0。
- ループ条件は、ループ変数と定数、またはループ本体内で変化しない変数との比較結果で決まります。
- 1 ずつインクリメント。
次のコード例は、ループ内のデータフローの正規形式を示しています。
void dataflow(Input0, Input1, Output0, Output1) { UserDataType C0, C1, C2; for (int i = 0; i < N; ++i) { #pragma HLS DATAFLOW func1(read Input0, read Input1, write C0, write C1); func2(read C0, read C0, read C1, write C2); func3(read C2, write Output0, write Output1); } }