正規形式 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

Vitis HLS では、データフロー最適化を適用するために領域が変更されます。この結果のデータフロー ネットワークをより予測しやすくするため、AMD では、この領域 (正規領域と呼ばれる) 内のコードは正規形式を使用して記述することをお勧めします。データフロー最適化を適用するには、2 つの正規形式があります。

  1. サブ関数がインライン展開されていない関数の正規形式。これらのサブ関数は、それ自体が関数領域内のデータフローであったり、ループ領域内のデータフローであったりします。また、変数の初期化 (コンストラクターによる自動的な初期化も含む)、またはプロセスへの値による表現の受け渡しは、正規形式には含まれないことに注意する必要もあります。Vitis HLS では、最も効果的な方法で結果のデータフローがインプリメントされますが、コードが正規の形式でない場合は、常に GUI データフロー ビューおよび協調シミレーションのタイムライン トレースをチェックして、正しいデータフローとなっていること、および達成されたパフォーマンスが適切であることを確認する必要があります。

    void dataflow(Input0, Input1, Output0, Output1)
    {
     #pragma HLS dataflow
     UserDataType C0, C1, C2;       // UserDataType can be scalars or arrays
     func1(Input0, Input1, C0, C1); // read Input0, read Input1, write C0, write C1 
     func2(C0, C1, C2);             // read C0, read C1, write C2
     func3(C2, Output0, Output1);   // read C2, write Output0, write Output1
    }
  2. ループ以外のコードがない関数で囲まれたループ本体内のデータフロー。for ループ (含まれる関数がインライン展開されていない) の場合、積分ループ変数は次のように設定する必要があります。
    1. 初期値はループ ヘッダーで宣言され 0 に設定される。
    2. ループ境界は、ループを囲む関数の負以外の定数またはスカラー引数である。
    3. 1 ずつインクリメント。
    4. 次のとおり、データフロー プラグマはループ内にある必要あり。
    void dataflow(Input0, Input1, Output0, Output1)
    {
        for (int i = 0; i < N; i++)
        {
        #pragma HLS dataflow
            UserDataType C0, C1, C2;       // UserDataType can be scalars or arrays
            func1(Input0, Input1, C0, C1); // read Input0, read Input1, write C0, write C1
            func2(C0, C0, read C1, C2);    // read C0, read C0, read C1, write C2   
            func3(C2, Output0, Output1);   // read C2, write Output0, write Output1
        }
    }