「プログラムがコンピュータで動く仕組み」の読書メモ
2章
2.1.2 でカウンタ回路を設計するが、ここでカウンタ回路を作る意図は説明されない
○○な理由でカウンタが欲しいので作る、という説明が欲しいなあ
2.2 でステートマシン回路を設計するが、なぜステートマシン回路が必要かがいまいち説明されない
「ここではTinyCPUの状態を制御するステートマシン回路を設計する。」とあるだけ
2.3 で設計するスタックは4段しかない
このスタックは式の計算に用いるのだろうか?目的が書いてないので現時点では不明
3章
2.3で設計した4段スタックを用いて計算を行う
リスト3.1で、論理演算の種類を表す5ビットの最上位ビットにより、スタックをpopするかどうかを決めている
2項演算子は最上位ビットが0、単項演算子は最上位ビットが1になっているのでこんなことができる
表1.4で論理演算の種類それぞれに数値を割り当てているが、ここで単項演算子は最上位ビットを1にしている
表1.4の時点では何故そのような数値割り当てにしているかは説明されておらず、とても天下り的
3.2で、プログラムカウンタpc0と命令レジスタir0にカウンタ回路を用いているのは上手いが名前付けが混乱の元
カウンタ回路にはロード機能があり、カウント機能をオフにしておけば汎用レジスタとして使える
もはやカウンタではないので、counterという名前が混乱を招いている
リスト3.3の解説でプログラムの意図の説明が不十分
プログラムを単に日本語で説明するだけで、意図が説明されていない箇所がある
例
コード counter #(16) ir0(.clk(clk),.rst_n(rst_n),.load(cs==\`FETCH),.inc(1'b0),.d(ramout),.q(irout));
解説「12行目でカウンタ回路を16ビットとしてインスタンス化し命令レジスタir0としている。入力ポートloadをcs==\`FETCHとしているので、状態がFETCHのときにloadが1となる。また、出力ポートqを配線(出力ポート)iroutに接続している。
上記の例は、コードをそのまま日本語で説明しているだけであり、「カウンタ回路のカウント機能を無効にし、汎用のレジスタとして使う」という意図がどこにも書かれていない
3.4.2バスを用いた拡張命令フェッチ回路
FETCH/EXECと状態遷移する意図がここで判明する
それは、メモリアドレスバスに「命令フェッチ」「値書き込み」の2種類のアドレスをインターリーブするため