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で実装していく。