スケジューリングおよびバインディングの例 - 2023.2 日本語

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

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

次の図に、このコード例のスケジューリングおよびバインディングの例を示します。

int foo(char x, char a, char b, char c) {
 char y;
 y = x*a+b+c;
 return y;
}
図 1. スケジューリングおよびバインディングの例

この例のスケジューリング段階では、次の演算が各クロック サイクルで発生するようにスケジューリングされます。

  • 1 番目のクロック サイクル: 乗算と 1 回目の加算
  • 2 番目のクロック サイクル: 2 番目のクロック サイクルで最初の加算の結果が使用可能な場合は、2 回目の加算を実行して出力を生成
注記: 図の 1 番目と 2 番目のクロック サイクルの間にある正方形は、内部レジスタに変数が格納されることを示しています。この例では、高位合成で加算の出力が 1 クロック サイクルでレジスタに入力されることだけが必要です。1 番目のサイクルで xab データ ポートが読み出され、2 番目のサイクルで c データ ポートが読み出されて y 出力が生成されます。

最終的なハードウェア インプリメンテーションでは、最上位関数への引数が I/O (入力および出力) ポートとしてインプリメントされます。この例では、引数は単純なデータ ポートです。各入力変数は char 型なので、入力データ ポートはすべて 8 ビット幅です。関数 return は 32 ビットの int 型なので、出力データ ポートは 32 ビット幅です。

重要: ハードウェアに C コードをインプリメントする利点は、すべての演算をより少ないクロック数で完了できることです。この例の場合、演算は 2 クロック サイクルだけで完了します。CPU では、このような単純なコード例でも、完了するのにさらに多くのクロック サイクルが必要です。

この例の初期バインディング段階では、乗算が組み合わせ乗算器 (Mul) を使用してインプリメントされ、両方の加算が組み合わせ加減算器 (AddSub) を使用してインプリメントされています。

ターゲット バインディング段階では、乗算器と加算演算の 1 つが DSP モジュール リソースを使用してインプリメントされています。アプリケーションには多数のバイナリ乗算器およびアキュムレータを使用するものもありますが、これらは専用の DSP リソースにインプリメントするのが最適です。DSP モジュールは、FPGA アーキテクチャで使用可能な計算ブロックで、高パフォーマンスと効率的なインプリメンテーションの理想的なバランスを達成します。