高位合成ツールは、タイミングなしの高位仕様を完全にタイミング制約が設定されたインプリメンテーションに変換します。この変換の際に、仕様要件を満たすようカスタム アーキテクチャがインプリメントされます。生成されたアーキテクチャには、データパス、制御ロジック、メモリ インターフェイスのほか、RTL の外部との通信方法が含まれています。データパスは、レジスタ、レジスタ ファイル、メモリなどのストレージ エレメント、ALU、乗算器、シフター、その他カスタム機能などの機能ユニット、およびトライステート ドライバー、マルチプレクサー、バスなどのインターコネクト エレメントで構成されます。各コンポーネントは、実行に 1 またはそれ以上のクロック サイクルを要し、パイプライン処理され、入力または出力レジスタを使用できます。また、データパスおよびコントローラー全体は数段に分割してパイプライン処理することも可能です。
設計者は、プロジェクトの初期段階に、アルゴリズムを上位レベルに保ちながらパフォーマンスを満たすためアーキテクチャの再定義に労力を費やす必要があります。特定の HLS ツールには、パフォーマンスを満たす最適化された RTL を生成するために従う必要のある設計原則およびベスト プラクティスがあります。
HLS ツールは、次の図に示すように、タスクを実行します。
図 1. HLS のタスク
- 仕様を満たすよう記述されたアルゴリズムをコンパイルする: このステップでは、デッド コードの削除、定数のたたみ込み、サポートされていないコンストラクトのレポートなど、いくつかのコード最適化が実行されます。
- 指定したクロック サイクルの演算をスケジュールします。
-
スケジュールでは、各クロック サイクルでどの演算を実行するかを次に基づいて決定します。
- 演算の依存が満たされ、使用可能になるタイミング。
- クロック サイクルの長さまたはクロック周波数。
- 演算が終了するまでにかかる時間 (ターゲット デバイスで定義)。クロック周期が長い場合、より多くの演算を 1 クロック サイクルで完了させることができます。演算によっては、マルチサイクル リソースとしてインプリメントする必要のあるものもあります。HLS は、より多くのクロック サイクルに渡って自動的に演算をスケジュールします。
- 使用可能なリソース。
- ユーザー指定の最適化指示子の適用。
- スケジュールの段階で、ツールは指定したサイクルでどの演算が実行され、必要なコンポーネントの数を決定します。次のステップでは、どの演算がどのリソースに割り当てられるかを決定します。
-
- 演算をファンクショナル コンポーネントに、変数をストレージ エレメントに割り当てる
- バインディング タスクは、スケジューリングされた各演算をインプリメントするハードウェア リソースを割り当て、加算、乗算、シフトなどの演算子を特定の RTL インプリメンテーションにマップします。たとえば乗算 (mult) は、組み合わせまたはパイプライン RTL 乗算器としてインプリメントできます。
- バインディング タスクでは、必要なパフォーマンスを達成するため、関数内の配列変数にメモリ、レジスタ、またはそれらの組み合わせを割り当てます。
- 複数の演算で同じリソースが使用される場合、同じサイクルで使用しない限りこのステップでリソースを共有できます。
- 制御ロジックの抽出: 定義されたスケジュールに基づいて、RTL デザインで演算を順序付ける有限ステート マシン (FSM) を作成します。
- 外部と通信するためのロジックを作成: 生成された RTL は、外部ポートからのデータ ストリーミング、ロジックの開始/停止、または外部メモリへのアクセスなど、外部との通信を実行します。
- 最後に、RTL アーキテクチャを生成します。
次のセクションでは、一般的な HLS ツールが、クロック サイクルといった入力制約に基づいて演算をスケジュールし、利用可能なハードウェア リソースに割り当てる方法を概念的に説明します。