ソフトプロセッサ
ソフトプロセッサとは何か、MicroBlaze V、Nios V、VexRiscv、NEORV32、PicoRV32、Ibexの比較、LiteXがその周りにSoC全体を組み立てる仕組み、ソフトコアがハードコアに勝つ場面を解説します。
概要
ソフトプロセッサとは、ダイにハード化されたものではなく、FPGA自身の論理セルから構築されるCPUです。数千LUTを消費し、控えめなクロックで動作し、どのベンダーのどのデバイスにも配置できます。このハブは、設計にプロセッサを入れるべきか、どれを入れるか、その周りのバス・メモリ・ペリフェラルをどう構築するかを決めようとしているエンジニアのためのものです。
欲しくなる理由は、制御論理はRTLよりCで書く方が安いからです。設定プロトコル、ブートシーケンス、キャリブレーションルーチン、低速なハウスキーピング処理を扱うステートマシンは、状態のもつれではなく数百行のファームウェアになります。注意すべき理由は、ソフトコアはハードのArmコアに比べて遅く、他で必要になるかもしれないリソースを消費することです。
重要な考え方
ソフトコアは何でできているか
コア本体は3段から7段のパイプラインで、メモリから命令をフェッチし、デコードし、ALUで実行し、結果を書き戻します。その周りには、ブロックRAMで構築された命令メモリとデータメモリ、必要に応じてキャッシュ、そしてペリフェラル(UART、タイマー、GPIO、SPI、設計が必要とするカスタムレジスタ)へつながるバス(Wishbone、AXI、またはベンダー独自のもの)があります。ベンダーのコアには、これらすべてをメニューから組み立てるツールが付属します。オープンソースのコアにも同じことをするジェネレータが付属することが多く、LiteXはその中で最も完成度が高いものです。
知っておくべきコア
ベンダーのコアはRISC-Vに移行しました。AMDのMicroBlaze Vは、独自のMicroBlaze命令セットをRV32に置き換え、Vivadoブロックデザインとの統合とVitisのデバッグフローは維持しています。AlteraのNios Vは、Platform Designer内でNios IIに対して同じことを行います。どちらも自社デバイス上で無償で使え、ベンダーのデバッガとボードサポートが付属します。他ベンダーへの移植性は皆無であり、それこそがオープンソースの代替品の存在意義です。
SpinalHDLで書かれたVexRiscvは、構成自由度の高いインオーダーコアで、現代的なファブリックで数百MHzに達し、キャッシュ、MMU、Linuxサポート付きで構築できます。LiteXのデフォルトCPUです。NEORV32はVHDLのコアで、完全なSoCと優れたドキュメントを備え、小さく監査可能であることに重点を置いており、すべての行をレビューしなければならないチームに向いています。PicoRV32は意図的に小さく遅く、プロセッサが性能のためではなく利便性のためにある場合に適しており、多くのLattice iCE40プロジェクトで使われているコアです。lowRISCのIbexは2段のRV32コアで、量産品質の検証環境を持ち、OpenTitanの中にあるコアです。RocketとCVA6はより大きなアプリケーションクラスのコアで、FPGAに実装して配備されるより、FPGAで試作されることの方が多いです。
LiteXとSoCジェネレータ
LiteXはPythonフレームワークで、コア、メモリコントローラ、Ethernet、PCIe、SATA、数十のペリフェラルをSoCに組み立て、Verilogを生成し、BIOSとファームウェアヘッダを書き出し、ベンダーまたはオープンソースのツールチェーンを駆動します。プラグインCPUとしてVexRiscv、NEORV32、PicoRV32、Ibex、Rocketなどをサポートしています。安価なボード上でDDRとEthernetを備え、VexRiscvでLinuxをブートするLiteX SoCは、現実的な週末プロジェクトです。代償はPythonの依存関係の連鎖と、ベンダーのGUIで調べにくい設計です。
ソフトがハードに勝つとき
SoC FPGAのハードコアは、より速く、命令あたりのコストが安く、標準のLinuxが動きます。ソフトコアを選ぶのは、デバイスにハードコアがないとき、制御対象の論理の隣に小さなプロセッサを複数置く必要があるとき、ファームウェアをハードウェアと一緒に認証しなければならないとき、設計をベンダー間で移動させたいとき、あるいはベンダーが製品を廃止しても設計が生き残らなければならないときです。Linux、ネットワークスタック、本格的な計算が必要ならハードコアを選んでください。多くの設計は両方を持っています。
どこから始めるか
- /learn/beginner/07-finite-state-machines/は、ソフトコアが置き換える制御論理を示します。
- /learn/beginner/09-memories-block-ram-and-fifos/は、ソフトコアが動作するメモリを構築します。
- /learn/beginner/10-from-rtl-to-board/は、設計をハードウェアに載せます。ファームウェアを追加する前に必要です。
最初のNEORV32システム、MicroBlaze Vのブロックデザイン、LiteXのビルドに関する中級レッスンは準備中です。
ツールとベンダー
| コア | ISA | 言語 | サイズ(概算) | ベンダーロック | デバッグ |
|---|---|---|---|---|---|
| MicroBlaze V | RV32Iとオプション | ネットリスト(AMD) | 2kから6k LUT | AMDのみ | Vitis、XSDB |
| Nios V | RV32Iとオプション | ネットリスト(Altera) | 2kから5k ALM | Alteraのみ | Ashling RiscFree |
| VexRiscv | RV32IMAFCオプション | SpinalHDL | 1kから5k LUT | なし | OpenOCD、LiteX BIOS |
| NEORV32 | RV32IMCほか | VHDL | 2kから6k LUT | なし | オンチップデバッガ、OpenOCD |
| PicoRV32 | RV32IMC | Verilog | 2k LUT未満 | なし | 最小限 |
| Ibex | RV32IMC、ビット操作 | SystemVerilog | 2kから4k LUT | なし | RISC-Vデバッグモジュール |
| LiteX | フレームワーク | Python(Migen) | CPUによる | なし | LiteScope、BIOS |
サイズは構成、キャッシュ、乗算器オプションで大きく変わります。ベンダーの注意点は/vendors/amd/、/vendors/altera/、/vendors/opensource/にあります。
よくある間違い
- 「何か制御が必要だから」とソフトコアを入れ、性能が重要な処理をファームウェアでやってしまう。
- 命令メモリはビットストリームで初期化されるので、ブートローダを追加しない限りファームウェア変更のたびに再ビルドが必要になることを忘れる。
- 半分の速度で十分だったのに、ファブリックの最大クロックでコアを動かし、タイミング収束に何日も費やす。
- 後で別ベンダーに移さなければならない設計にベンダーコアを使う。
- 面積節約のためにデバッグモジュールを省き、ファームウェアがハングする理由を見る手段がなくなる。
- 長いパイプラインと遅いバスを持つコアの割り込みレイテンシを無視する。
さらに深く
- RISC-V ISA specifications: 上記すべてのコアが実装する基本ISAと拡張。
- AMD UG1629, MicroBlaze V Processor Reference Guide: アーキテクチャと構成オプション。
- NEORV32 documentation: ソフトコアのドキュメント化の模範。
- VexRiscv repository: 構成、ベンチマーク、プラグインアーキテクチャ。
- Ibex documentation: マイクロアーキテクチャと検証環境。
- LiteX wiki: サポートされるボード、CPU、Linux-on-LiteXのフロー。