動かしてわかるCPUの作り方 第10講

第10講 パイプライン処理により高速化する

いよいよ最終章。そのまえに、GHDLのシミュレションでWarningが出ている。不定値を整数に変換するところで出ていること、実際の入力もそうなっているところまでは検証できた。気になって色々模索したが、原因の特定には至らなかった。おそらく、ROM/RAMのアドレスが不定になっていて、電源投入直後のリセットが同期式のためにしばらくリセットできないことが関係していそうである。ModelSIMだと問題ないのだろうか。

パイプライン化によるハザード解消のために、NOP命令が追加される。NOP命令追加は2段階ある。まずは、CPU_emulatorに立ち戻って対応し、さらに機械語を生成した。その後、VHDLの実行ユニットでも対応した。さらに、ハザードの生成を検出してフラグを立て、2ステージ何もしない状況を追加した。

実装時には、ハザード解消のために2ステージ実行するときに、プログラムカウンタはインクリメントする理由がよく分からなかった。波形を見ながら動作を追った結果、理解できた。実行ユニットでは2ステップの間何もしないが、命令フェッチとデコードは新しいプログラムカウンタで処理しなければならない、というだけのことであった。さらにいうと、後段のRAMへの書き込みも無効になっているので、何も起きないことになった。

シミュレーションの結果、RAMへの書き込みが上手くなされず、出力値が出ていない事に気がついた。書き込みフラグが立っていないところまで突き止めて、ソースに戻って確認した。遅延させたアドレスを見ておらず、変なアドレスに書き込んでいることが判明した。だんだんデバッグも分かってきた気がする。

ところで、書籍の完成度が終盤になるほど低下しているのが気になった。コード変更箇所を赤くするという方針が、守られていないところや一貫していないところがある。いくつかは気がついたのだが、1箇所は見落として上記のバグを作り込んでしまった。

感想

本書籍は、4ステージパイプラインにすることを前提として、最初から最後まで天下り的に設計が提示される。かなり分かった気になれるが、どうしてこうするのが良いのか、といった深い部分の理解は難しそうである。CPUはある意味教育用として枯れた題材なので、そういうものでも良いのかもしれない。

動かしてわかる CPUの作り方10講

動かしてわかる CPUの作り方10講

  • 作者:井澤 裕司
  • 発売日: 2019/08/21
  • メディア: 単行本(ソフトカバー)