FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

アーキテクチャを理解したいなら、ISSを自作しよう、のススメ

RISC-Vの実装を作るために、検証用の命令セットシミュレータを今日はずっと作っていた。 まあ、前もMIPSのやつをベースに改造してたのだけれども、MIPSのやつを拡張していたらだんだん大変になってきて、もうちょっと拡張性の高いISSを作ろう、と思った。

ISSを自作する理由としては、そのISAをちゃんと理解できるから。また、CPUを自作するときも、検証用にISSを利用できる。 だから、どちらかというとISSは、RTLの挙動を確認しやすいログを出すようにしている。 あるいは、RTLの難しい部分をチェックできるようなログの出し方を心掛けるようにしている。 最初にスーパスカラを実装したときは、フリーリストとかリオーダバッファの、ある程度はISSで予測できる情報はISSのログとして出力し、 RTLシミュレーション時に比較するようにしていた(それでいくつかのバグを潰せた)。

今回、ISSを作り直すことにした理由は、主に扱っているISAをRISC-VとMIPSの2つにしたからだ。どうせなら、基本的なエンジンの部分を共通化したい。 そうなると、ある程度の柔軟性と拡張性が必要になる。 まず、デコーダの決め打ちは良くない。命令の情報から、デコーダを自動的に出力できなければならない。 このために、まずは今日はデコーダの生成スクリプトを作っていた。

命令のビットフィールドと、デコードキーからの情報で、次にどのビットをデコードしていくかを指示していく(さすがにこの部分の自動化は難しいと思ったので、妥協している)。 このデコードのビットフィルードの順番情報を入力しておけば、あとは勝手にデコードのための関数を作成し、並べておいた命令のどれに該当するかを判定してくれる、という訳だ。 その情報に応じて今度は実際の命令本体の関数を呼び出せばよい。

ISSを作ると、そのISAのデコードのしやすさや、どのような考え方に基いてその命令セットが設計されているかが分かるようになる気がする。 そのためにも、ISSを自作するのは大事かな、と思っている。

作成したISSMIPS版も含めて、githubに公開していく予定だ。