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のアーキテクチャの図を下に載せておきます.(コード書いた後にまとめなおしたものなのでミスがあるかもしれない)
アセンブラ
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