SoC FPGA
SoC FPGAがハードプロセッサコアとプログラマブルロジックをどう組み合わせるか、PS/PL境界を何が越えるか、AXI、デバイスツリー、PetaLinux、Yocto、ブートフローがどう組み合わさるかを解説します。
概要
SoC FPGAは、1個以上のハードプロセッサコアと、そのメモリコントローラ、標準的なペリフェラルを、プログラマブルロジックと同じダイに載せたものです。プロセッサ側はLinuxやRTOSを動かし、ネットワーク、ストレージ、制御を担当します。ロジック側は、ソフトウェアでは十分な速さで処理できない部分を担当します。このハブは、2つの半分がどう対話するか、チップがどうブートするか、ベンダーフローのどの部分を最初に学ぶ価値があるかを理解する必要のあるエンジニアのためのものです。
この考え方は、AMD(当時はXilinx)が2011年に2個のArm Cortex-A9コアを持つZynq 7000を出荷して以来、主流となっています。現在では、Zynq UltraScale+ MPSoC(クアッドCortex-A53にデュアルCortex-R5)、Versal(デュアルCortex-A72とCortex-R5F、一部製品ではAI Engine付き)、Cortex-A53またはCortex-A76コアを持つAlteraのAgilex SoCファミリ、そして量産FPGAで初めてRISC-V(SiFive U54コア)を採用したMicrochipのPolarFire SoCが含まれます。
重要な考え方
PS/PL境界
AMDの名称が定着しています。プロセッシングシステム(PS)がハード部分で、プログラマブルロジック(PL)がファブリックです。AlteraはこれらをHPSとFPGAファブリックと呼びます。MicrochipはプロセッサクラスタをMSSと呼びます。境界はAXIポートの集まりです。汎用マスタポートにより、プロセッサは論理内のレジスタに書き込めます。高性能スレーブポートにより、論理はDDRへフル帯域で直接書き込めます。コヒーレントポート(Zynq 7000ではACP、MPSoCではACEまたはCCI)により、論理はソフトウェアがフラッシュすることなくプロセッサのキャッシュを読めます。割り込みは逆方向に渡ります。クロックやリセットを含むその他すべてはこのインターフェースを通して配線され、構築するシステムとは、ほぼ、どのポートに何を運ばせるかという決定です。
ブートフロー
電源投入でプロセッサ内部のブートROMが起動します。これがQSPIフラッシュ、SDカード、eMMCから第1段ブートローダ(Zynq 7000ではFSBL、MPSoCではFSBLとPMUファームウェア、VersalではPLM、PolarFire SoCではHSS)を読み込みます。このローダがDDRを初期化し、必要に応じてビットストリームでPLをプログラムし、U-Bootに制御を渡します。U-BootがLinuxカーネルとデバイスツリーをロードします。Versalでは、ブートイメージは段階的にデバイスをプログラムするPDIです。MPSoCでは、FSBLとU-Bootの間にArm Trusted Firmwareが入ります。ブートしないボードのデバッグとは、どの段階が最後に出力したかを知ることなので、最初に接続すべきはシリアルコンソールです。
デバイスツリー、ドライバ、ベンダーのLinuxフロー
Linuxはデバイスツリーを通じて論理について知ります。これは、どのIPがどのアドレスにあり、どの割り込みを使うかを記述したテキストです。AMDのツールはハードウェア設計からデバイスツリーオーバーレイを生成し、AlteraのツールもPlatform Designerのシステムから同じことを行います。AXI-Liteインターフェースを持つレジスタブロックには、UIOか小さなプラットフォームドライバを通してユーザー空間からアクセスできます。PetaLinuxはAMDによるYoctoのラッパーで、Yoctoのレイヤー構造の大半を隠します。AlteraとMicrochipはYoctoを直接ドキュメント化しており、小さなイメージにはBuildrootを使うチームも多くあります。どれを選ぶにせよ、ベンダーのボードサポートパッケージは出発点であって完成品ではなく、自分のパッチを別レイヤーに保っておけば次のツールリリースでの苦労が減ります。
どのファミリか
Zynq 7000は今でも論理の隣にLinuxを置く最も安価な方法であり、低価格ボードで広くサポートされています。MPSoCは64ビットコア、GPU、リアルタイムコア、そしてはるかに多くのファブリックを加え、ビジョンや産業用途の主流の選択肢です。Versalは最も新しく、ネットワークオンチップとAI Engineをもたらしますが、新しいブートモデルと急な学習曲線が代償です。Agilex SoC製品はトランシーバー帯域とメモリインターフェースに強みがあります。PolarFire SoCは低消費電力・耐放射線の選択肢であり、本稿執筆時点でRISC-Vを持つ唯一のものです。
どこから始めるか
- /learn/beginner/01-what-is-an-fpga/は、プロセッサと論理がなぜ互いを補完するのかを説明します。
- /learn/beginner/09-memories-block-ram-and-fifos/は、あらゆるPS/PLデータパスが使うFIFOを扱います。
- /learn/beginner/10-from-rtl-to-board/は、後でAXIインターフェースに包むことになる純粋な論理設計を構築します。
最初のAXI-Liteペリフェラル、PetaLinuxのビルド、論理からLinuxメモリへのDMAに関する中級レッスンは準備中です。
ツールとベンダー
| ファミリ | コア | ハードウェアツール | ソフトウェアツール | Linux | ハブ |
|---|---|---|---|---|---|
| Zynq 7000 | 2x Cortex-A9 | Vivado | Vitis | PetaLinux、Yocto | /vendors/amd/ |
| Zynq UltraScale+ MPSoC | 4x A53、2x R5、Mali GPU | Vivado | Vitis | PetaLinux、Yocto | /vendors/amd/ |
| Versal | 2x A72、2x R5F、オプションのAI Engine | Vivado | Vitis | PetaLinux、Yocto | /vendors/amd/ |
| Agilex 5および7 SoC | A55とA76、または4x A53 | Quartus Prime、Platform Designer | Arm DS、GCC | Yocto | /vendors/altera/ |
| PolarFire SoC | 4x U54 + 1x E51 RISC-V | Libero SoC | SoftConsole | Yocto、Buildroot | /vendors/microchip/ |
上のコア数は本稿執筆時点での一般的な構成です。具体的な製品を確認してください。
よくある間違い
- 高性能ポート経由のDMAを使わず、汎用ポートで1ワードずつバルクデータを送る。
- キャッシュ一貫性を忘れ、論理が埋めたバッファからLinuxが古いデータを読む。
- オーバーレイを追加する代わりに生成されたデバイスツリーを手で編集し、次のエクスポートで編集内容を失う。
- 論理がまだAXIトランザクションを駆動している最中にプロセッサのレジスタから論理のリセットをアサートし、インターコネクトをハングさせる。
- ベンダーのボードサポートパッケージを量産ファームウェアとして扱う。
- Zynq 7000ボードなら10分の1の価格で同じことを学べるのに、最初のSoCプロジェクトをVersalで始める。
さらに深く
- AMD UG585, Zynq 7000 SoC Technical Reference Manual: 最初のSoC FPGAのレジスタレベルの解説。
- AMD UG1085, Zynq UltraScale+ Device Technical Reference Manual: MPSoC版。
- AMD UG1144, PetaLinux Tools Reference Guide: ビルドフローと、Yoctoをどうラップしているか。
- AMD UG1037, Vivado AXI Reference Guide: ベンダーIPで使われるAXI4、AXI4-Lite、AXI4-Stream。
- Arm AMBA AXI specification: プロトコルそのもの。
- Microchip PolarFire SoC documentation: RISC-V SoC FPGAのランディングページ。
- Yocto Project documentation: PetaLinuxおよびAltera・Microchipのフローの下にあるレイヤーシステム。