次の図に、このコード例のスケジューリングおよびバインディングの例を示します。
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 番目のサイクルで
x
、a
、b
データ ポートが読み出され、2 番目のサイクルで c
データ ポートが読み出されて y
出力が生成されます。最終的なハードウェア インプリメンテーションでは、最上位関数への引数が I/O (入力および出力) ポートとしてインプリメントされます。この例では、引数は単純なデータ ポートです。各入力変数は char
型なので、入力データ ポートはすべて 8 ビット幅です。関数 return
は 32 ビットの int
型なので、出力データ ポートは 32 ビット幅です。
重要: ハードウェアに C コードをインプリメントする利点は、すべての演算をより少ないクロック数で完了できることです。この例の場合、演算は 2 クロック サイクルだけで完了します。CPU では、このような単純なコード例でも、完了するのにさらに多くのクロック サイクルが必要です。
この例の初期バインディング段階では、乗算が組み合わせ乗算器 (Mul) を使用してインプリメントされ、両方の加算が組み合わせ加減算器 (AddSub) を使用してインプリメントされています。
ターゲット バインディング段階では、乗算器と加算演算の 1 つが DSP モジュール リソースを使用してインプリメントされています。アプリケーションには多数のバイナリ乗算器およびアキュムレータを使用するものもありますが、これらは専用の DSP リソースにインプリメントするのが最適です。DSP モジュールは、FPGA アーキテクチャで使用可能な計算ブロックで、高パフォーマンスと効率的なインプリメンテーションの理想的なバランスを達成します。