トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2016 = 概要 = JR命令および、JAL命令を実行できるようにマルチサイクルプロセッサを拡張する。 これまで設計したマルチサイクル方式プロセッサは、JAL命令およびJR命令は実装されていません。 この課題では、これらの命令を実行できるようにします。 そのためには、データパスと制御部分を拡張する必要があります。 これまで作成した回路も、レポート提出に必要ですので、動作可能な状態で保存をしておいてください。 JR命令とJAL命令を実現するために必要なデータパスの変更は http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex10%E8%AA%B2%E9%A1%8C2016/JAL-JR-datapath.pdf を参照すること。 このPDF図で"Op"と"Op2"とある命令コードの名前は、Ex09のテンプレートではそれぞれ"OP1"と"OP2"という名称で定義しているので注意してください。 状態遷移としてstate 13を14を加えます。それぞれの場合について説明します。 == JR命令 == JR命令の場合、state 0で命令をフェッチしたのち、state 1の次に13に遷移します。 JR命令は、命令フィールド![25-21]で指定されたレジスタの内容にジャンプします。 ジャンプを実現するには、適切な値をPCに転送することが必要です。 ブロック図から、命令フィールド![25-21]で指定されたレジスタの値はレジスタAに格納されていることがわかるので、 この値をPCに転送するために、PCのロード入力に接続されているマルチプレクサの入力を増やし、 その入力とレジスタAの出力を接続しました(データパスの変更を参照)。 最終的に、state 13ではPCSourceを適切な値に設定することで、レジスタの値はPCに転送します。 == JAL命令 == JAL命令は、サブルーチンの実行時などに利用され、通常のJUMP命令(state 9を参照)と同様の動作に加えて、 あとで戻ってくるアドレスの値(PC+4)をレジスタ31に保存します。 PC+4の値は state 0において計算されておりPCに格納されています。 この値をレジスタに格納するために、!MemtoReg(2 bitに拡張)が制御するマルチプレクサを3入力にし、 PCの出力をそのマルチプレクサに接続します(データパスの変更を参照)。 また、格納するレジスタの番号は31に固定なので、RegDstの接続されているマルチプレクサを3入力にし、 レジスタ番号31を選択できるようにします。 最終的に、state 14ではJUMP命令と同様の動作に加えて、MemtoRegとRegDstを適切な値に設定し、 RegWriteをアサートすることで、PC+4の値をレジスタ31に保存します。 == 主制御ユニットの変更点 == * state 13(JR命令)とstate 14(JAL命令)を追加。いずれも、そのあとはstate 0に戻る。 * JR命令をR形式命令と区別するため、命令フィールド![5-0]を入力に追加する。これの名称はOp2とする(図参照)。 * それに伴い、R形式命令の判定部分の論理を変える必要がある。JR命令の場合(Op2 == 0x8)と「それ以外」の通常のR形式命令にわけて考える。 * PCSource、!RegDst、MemtoRegのビット幅が変更になる。 == データパスの変更点 == * MemtoRegが制御するマルチプレクサを3入力にする。増えた入力はPCに接続。 * RegDstが制御するマルチプレクサを3入力にする。増えた入力はジャンプ先のアドレスを保存するレジスタのアドレス31になる。 * PCsourceが制御するマルチプレクサを3入力にする。増えた入力はレジスタAの出力。 = 問題1 = 以上の説明をもとに、拡張したデータパスと制御部を設計し、動作確認をしなさい。 動作確認には、Ex3の「課題6:手続きを用いた行列の積アルゴリズム」を使うこと。 このプログラムでは、スタックポインタ$SPを用いるので、プログラムの最初に ori $sp, $0, 32767 命令を挿入し、スタックポインタを初期化します。32767はメモリの最大アドレスです。 追加したプログラムを用いて、xspimを 利用してtestfixtureファイルを作成しテストベンチファイルを作成します.それをverilogに与えて,シミュレーションを実行します。 注意:Addu命令はAdd命令に置き換えておきます。 テストベンチのなかで、$displayコマンドを用いてメモリ領域Cの値を出力させます。 領域Cのアドレスはxspimで確認してください。 = 問題2 = 同様に、Ex3の「再帰手続き呼び出し」をシミュレーションしてください。 その際に、mul命令はサブルーチン呼び出しに変更すること。 問題1と同様にアセンブリプログラムにスタックポインタの初期化を追加し、動作確認を行ってください。 $displayコマンドで、メモリ領域FNの値を出力させます。領域FNのアドレスはxspimで確認してください。