計算分野では、 FPGA プログラマブルSoCは、CPU、MCU、DSP、GPUデバイスとは別のクラスのデバイスです。FPGAは、スループットの向上、レイテンシの低減、確定性の向上を実現する実装を開発者に提供します。
計算分野では、FPGAとプログラマブルSoCは、CPU、MCU、DSP、GPUデバイスとは別のクラスのデバイスです。FPGAは、スループットの向上、レイテンシの低減、確定性の向上を実現する実装を開発者に提供します。
FPGAとプログラマブルSoCの両方に、ルックアップ テーブル、レジスタ、ブロックRAMなどのプログラマブル ロジック セルが含まれています。開発者がプログラマブル ロジック ソリューションを作成する場合、開発者が定義するのはこれらのロジック セルの構成と接続です。
開発者は実行のための命令のシーケンスではなくロジック セルの構成を記述するため、開発フローは大きく異なります。この違いにより、開発者には次のような新たな課題も生じます。
- 検証 — 設計者はどのように機能を検証し、デバッグしますか?
- リソース割り当て - デバイスには設計を実装するのに十分なロジック リソースが含まれていますか?
- タイミング クロージャ - 使用されているロジック セルを必要に応じて接続し、目的の動作周波数を達成できますか?
- 消費電力 - 最終設計の消費電力は、電源と熱環境に対して許容範囲内ですか?
設計キャプチャにハードウェア記述言語 (HDL) を使用する
1984年の導入以来、プログラマブル ロジック設計のキャプチャ方法は大きく変化しました。この進歩により、設計エントリは、各ロジック セルのロジック方程式の定義から、ロジック回路の図式的なキャプチャ、ハードウェア記述言語の使用、そして最近では高レベル合成へと進化しました。
もちろん、デバイスのプログラミングに使用される抽象化レベルの向上の背後にある主な推進要因の1つは、デバイスの容量と機能の向上です。
最新の設計のほとんどは、VerilogやVHDLなどのハードウェア記述言語 (HDL) を使用して作成されます。どちらの言語でも、開発者はレジスタ転送レベル (RTL) で実装する必要な機能を記述できます。RTL設計を定義するということは、開発者が同期ロジック設計と、レジスタ(たとえば、ステート マシンとカウンター)間の情報の転送を記述することを意味します。
HDL言語にはプログラミング言語に期待される構造 (ファイルの操作など) が含まれていますが、プログラマブル ロジック ソリューションを作成するために使用できるのは言語の限られたサブセットのみです。残りの構成は設計の検証中に使用されます。
しかし、プログラマブル ロジック ソリューションの開発者は、設計キャプチャにC、C++、OpenCL、Matlab/Simulinkなどの高水準言語を使用することが増えています。これらの言語は、高水準言語をVHDLまたはVerilog記述に変換する役割を持つ、Vivado HLxやIntelのHLSコンパイラなどの高水準合成ツールと組み合わせて使用されます。このHDL記述は、標準のFPGA開発フローを使用して実装されます。
他のすべての開発と同様に、HDLまたは高級言語のどちらを使用するかに関係なく、モジュール式のアプローチを使用することをお勧めします。これにより、理解が容易になり、必要に応じて再利用できるようになります。
FPGAモジュールのテストベンチ
各HDLまたはHLSモジュールが開発される際には、機能が期待どおりに動作していることを確認するためのテストが必要になります。ここでテスト ベンチが登場します。テスト ベンチはモジュールの入力に刺激を与え、監視します。高度なケースでは、出力信号の動作を報告します。設計内のすべてのレジスタのトランザクションをシミュレートするため、ロジック シミュレーションの速度が大幅に低下する可能性があります。
概念的にはソフトウェア テスト ハーネスに似ていますが、各信号とバスを正しく駆動し、モジュールを刺激するタイミングを合わせる必要があるため、テスト ベンチではより詳細な操作が必要になる場合があります。テストベンチ内では、刺激設定が読み取られたり、結果がテキスト ファイルに記録されたりするときに、言語のより広範な構造が使用されます。
シミュレーションの重要な要素の1つは、モジュールが意図したとおりに機能しない原因となる可能性のあるコーナー ケースと境界条件のテストです。
テストベンチをテスト対象ユニットに適用するには、開発者がロジック設計をシミュレートできるように、Vivadoシミュレータ (Vivado HLxに付属) などのHDLシミュレータが必要です。
デバイス内に実装する前に設計をシミュレーションするのが一般的です。ただし、これは、シミュレーションの結果では、実装されたデバイスで発生するタイミング遅延 (セットアップ時間やホールド時間など) が考慮されていないことを意味します。したがって、機能パフォーマンスのみをシミュレートします。設計が実装されたら、この情報を使用してシミュレーションをバックアノテーションできますが、これを行うとシミュレーションの実行時間が大幅に長くなります。
FPGA用モジュールの実装
開発者が機能パフォーマンスに満足したら、開発の最終段階は実装です。
実装は、合成、配置、配線、プログラミング ファイル生成という4つの異なる段階に分けられます。実装は複数の段階で構成されていますが、それらはすべて、Intel QuartusやXilinx Vivadoなど、選択したデバイス ベンダーが提供する独自のツールを使用して実行されます。
合成では、HDLファイルを取得し、実装する論理回路の記述に合成します。したがって、合成により、構成可能なロジック セル、レジスタ、ブロックRAM、およびターゲット デバイス内で使用可能なその他の専用ロジック リソースの設定が決定されます。ほとんどのロジック最適化が行われ、未使用の信号と変数のトリミングが実行されるのはこの合成段階です。これにより、望ましくない最適化や合成の決定が行われる可能性があります。そのため、開発者は合成制約を使用して合成オプション、戦略、最適化を制御できます。制約はテキストベースであり、合成ツールの操作をガイドします。
合成からの出力は、設計の論理的な動作を記述するネットリストです。実装の次の段階では、各ロジック機能をデバイス内に物理的に配置します。一般的に、配置ツールは、設計内でロジック セルを配置する方法を定義する組み込みアルゴリズムを使用します。ただし、必要に応じて、配置制約を使用してロジック セルの配置を調べたり移動したりすることもできます。これは、設計のタイミング クロージャを達成しようとしているときに非常に役立ちます。
論理関数がマッピングされると、実装の最後から2番目の段階が実行されます。これらのマップされたリソースは、デバイスで使用可能なリソースを使用して、設計で定義されたとおりに接続する必要があります。このプロセスは「ルーティング」と呼ばれ、ルーティング アルゴリズムによって目的のタイミング パフォーマンスが使用され、目的の動作周波数を達成しようとします。目的の動作周波数を達成することを「タイミング クロージャ」と呼びます。これは、設計内の各レジスタとクロック要素が必要なセットアップ時間とホールド時間を達成することを意味します。
タイミング クローズが達成されない場合は、異なる実装戦略の選択から配置制約の更新によるタイミング クリティカルなブロック同士の接近、HDL設計の更新による合成中により最適なロジック構造の実装まで、いくつかのアプローチを使用できます。
実装プロセスの最終段階は、ターゲット デバイスを構成するために使用できるプログラミング ファイルの生成です。これが完了すると、デバイスにダウンロードして、より広範なシステムとの統合という楽しみを始める準備が整います。
もちろん、統合はFPGA開発者とシステム インテグレーターの両方にとって独自の課題をもたらす可能性があります。
結論
FPGA開発プロセスは、従来の計算ソリューションの作成に使用されるプロセスとは明らかに異なります。ただし、言語やツールチェーン (特にHLS) に関する学習曲線は、当初考えられていたほど急ではありません。これらのプロセスを十分に研究すれば、開発者はスループットの向上、レイテンシの低減、確定性の向上を実現するFPGAベースのソリューションの実装を開始できます。