RISC-Vを目標にCPUとOSを自作する話(実装編1:命令を削った8bit CPU)
はじめに
動かしてわかるCPUの作り方10講を参考にしてみた。
ただ、最初に触るにはリッチすぎると感じた。
命令も多く、完成形に近いCPUだった。
ファミコンだって8bitだ。
それでも、この本のCPUは全然シンプルじゃない。
命令は多いし、やれることも多い。
最初はこのまま作ろうと思った。
だが違った。
今の自分に必要なのは“完成形”じゃなくて“最小構成”だ。
このままでは猫に小判だ。
だから削る。
まずは16bitではなく、8bitに落とす。
扱うものが多すぎると理解できない。 まずは小さくして、全部見えるようにする。
前提知識
コンピュータの演算は、基本的に単純な操作の組み合わせで成り立っている。
まず加算。これは最も基本となる演算である。
5 + 2 を計算する
5 = 0101
2 = 0010
0101
+ 0010
-------
0111
→ 0111 = 7
次に減算。
5 - 2 を計算する
5 = 0101
2 = 0010
減算は加算に変換する
→ 2の補数を使う
0010 → 1101(ビット反転)
1101 + 1 → 1110
これを足す
0101
+ 1110
-------
10011
桁あふれ(最上位ビット)は捨てる(固定ビット幅のため)
→ 0011 = 3
このように、減算は加算として扱うことができる。
また、掛算や割算も専用の命令がなくても、加算や減算と分岐の組み合わせで実現できる。
シフトを使うことで高速化は可能だが、これは最適化であり必須ではない。
つまり、コンピュータの演算は
これらの単純な操作の組み合わせで成り立っている。
方針の再確認
前回、命令を削って最小構成にする方針を決めた。
そのため今回の実装では、 あえてシフト命令などは入れずに進める。
まずは最小の命令セットでどこまで表現できるかを確認する。
実装する命令
今回実装する命令は以下とする。
- ADD(加算)
- SUB(減算)
- LD(メモリ→レジスタ)
- ST(レジスタ→メモリ)
- JMP(無条件ジャンプ)
- JE(条件ジャンプ)
- MOV(レジスタコピー)
- HLT(停止)
目標
この命令セットを使って、
- 加算
- 減算
- 掛算(加算の繰り返し)
- 割算(減算の繰り返し)
を実現する。
テスト方針
実装したCPUが正しく動作するかを確認するために、 簡単なプログラムを実行する。
例えば:
- 3 × 4
- 10 ÷ 2
などのケースを用いて、 レジスタやメモリの値が期待通りになるかを確認する。
今回やらないこと
回路レベルの実装については今回は扱わない。
例えば、加算器は半加算器や全加算器の組み合わせで実現されるが、 これは別の機会に扱うことにする。
まとめ
複雑な命令を最初から用意するのではなく、
最小の構成から始める。
そこから、必要になったものだけを追加していく。
今回は命令セットを削り、最小構成のCPU設計を決めた。
次はいよいよ、このCPUを実際に動かすための エミュレータをRustで実装していく。