Make/Day

毎日なにか作ります

55日目 ~CPUの検証がfailする話~

こんにちは!今日はデジタル回路の話題で更新します。

今回は、以前より実装を進めていたCPUの検証を行っていきます。この検証のおかげで、今までの僕の実装がまぁまぁボロボロだったことが判明しました(|||O⌓O;) なんか色々と詰まっていることを察してもらえれば...という内容になっています。
というわけで、以下の三本立てになります。

これはいけない!過去記事のコードがミスっていた件について

回路シミュレータであるmodelsimには、文法的に正しいかチェックしてくれる機能も付いています。もとのhdl実装では検証まで終わっていたので高を括っていたわけですが、CPU実装でついにボロが出ました。これも根本的なミスで、なんと回路の出力が無いところへ配線を繋げていたり、プログラムカウンタへのクロック提供を忘れていたりしていました、申し訳ありません。48日目の記事を修正して更新しているので、ご確認のほどお願いします。
in-reality.hatenablog.com

突然変わった.cmpフォーマット

次に襲い掛かったのは、ALUの検証の時とは異なるフォーマットとなった.cmpファイルです。
これまで、参考にしてきた書籍についてくるNand2tetrisプロジェクトの提供する理論値はこんな感じでした。

| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 |

しかし、どうもずっと同じわけではなかったようで、

|13+ | 11111|1110110111100000|  0  |*******|   0   |  999|   15|

なんと、こんな感じになってしまいました( ›ଳдଳ‹ ) これまで二進数のみで扱ってきたのに、記号、不定値、十進数と変更点のオンパレードです。しかも、あと一回の検証なのに。(もちろん、書籍が悪いわけではないし、なんならこちらの本の方はさらに細かな検証を行っています)ということで、結局手打ちで残りは自分のフォーマットへ変更させていただきました。

0000000000000000_0011000000111001_0_xxxxxxxxxxxxxxxx_0_000000000000000_0000000000000000
0000000000000000_0011000000111001_0_xxxxxxxxxxxxxxxx_0_011000000111001_0000000000000000
0000000000000000_1110110000010000_0_xxxxxxxxxxxxxxxx_0_011000000111001_0000000000000001
... ... ...
... ...
...

*になっていた不定値はxに変更してみました。これなら、verilogでの比較の際に不定値として扱えると思います。さて。これをテストベンチに与えて動作を確認してみます。

検証開始!なんもわからん!( ๐_๐)

もう見出しでお分かりいただけると思います。とりあえず、結果の一部を貼ります。

でん!!

比較結果が一致していません。つまり、シミュレーション的には失敗ということですね。しかも、これがすべての行で生じています。
すべてにエラーが出ているので、どこが悪いのか現状ではわかりませんが、とりあえず回路からの出力も表示するようにして細かく検証を進めたいと思います。もしかしたら、比較が上手くできていないだけかもという、淡い期待も抱いていたりするのですが、実際はどうなるのでしょうか?とりあえず、頑張ります(`・ω・´)