「実践 コンピュータアーキテクチャ (改訂版)」を買った
最近FPGAで自作CPUをつくることに興味を持ったので、以下の本を買ってみた。VerilogでFPGAに基本的なプロセッサを実装し、プログラムを動かすという内容。
ただ私も今回Perlを初めてつかったので、勘違いしている可能性もあるのでご了承ください。ちなみに私はWindows10 PCを使っており、Perlはインストールが簡単なStrawberry Perlを使った。
実行環境
Windows10 64bit
Strawberry Perl 5.32.1.1
まずは本の正誤表を確認
まず、以下に公式な正誤表がのっており、ちょくちょく更新されているようなのでこちらを確認することをオススメする。私は最初、正誤表の存在に気づかずコーディングしてたので、かなり四苦八苦してしまった…笑
https://www.coronasha.co.jp/np/resrcs/seigo.html?goods_id=6741
私が持っているのは2020年4月30日発行の初版3刷なので、上記の内容をもとにコードを修正した。以下では2022年1月24日現在、正誤表にののっていない内容をメモしておく。
アセンブラPerlコードの修正点
始めに以下の処理&行を分割する処理だが、Perlのversionのせいなのかよくわからないがうまく動作せず。Perlには慣れてないが、そもそもこの書き方で何を置換したいのかイマイチわからず。
$line =~ s/^+//g;
@instruction = split (/+/, $line);
置換の分割をする方はErrorは出ないのだが、splitの方は以下のようにErrorが出た。
Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE / at 32assembler.pl line 11.
一応、いろいろとググッてみて
@instruction = split (/{+}/, $line);
のようにしたらErrorは出なくなったのだが、アセンブリ言語のプログラムを流してもうまく変換できない。コメントを見るに空白を消す意図の処理のようなので、最終的には\sで空白を指定するようにして
$line =~ s/^\s+//;
@instruction = split (/\s+/, $line);
という書き方に落ち着いた(ひょっとしたらプログラムの書き方によってはうまく処理できない可能性もあるかも?)。ちなみに2回目の処理も同じ書き方にした。
あと、これは多分誰でも気づくだろうとは思うが、lui命令の処理だけレジスタ番地の出力処理を呼び出すときにp_r21になっているが、これはp_r2iの誤り。
elsif ($op eq "lui") {p_b(6,3); p_r21($f2, "r0"); p_b(16, $f3); print("\n");}
アセンブリ言語のプログラムの修正点
あと、演習問題の問6.3でも一部書き方が規則に従っておらず、解答と合わない部分があったのでメモしておく。まず以下のandiの命令でr15を指定しているが、これはI型の命令のためレジスタは指定しないので「15」の誤り。一応r15のままでもエラーは出ずに表示はされるが、解答とは合わないので注意。
andi r11, r10, r15
もう一つはすぐ気づくとは思うが、最後のjrの命令はrと31の間にスペースが入っているが、ここはスペースはいらないので「r31」が正しい。
label3: jr r 31
まだ本は読んでいる途中なので、verilogの部分でも何か気づいたメモしておきたいと思う。