演習6-3が終わりました。

レジスタ間で値をコピーするMV命令を実行するとコピー先のレジスタの値が不定になるのは、書き込む値を決めている部分で未定義の信号の値による分岐があったためでした。以前はその信号は定義していたのですが、後から不要となったため定義を消しました。しかしVerilogでは未定義の信号でもwireだと解釈するのかエラーとはならず、しかし値は不定となるため挙動がおかしくなっていたようです。

Verilogの処理系によってはエラー検出できるものもあるかもしれませんが、少なくとも今回はエラーにはならなかったので問題箇所の特定に手間取りました。

でも、こういうことで躓いて理由を追いかけると勉強になりますね。

演習6-4をやれば第6章も終わりです。一気に終わらせたいところですが年度末で忙しく中々時間がとれません。もうしばらくはこのペースが続きそうです。

演習6-3のデバッグ中です。

アセンブラプログラムを確認しましたが間違ってなさそうです。ただし使用するレジスタを減らしても同じ結果を得ることができることには気付きました。ハンドアセンブルも間違ってなさそうです。

シミュレーションのログを調べるとMVコマンドが正しく動作していないことが分かりました。MVコマンドはレジスタ間のコピーをするコマンドです。MVコマンドを実行するとコピー先のレジスタの値が不定になっていました。

どうやらVerilogコードに間違いがあったようです。MVコマンドがどのように処理されるか調べていますがまだ問題箇所は特定できていません。丁寧に追いかけてみようと思います。

演習6-3をシミュレーションしてみました。

うーむ残念。やはり1発正解とは行きませんでした。

プログラム自体に間違いがあるかも知れないし、まだアセンブラがないためハンドアセンブルしましたからその間違いかも知れないし、Verilogコードに間違いがあるかもしれないし、デバッグは大変そうです。

一旦はプログラムとハンドアセンブルの結果と実行時のログ(POCOのレジスタの値の変化の記録)を見比べて問題箇所を探して見ますが、それで分からなければPOCOの命令を1命令だけ実行するプログラムで命令が単体では正しく動くかを確認して原因を追究してみようと思います。

でも次回からはやりアセンブラが必要ですね。わずか18命令のプログラムでもハンドアセンブルはきついです。特にラベルの解決が面倒(^_^;

それにしてもこの時代にハンドアセンブルすることになるとは。。貴重な経験ができて良かったです。祝!初体験(^0^)/