「DOOMはあらゆるものの上で動く」と言われる。1993年に発売されたこのFPSは、トースターから細菌にまで移植されてきた。だが自分で設計したCPUの上で動かした人はほとんどいない。学生のArmaan Gomes氏とLiam氏は、論理ゲートの段階から自作したRISC-V CPUにDOOMを移植し、最終的に毎秒15〜20フレームでプレイできるところまで到達した。
2人がそれまで自作CPUで動かしていたのは、Pongやマンデルブロ集合を描くプログラムだった。1990年代のゲームに挑むには2つの壁がある。1つはメモリーで、当時の設計はFPGA内蔵のBRAMしか使えず容量は1MB未満だった。DOOMの体験版データ「doom1.wad」だけで14MBある。もう1つは速度で、現代のPCには何でもないDOOMも自作CPUには重すぎた。
Gomes氏はメモリー統合を担当した。外部のDDR3メモリーはBRAMと違って遅く、応答までの時間も一定しない。すべての操作をDDR3に投げればCPUは這うような速度になる。そこで、よく使う領域をBRAM側に保持するキャッシュを設けた。命令用とデータ用の2つを独立して動かし、両方が同時にメモリーを要求したときは調停回路が順番待ちさせる。片方が待たされ続けないよう、パイプライン下流のデータキャッシュを優先した。
移植の過程では、CPU自体のバグが次々と露呈した。数百命令にまたがる無限ループに落ちる、脈絡のない番地に飛ぶといった症状が出るが、原因がDOOM側のコードなのか自作CPUなのか切り分けられない。2人はプログラムを段階的に複雑にしながら検証し、初代の単一サイクル設計から残っていた不具合まで掘り起こした。
シミュレーション上では動くのに実機では動かない、という壁にも突き当たった。DDR3メモリーの初期値をランダムな値に設定してシミュレーションし直すと、DOOMだけが同じように壊れた。DOOMは未初期化のメモリーがゼロで埋まっている前提で書かれていたが、実機はそうではなかった。
ようやく動いたときのフレームレートは0.7fpsだった。ここからの高速化がむしろ本番になる。動作周波数を100MHzから125MHzに上げて約20%、命令取得部の無駄をなくして2.5fps、乗算命令の追加で3.5fpsに達した。画面バッファのコピーを省いてVGA側のメモリーに直接書き込み、キャッシュのヒット時の遅延を2サイクルから1サイクルに縮めて6.7fpsまで来た。
最後に効いたのはコンパイラーの最適化だった。それまで最適化を一切かけない設定でビルドしていたが、有効にすると必ずクラッシュする。原因は、ハードウェアタイマーを指すポインターにvolatile修飾を付け忘れていたことだった。コンパイラーが「このタイマーには書き込まれない」と判断してコードごと消していた。修正後、DOOMは15〜20fpsで滑らかに動いた。2人は現在アウトオブオーダー実行の実装を進めており、30fpsを目指すとしている。