RISC-Vもどきを作った話

はじめに

学校の課題でCPUの設計を行うといったものが出ました. そこで,せっかくCPUを設計するなら頑張ってみようと思ったのでRISC-Vのサブセットを命令セットに持つCPUを設計してみました.

命令セット

今回,設計したCPUの命令セットはRV32Iのサブセットにしました. 実装したCPU命令を一覧が下の表です.オペランドなど詳しい説明は別のところを見てください. 大方の命令は実装しました.

命令 簡単な説明
ADD 加算
SUB 減算
SLL 左シフト
SLT 符号付比較
SLTU 符号なし比較
XOR 排他的論理和
SRL 論理右シフト
SRA 算術右シフト
OR 論理和
AND 論理積
ADDI 即値との加算
SLTI 即値との符号付比較
SLTIU 即値との符号なし比較
XORI 即値との排他的論理和
ORI 即値との論理和
ANDI 即値との論理積
SLLI 即値分左シフト
SRLI 即値分右論理シフト
SRAI 即値分右算術シフト
LUI レジスタの上位20bitをセット
JAL 即値分ジャンプ
JALR レジスタ+即値にジャンプ
BEQ 等しいときにジャンプ
BNE 等しくないときにジャンプ
BLT (A<B)のときジャンプ (符号付比較)
BGE (A>=B)のときジャンプ (符号付比較)
BLTU (A<B)のときジャンプ (符号なし比較)
BGEU (A>=B)のときジャンプ (符号なし比較)
SW レジスタの内容をメモリにセット
LW メモリの内容をレジスタにセット

CPUの構成

設計したCPUのアーキテクチャの図を下に載せておきます.(コード書いた後にまとめなおしたものなのでミスがあるかもしれない)

f:id:tadaren:20210208204634p:plain

アセンブラ

CPUの動作テストをするために簡単なアセンブラPythonで実装しました. これには,上記の命令と即値をレジスタにセットするLUI+ADDIの2命令に変換される追加命令を実装しました.

書いたコード

書いたコードはGitHubにおいてあります.(https://github.com/tadaren/CPU_RV32I) テスト用に書いたアセンブリとそれのアセンブラも一緒においてあります.

感想

授業きっかけで,漠然とやりたいと思ってたCPUの設計ができてよかった. CPU設計をする面でいえば,RISCとかみたいに命令数が少なくて,固定長なほうが楽だとは思った.けど,コンパイラを考えると,もっと命令はあるほうが実装は楽だと思う,比較命令のとかを見ると,順番を入れ替えたりしてアセンブリにしていくのとか地味に面倒だと思う. 大体半月ぐらいの余裕時間の半分をこれに咲いたけど,一部命令を時間の問題で実装できなかったのは非常に残念です.いったんこれでやめるけど,また時間ができたら続きを実装したいと思う.それに,コンパイラとかも書いてみると面白そうなのでやってみたい. CPUの構成も,今回は1クロックですべて回すようにしたから,クロックをそんなに早くできないと思うけど,今度はパイプラインとかもやってみたいと思う.

参考にしたサイト

http://exp.mtl.t.u-tokyo.ac.jp/2020/b3exp/wikis/RISCVISA http://am.ics.keio.ac.jp/parthenon/rvmicro.pdf https://www.k0b0srecord.com/entry/2018/02/14/112505