- RISCBoyは、RISC-V互換CPUからグラフィックスパイプライン、ディスプレイコントローラ、メモリ・周辺機器インフラ、KiCad PCBに至るまで自ら設計した携帯ゲーム機
- 2001年にRISC-Vが存在していたら登場していそうな Game Boy Advance を目指し、合成可能な Verilog 2005 で記述され、7,680個の論理要素を持つ iCE40-HX8k FPGA 上に32ビットのゲーム機を実装
- プロセッサは RV32IMC 命令セットと M-mode CSR・例外・ベクタ外部割り込みをサポートし、RISC-V適合性テストと
riscv-formal 検証に合格
- 合成には Yosys・nextpnr・Project Icestorm のオープンソースツールチェーンを使用し、ECP5 ボードと、より小型の iCE40 UP5k 向け RV32I 構成もサポート
- シミュレーションと公式開発環境は主に Linux を前提としており、PCB Rev B とブートローダ・ゲートウェア・ソフトウェアツリーは現在も開発継続中
ゼロから構築した携帯ゲーム機
- RISCBoy の公開設計範囲は以下のとおり
- RISC-V互換CPU
- ラスタグラフィックスパイプラインとディスプレイコントローラ
- バスファブリック、メモリコントローラ、UART、GPIO などのチップインフラ
- KiCad で作成した PCB レイアウト
- 目標は RISC-Vが2001年に存在していた並行世界の Game Boy Advance であり、子どものころの携帯ゲーム機とそれを動かしていた技術への愛情を込めたプロジェクト
- 詳細な設計情報は、リポジトリ内の
doc/riscboy_doc.pdf 文書で確認可能
FPGA 実装とプロセッサ
- 設計は合成可能な Verilog 2005 で記述されており、LUT4 ベース FPGA の iCE40-HX8k に合わせている
- HX8k は 7,680 個の論理要素を提供
- 限られたリソースに32ビットゲーム機を収めるため、綿密な設計が必要
- HX8k はかつて、オープンソースの Project Icestorm ツールチェーンが対応した最大の FPGA であり、その後関連エコシステムは Project Trellis と Project X-Ray へ拡張
- プロセッサは RV32IMC 命令セットをサポート
- 当該命令セットの RISC-V 適合性テストに合格
- riscv-formal 検証スイートに合格
- 命令フロントエンドの一貫性と基本バス準拠を確認する独自の形式的性質検証も適用
- M-mode CSR と例外をサポートし、ベクタ外部割り込み のためのシンプルな準拠拡張も提供
リポジトリのクローンとツールチェーン
- HDL とテストに Git サブモジュール を使用しているため、以下のように再帰的にクローンする必要がある
git clone --recursive https://github.com/Wren6991/RISCBoy.git riscboy
- 通常のクローン後でも、サブモジュールは個別に初期化できる
git clone https://github.com/Wren6991/RISCBoy.git riscboy
cd riscboy
git submodule update --init --recursive
- 再帰的サブモジュール更新はプロセッサのスタンドアロンテストに必要だが、RISCBoy ゲートウェアのビルド には不要
- ソフトウェアベースのテストをコンパイルするには、RISC-V GNU Toolchain を RV32IMC・ILP32 構成でビルドする必要がある
./configure --prefix=/opt/riscv \
--with-arch=rv32imc \
--with-abi=ilp32 \
--with-multilib-generator="rv32i-ilp32--;rv32ic-ilp32--;rv32im-ilp32--;rv32imc-ilp32--"
- iCE40 UP5k のような小型 FPGA では、高性能な RV32IMC の代わりに、より小さい RV32I プロセッサ変種 を使用可能
- コンパイラが RISCBoy の複数の ISA 変種をサポートしていても、各変種に対応する標準ライブラリが生成されるようマルチライブラリ設定が必要
- RV32I 専用プロセッサで RV32IMC 標準ライブラリにリンクされた RV32I 実行ファイルを動かすと問題が発生する
シミュレーションとテスト
- シミュレーションフローでは Xilinx ISIM 14.x と
scripts/ ディレクトリの Makefile を使用
- Linux 版 ISIM でのみテスト済み
- ISIM がデフォルトパス以外にインストールされている場合は
sourceme のパス調整が必要なことがある
- HDL レベルのテスト実行手順は以下のとおり
git submodule update --init --recursive
. sourceme
cd test
./runtests
- ソフトウェアテストには RV32IC ツールチェーン が必要
- 個別テストを GUI 環境でデバッグするには、該当 Makefile を直接実行する
cd system
make TEST=helloworld gui
PCB 設計
- Rev A PCB は iTead の4層 5×5cm プロトタイピングサービスと互換性がある
- README 執筆時点での費用はボード10枚で65ドル
- 回路図はリポジトリ内の
board/fpgaboy.pdf で確認できる
- Rev B は Rev A とかなり異なる形になる予定で、ゲートウェアとブートローダ が成熟するのを待ってから進める状態
- 現在の開発ハードウェアは Snowflake FPGA board に近い形状
合成と対応ボード
- iCE40 向け FPGA 合成には次の オープンソースツールチェーン を使用
- これらのツールは Linux での直接ビルドのみ確認済みで、Windows ビルドは可能とされているが未検証
- Raspberry Pi でもツールチェーンをビルド可能
- Lattice HX8k 評価ボード向け FPGA イメージは次のコマンドで生成する
. sourceme
cd synth
make -f HX8k-EVN.mk bit
- Lattice LEF5UM5G-85F-EVN 評価ボード向けの ECP5 サポート も提供するが、主開発プラットフォームではない高度に実験的な構成
make -f ECP5-EVN.mk BUILD=full bit
- ECP5 ビルドでは、開発ハードウェアの外付け 512KiB・16ビット SRAM を 内蔵 256KiB・32ビット同期メモリ に置き換える
- このメモリは Trellis が ECP5
sysmem ブロックとして構成する
リポジトリ構成
board: RISCBoy メイン PCB と、開発時に使用した小型ボードの KiCad ファイル
doc: 文書の LaTeX ソースと図表、最新ビルド PDF
hdl: RISCBoy ゲートウェアの Verilog ソース
busfabric: AHB-lite クロスバーと APB 周辺機器ファブリック
graphics: ピクセル処理ユニットのソース
hazard5: 完全に独立して構成された RISC-V プロセッサのソース
mem: メモリコントローラとメモリ推論・注入ラッパおよびモデル
peris: UART、SPI、PWM などの小型周辺機器
riscboy_core: RISCBoy の構成要素をインスタンス化して接続する構造モジュール
riscboy_fpga: 複数の FPGA とボードの入出力・クロック・リセットを接続する最上位ラッパ
reference: RISC-V 命令セットなど、RISCBoy で使用された標準 PDF
scripts: 他ディレクトリに属さないスクリプト
software: システムレベルテストで使う C ファイル群で、まだ実用的な ソフトウェアツリー ではない
synth: システム全体合成のための作業ディレクトリで、最上位 Makefile とピン制約ファイルを含む
test: Verilog テストベンチと、プロセッサまたはシステム全体シミュレーションで実行されるソフトウェアテストケースを含む 回帰テスト 集合
1件のコメント
Hacker News のコメント
GitHub ページでは、RISC-V が 2001 年に存在していた並行宇宙の Game Boy Advance と紹介されている
子どもの頃の携帯ゲーム機に向けたラブレターであり、そのゲーム機を動かしていた技術へ午前 3 時に酔っ払って送るメッセージのようなプロジェクトだと表現している
Luke Wren の作品で、彼は Raspberry Pi の ASIC 設計エンジニア。本当に素晴らしいプロジェクトだ
この開発者は、RP2040 で DVI/HDMI を実現した PicoDVI も設計している
https://github.com/Wren6991/PicoDVI
Hazard5コアから分岐したプロジェクトであるGBA は キャッシュのない構造 として設計されていた。内部 RAM、ビデオ RAM、入出力レジスタ、BIOS、OAM、パレットなどを除くと、すべてのアクセスが外部バスを経由し、キャッシュなしで外部バスを使うと実質的に 1980 年代のコンピュータ並みに遅くなる。カートリッジから命令をフェッチする速度も GBC の約 2 倍にすぎない
これを避けるには、キャッシュを使って複数ワードを順次フェッチする必要がある。シーケンシャルアクセスの速度を上げればスループットが増え、命令とデータが十分にキャッシュされていればレイテンシを隠せる。このシステムがすべてのフェッチをメモリバスへ送るのか、それとも キャッシュを使っているのか が気になる
この設計は wafer.space の最初の生産ランで テープアウト された(https://github.com/wafer-space/ws-run1 参照)が、実際に正常動作したのかは聞いていない
PDF で紹介されている プログラマブルなスキャンラインバッファベースのレンダリングパイプライン は、こうした技術に関心があるなら読む価値がある
並行宇宙のハードウェア を想像して作るプロジェクトが本当に好きだ
この新しいハードウェアアーキテクチャを採用する際の最大の難関が、技術そのものなのか、それとも既存の 開発者エコシステムとソフトウェアツールチェーン の欠如なのかが気になる
ソフトウェアツール不足は克服できるが、ゲームライブラリの不在 はより大きな障壁だ。既存タイトルを非常に簡単に移植する方法がなければ、特に難しい
内部で オープンソースの AHB/APB 実装 を使ってもよいという事実に驚いた。ARM の独自技術だと思っていたため、これまで深く学んでこなかった
このプロジェクトの開発者は、現代最高のエンジニアの一人だと思う。これだけでも素晴らしいが、RP2350 の Hazard3 コアと QSPI デバイス も設計している
特にその QSPI デバイスは、これまで触れたメモリマップド QSPI デバイスの中で、唯一クラッシュさせたりハングさせたりできなかった製品だ