演習6-3を解いて見ました。乗算をするサブルーチンがあるという前提でそれを使って階乗を求める問題です。

いきなりPOCOの命令を書こうとしても混乱するので、どのレジスタに何を入れてどう計算してどう判断してというレベルでコメントを先に書き、次に命令に置き換えました。

それにしてもちょっと何かしようとしてもレジスタが壊れるので別レジスタへの退避が必要となります。うまく考えればもう少しレジスタの使用量を減らせるのかもしれませんし、RISCだとこうなるのはしかたないのかまだ判断がつきません。RISCだからじゃなくてレジスタを破壊しないで判定結果をフラグに残す命令をPOCOが持たないから、と考えるべきなのかも。

今日はプログラムを書いただけ。次回シミュレーションして確認します。

本に書いてあるVerilogコードに納得が行ったのでコード入力し、コンパイルが通ることを確認しました。

この位までくると本にもコードの細部まで全ては載っていなかったり、途中で練習問題で追加した機能が説明無しに存在しないことになっていたりしますが、少し考えれば分かる程度のものです。

残るは練習問題2題。早く終わらせて割り込みに進もうと思います。

前回疑問点について書きましたが、あれこれ考えて納得しました。
サブルーチンコールする命令JALの動作が
JAL X: r7<-pc+1, pc<-pc+X+1
なのですが、本に載っているVerilogコードを見る限り、前半のr7<-pc+1と後半のpc<-pc+X+1の間でレジスタへの書き込みイネーブルを落としていないのはおかしいんじゃないかという疑問でした。

が良く考えて見ると、
・クロックのpositive edgeでその時点のレジスタ値を読み込むので詳しく書けば、
JAL X: r7<-pc(positive edge時点の)+1, pc<-pc(positive edge時点の)+X+1
であるから、前半と後半の間で書き込みイネーブルを落とす必要はない。
・POCOは1サイクル(クロックのpositive edgeが1回)で命令が完了する。複数クロックに渡ってフェッチ、デコード、実行を行うわけではない。書き込みイネーブルは命令がJALの間は立っているがJAL命令の実行が終わり次の命令を処理する時は命令が変わるので再びJALなら立つがそうでなければ落ちるから問題ない。
ということですね。

ただ、JALで制御が移ったサブルーチンの中でまたJALを使うとr7を上書きしてしまうので、お作法としてサブルーチンの先頭でr7をソフトでスタックに積んでおき、サブルーチンを抜けるところでスタックから戻しておく必要があるということですね。

その際にPOCOではspはr6固定なのでr6を±1することになります。sp自体はスタックに積んだり戻したりする必要はないところがpcと扱いが違います。

等々、分かっている人には当たり前の事を1つ1つ確認しながら理解を深めて行きたいと考えています。