FPGAアーキテクチャ
ルックアップテーブルからダイ全体まで、FPGAがどのように構成されているか、そしてシリコンの形がなぜ設計でできることを決めるのかを解説します。
概要
FPGAは、小さなプログラマブル論理セルの大きなアレイと、それらをつなぐプログラマブルな配線網、そしてベンダーが面積に見合うと判断した場所にアレイ内へ配置したハードブロック(メモリ、乗算器、クロックマネージャ、トランシーバー)で構成されています。このハブは、合成ツールが実際に何をターゲットにしているのかを理解し、使用率レポートの数値やタイミングレポートの赤いパスの意味がわかるようになりたい方のためのものです。
アーキテクチャが重要なのは、設計上のあらゆる判断がシリコンに関する判断だからです。64ビット加算器はキャリーチェーンの一連分を消費します。2 KBのルックアップは、全部を使うかどうかにかかわらずブロックRAMを1個消費します。ダイ全体をまたぐクロックはグローバルバッファを1本と、いくらかのスキューを消費します。ファブリックが見えるようになれば、作る前にコストを予測でき、見出しの数字に惑わされずにベンダーのデータシートを読めるようになります。
重要な考え方
論理セル: LUT、フリップフロップ、キャリー
LUTは小さなメモリです。6入力LUTは64ビットを保持し、真理値表を格納することで6入力の任意のブール関数を実装できます。その隣にはフリップフロップがあり、出力をレジスタに取り込めるようになっています。さらに専用のキャリーパスがあるので、加算器やカウンタを汎用LUTだけで組む必要はありません。AMDはこのセルを8個まとめてCLBのスライスペアとしています。Alteraは自社のセルをアダプティブロジックモジュール(ALM)と呼びます。これは分割可能な8入力構造で、1個の大きなLUTとしても2個の小さなLUTとしても動作します。Lattice・Gowin・Efinixは主に4入力LUTを使います。小さく安価ですが、同じ関数を実現するにはより多くの個数が必要です。したがって、ベンダー間で「ロジックセル」数を比較しても、よくて近似にしかなりません。
配線とビットストリーム
FPGAの面積の大半、そして遅延の大半は、論理ではなく配線です。各セルはプログラマブルなマルチプレクサを通してさまざまな長さの配線トラックに接続され、配置配線ツールはどのトラックを使うかの選択に時間を費やします。典型的な設計では配線遅延はLUT遅延と同程度かそれ以上であり、「使用率が30%しかない」設計でも、論理がダイ全体に散らばるとタイミングを満たせないことがあるのはそのためです。すべてのマックス、すべてのLUTテーブル、すべてのフリップフロップオプションの選択状態は、電源投入時にコンフィギュレーションメモリへ書き込まれます。ほとんどのデバイスはそのメモリをSRAMで保持しており、外部フラッシュやホストからロードする必要があるのはそのためです。Lattice・Microchip・Gowinの一部のデバイスはフラッシュまたはアンチヒューズによるコンフィギュレーションを使い、ローダーなしで立ち上がります。
ハードブロック: ブロックRAM、DSP、クロッキング
ブロックRAM(BRAM)は真のデュアルポートメモリの列で、AMDデバイスでは通常1個あたり18 Kbまたは36 Kb、Alteraでは20 Kb(M20K)です。DSPスライスには乗算器(AMD UltraScaleでは27×18ビット、Alteraでは可変精度)とプリアダー、アキュムレータが含まれ、ファブリックの最高クロックで動作するようパイプライン化されています。クロック管理タイル(AMDではMMCMとPLL、AlteraではIOPLLとfPLL)がクロックを合成してスキューを除去し、グローバルおよびリージョナルバッファのツリーがそれを分配します。I/Oリングはプログラマブルなインターフェース規格、遅延線、シリアライザ、そして大型デバイスではギガビットトランシーバーを加えます。これらのブロックと素の論理との比率こそがデバイスファミリ間の本当の違いであり、アプリケーションが気にするのもその比率です。
新しいタイルの種類
大型デバイスはより粗い粒度の構造を追加しています。AMD Versalはファブリックの隣にベクトルプロセッサ(AI Engine)のアレイとネットワークオンチップを配置しています。Altera Agilexはハード化されたメモリコントローラと、ハイパーレジスタ化された配線ファブリックを備えます。AchronixはSpeedster7tに機械学習プロセッサとネットワークオンチップを載せています。LatticeとEfinixはむしろタイルを小さく保ち、面積を低消費電力のために使います。どれが「優れている」かは、ワークロード次第です。
どこから始めるか
入門トラックでは、この全体像を1レッスンずつ組み立てていきます。
- /learn/beginner/01-what-is-an-fpga/は、FPGAをマイクロコントローラとASICの間に位置づけます。
- /learn/beginner/02-how-an-fpga-is-programmed/は、ビットストリームがファイルからコンフィギュレーションメモリに至るまでを追います。
- /learn/beginner/03-combinational-logic-and-luts/は、LUTからブール関数を組み立てます。
- /learn/beginner/04-registers-clocks-and-state/は、フリップフロップとクロックを加えます。
- /learn/beginner/09-memories-block-ram-and-fifos/は、ブロックRAMを正しく使います。
配線、クロッキング、ハードブロックの推論に関する中級レッスンは準備中です。
ツールとベンダー
| ベンダー | 論理セル | ブロックRAM | DSP | ツール | ハブ |
|---|---|---|---|---|---|
| AMD | 6入力LUT、CLBスライス | 18/36 Kb BRAM、UltraRAM | DSP48E2、DSP58 | Vivado | /vendors/amd/ |
| Altera | 8入力ALM | M20K | 可変精度DSP | Quartus Prime | /vendors/altera/ |
| Microchip | 4入力LUT(PolarFire) | LSRAM 20 Kb、uSRAM | Mathブロック 18x18 | Libero SoC | /vendors/microchip/ |
| Lattice | 4入力LUT | EBR 9/18 Kb | sysDSP | Radiant、Diamond | /vendors/lattice/ |
| Efinix | 4入力LUT(XLR) | 5/10 Kb | 18x19乗算器 | Efinity | /vendors/efinix/ |
| Gowin | 4入力LUT | BSRAM 18 Kb | 18x18乗算器 | Gowin EDA | /vendors/gowin/ |
上のブロックサイズは本稿執筆時点での一般的なケースです。リソースを数える前に、該当ファミリのデータシートを確認してください。
よくある間違い
- 等価なLUT4またはLUT6の数に換算せずに、「ロジックセル」や「ロジックエレメント」の数でベンダーを比較する。
- ブロックRAMのテンプレートに合わないメモリを書いてしまい、代わりに何千ものフリップフロップで構築される。
- 未使用リソースは無料だと思い込む。遊んでいるブロックRAMも静的電力を消費し、配置を妨げる可能性のある列を占有します。
- クロックマネージャとクロックイネーブルを使わずに、論理からクロックを駆動する(ゲーテッドクロックや分周クロック)。
- 見出しの周波数だけを読む。ファブリックの最大クロックが、実際の配線を伴う実際の設計でそのまま維持されることはめったにありません。
- ボードの立ち上げまでコンフィギュレーション経路を無視し、フラッシュのフットプリントやブートモードピンが間違っていたことに後で気づく。
さらに深く
- AMD UG474, 7 Series FPGAs Configurable Logic Block: 現代的なLUT6スライスについての、最も明快な単独の解説。
- AMD UG574, UltraScale Architecture Configurable Logic Block: UltraScaleおよびUltraScale+のスライス。
- AMD UG573, UltraScale Architecture Memory Resources: ブロックRAMとUltraRAMの詳細。
- AMD UG579, UltraScale Architecture DSP Slice: DSP48E2スライス。
- Kuon and Rose, “Measuring the Gap Between FPGAs and ASICs”: プログラマビリティの面積・速度・電力コストに数値を与えた論文。
- Project X-Ray documentation: リバースエンジニアリングによる7 Seriesビットストリームの解説。コンフィギュレーションメモリが実際に何を保持しているかを見るのに役立ちます。