トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2015 = ブロック図の確認 = 先週紹介した方法で、ブロック図を確認して、全てのモジュールが正しく接続されていることを必ず確認すること。 = 課題1 マルチサイクルプロセッサの動作確認 = 個々の命令をひとつひとつ実行することで、マルチサイクルプロセッサをデバッグします。 テストベンチの例は以下のようになります。 {{{ `timescale 1ns/1ps `include "MIPSmulticycle.v" module MIPStestbench; reg ck,clear; MIPSmulticycle mips(ck,clear); initial begin $dumpfile("MIPStestbench.vcd"); $dumpvars(0, mips); // memory initialization #0 ck = 1'b1; clear = 1'b1; #110 clear = 1'b0; #90 #1000 // execute 10 cycles $finish; end always #50 CK <= ~CK; endmodule }}} 「memory initialization」の部分には、xspimで生成したメモリの初期化ファイルを組合せます。 == テスト用アセンブリコード == http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex09%E8%AA%B2%E9%A1%8C2015/test_instructions.s 1. xspimでプログラムをロードし「dump」ボタンを押す。"testfixture.include"というファイルが生成されます。 1. これから実行するプログラムの実行サイクルを見積ります。各命令は3 - 4サイクル必要ですので、多めにとって5サイクルで換算してください。ループがある場合には、繰り返し回数を考慮してください。 1. テストベンチのテンプレートに"testfixture.include"を挿入してください。 最初から全てのプログラムをテストするのではなく、簡単な命令から動作を確認すること。 == デバッグの方法 == === CLRとPCを確認する === CLR(リセット信号)が0になってからPCの値が0, 4, 8と増えていくはずです。 プログラムの最後はジャンプ命令のため、プログラムが終了するとPCの値は0xa0と0x9cを繰り返すはずです。 まずは、PCの値が正しく変化しているかを確認してください。 === 命令の動作を制御部から調べる === 制御部分のstate信号を値を確認してください。 これは状態遷移図にもとづいて変化するはずなので、命令ごとに状態遷移図と比べてください。 === 命令実行の詳細確認 === stateが0の時に、PCの出力が正しい命令のアドレスを指しているかを確認してください。 さらに、命令メモリの出力が正しい命令コードになっているかを確認してください。 次に、stateが1の時に命令レジスタの出力が正しいかを確認すること。 ==== 算術命令の場合の例 ==== stateは1から6に遷移します。この時に二つのレジスタにそれぞれ正しい値ロードされているかを確認すること。 また、ALUSrcA, B, ALUOpの値を、状態遷移図で定義された値と比べて確認してください。 次にALUの計算結果が正しいかを調べること。 state 6からはstate 7に遷移します。ここで!RegDst, !RegWrite, !MemtoRegが正しいかを確認してください。 レジスタファイルに書き込まれたかどうかを確認するには、次のクロックでstateが0に遷移したところで、 該当するレジスタファイルの部分を調べてください。 ==== 他の命令 ==== 算術命令と同様の方針で、stateの変化毎に制御信号が正しいか、レジスタの値が正しく読み書きできているかを確認すること。 == __動作確認のチェック__ == 演習時間内に、TAの動作チェックをうけてください。 この動作確認は第3回レポートの点数に含みます。配点は12点(25点満点中)とします。 TAからOKがでたら、課題2をおこなうこと。 = 課題2 プログラムの実行 = 全ての命令の実行が正しくなったら、 第2回の演習で作成した乗算のプログラムが正しく動作することを確認しなさい。 なお、xpsim用にADDU命令とした部分は、ADD命令に置き換える必要があるので、注意すること。