RISC-V CPUを一から設計して「DOOM」を移植、最大20FPSでプレイすることに成功

学生で開発者のアーマーン・ゴメス氏らが論理ゲートの段階から設計した独自のCPU上で、1993年発売のFPS「DOOM」を動作させることに成功しました。当初は0.7FPSでしか描画できませんでしたが、CPUやメモリ周辺の改良を重ね、最終的には15~20FPSでプレイできる水準まで高速化しています。
Running DOOM on our Custom CPU and Going Viral | Armaan Gomes
https://armaangomes.com/blogs/doom/
DOOMはid Softwareが1993年に発売したFPSで、後のゲームに大きな影響を与えました。ソースコードが公開されていることや比較的限られた計算資源でも動作することから、トラクターや妊娠検査キット、超音波スキャナーなどさまざまな機器への移植が行われています。
ゴメス氏らは、オープンな命令セットである「RISC-V」に基づくCPUを論理ゲートのレベルから設計し、FPGA上に実装しました。RISC-Vは、CPUがどのような命令を処理するかを定めた公開仕様で、今回開発されたCPUは32bitの整数演算を行う基本仕様「RV32I」に対応しています。これまでにも自分たちのCPU上で「Pong」やマンデルブロ集合を描画するプログラムを動かすことに成功しており、市販された本格的なゲームを実行するのはDOOMが初めてだったとのことです。
DOOMを動かすうえで、最初の大きな問題となったのがメモリ容量でした。FPGA内部には高速に読み書きできるメモリがありますが、容量は1MB未満で、約14MBあるDOOMのゲームデータを保存するには足りません。そこで開発チームは、容量の大きいDDR3メモリをCPUに接続しました。
しかし、DDR3は容量が大きい一方で、データを読み出すまでに時間がかかるため、そのままではCPUが何度も処理を待たされてしまいます。この待ち時間を減らすため、よく使うデータを高速な内部メモリに一時保存するキャッシュを追加しました。CPUが実行する命令と、ゲーム内で使うデータをそれぞれ別のキャッシュに保存し、必要な情報をできるだけ素早く取り出せるようにしています。また、CPUには複数の命令を少しずつ並行して処理する仕組みも採用されました。
DDR3メモリの接続後には動画を読み込んで画面に表示するテストも行われました。大容量の外部メモリから映像データを連続して読み出し、画面へ出力できることが確認できました。
画面表示やキーボード操作にも専用の仕組みが必要でした。映像を出力する回路をHDMI端子につなぎ、キー入力についてはノートPCから信号を送る方式を採用しています。
DOOMの移植には、さまざまな機器で動かしやすいように作られた「doomgeneric」が使われました。それでも、画面表示やファイルの読み込みなどで問題が相次ぎ、原因がDOOM側にあるのか、自作CPU側にあるのかを一つずつ調べる必要があったそうです。
実際にDOOMを動かすと、CPUが同じ処理を繰り返して止まったり、誤った場所にある命令を実行したりする不具合が見つかりました。また、ゲームのデータを保存する仕組みが、実行中の命令を誤って書き換えてしまう問題も発生しています。

DOOM全体は非常に複雑なため、開発チームは小さなテストプログラムを使ってCPUの動作を確認しました。その結果、それまでの単純なプログラムでは見つからなかった複数の不具合を特定し、少しずつ修正していきました。
また、「PC上のシミュレーションでは動くのに、実際のFPGAではDOOMが停止する」という問題も発生しました。調査の結果、ゲーム側が「使用前のメモリには0が入っている」と想定していた一方、実際のメモリには不規則な値が残っていたことが原因だと判明し、プログラムを修正することで起動に成功しました。

最初にDOOMが動いたときの速度は約0.7FPSで、画面が数秒ごとに切り替わる状態でした。
そこでCPUの動作速度を上げ、無駄なメモリアクセスを減らしたことで、約2.5FPSまで高速化。さらに、RISC-Vの乗算命令に対応する拡張仕様「Zmmul」を追加し、掛け算をCPUで直接処理できるようにしたことで、速度は約3.5FPSまで向上しました。
また、画面表示の方法やキャッシュの処理も見直した結果、約6.7FPSに達したとのこと。そして、プログラムを自動的に効率化するコンパイラーの最適化を有効にしたところ、DOOMは15~20FPSで動作するようになりました。もちろん最新のゲーム機と比べれば滑らかとはいえませんが、自作CPU上で実際に操作して遊べる水準に達しています。
以下は実際にDOOMを20FPSでプレイしているところ。
ゴメス氏は今回の開発を通じて、CPUやメモリの設計だけでなく、複雑なシステムの不具合を段階的に調べる方法も学べたと述べています。今後はさらにCPUを高速化して30FPSを目指すほか、映像処理用のGPUも自作し、「Quake II」を動かす構想を示しています。
なお、ゴメス氏は「開発ではAIを積極的に利用したものの、AIがCPUやDOOMの移植を自動的に完成させたわけではない」と説明しています。AIはコードの作成や修正案の提示、エラーの原因調査などを助ける道具として役立った一方、誤った回答を返すこともあり、提案が正しいかを判断して実機で検証するには、CPUの仕組みや低レベルのプログラミングに関する知識が欠かせなかったとのことです。
・関連記事
ワイヤレスイヤホンで「DOOM」を動かしてリモートでプレイすることに成功 - GIGAZINE
ネズミに「DOOM」をプレイさせる実験装置が新たなレベルに到達してネズミが敵を撃てるように - GIGAZINE
レシート用プリンターをゲーミングPCに改造して「DOOM」をプレイすることに成功 - GIGAZINE
AnkerのUSB充電器でDOOMをプレイすることに成功 - GIGAZINE
Apple純正のLightning用変換アダプタでDOOMをプレイする猛者が登場 - GIGAZINE
ニンテンドーゲームキューブでWindows NTとDOOMを動かすことに成功 - GIGAZINE
・関連コンテンツ
in 動画, ハードウェア, ソフトウェア, ゲーム, Posted by log1i_yk
You can read the machine translated English article We designed a RISC-V CPU from scratch, s….







