トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2016 = 概要 = これまで設計してきたJR命令とJAL命令の拡張済みのマルチサイクルプロセッサには、 32ビット乗算器が含まれていません。 そのため、アセンブリコードの演習では乗算を加算とシフトの組合せで実現する必要がありました。 この課題では、以下の説明に従ってALUに乗算器を追加し、乗算命令を実行できるマルチサイクルプロセッサを設計します。 == 課題1 == 第5回の講義ノート( http://web-int.u-aizu.ac.jp/~miyazaki/comparch-15/lecture/comparch-5-alu2.pdf )の説明を参考に、 Verilog HDLで16ビット乗算器を設計し、その動作をテストベンチにより検証しなさい。 なお、この乗算器をALUに組み込むため、乗数・被乗数は32ビットとし、乗算はそれぞれの下位16ビット同士の計算を実現すればよい。 この場合乗算の結果は最大で32ビットになるので、結果の出力も32ビットとすること。 この問題では、HDLの既述で加減算に「+/-」を使って構わないが、乗算に「*」を使ってはいけない。 === 乗算器入出力テンプレート === {{{ module mul32(x, y, z); input[31:0] x, y; output[31:0] z; endmodule }}} === ヒント === 最も単純な実現方法は講義ノートに書いてある方法になる。 具体的には、「z = x*y」を16ビットで計算する場合、部分積は16個になる。 つまり、答える得るためには16個の部分積を足し合わせればよい。 それぞれの部分積は、yのそれぞれのビットが真か偽かに応じて"x"または"0"になる。 ただし、桁を正しく合わせる必要があることに注意すること。 余裕がある場合にはBoothのアルゴリズムについても検討すること。 レポートでBoothのアルゴリズムによる実装をおこなった場合、ボーナス点を与える。 == 課題2 == 作成した乗算器をALUに組み込み、乗算命令をサポートしたマルチサイクルプロセッサを設計しなさい。 そのためには、ALUモジュール、ALU制御モジュールを拡張することが必要である。 === テストプログラム === {{{ .data A: .word 19 B: .word 75 C: .word 0 .text main: lw $8, A lw $9, B mul $10, $8, $9 sw $10, C exit: j exit }}} このコードをxspimでアセンブルすると {{{ [0x00001000] 0x8c085000 lw $8, 20480($0) [A] ; 7: lw $8, A [0x00001004] 0x8c095004 lw $9, 20484($0) [B] ; 8: lw $9, B [0x00001008] 0x71095002 mul $10, $8, $9 ; 9: mul $10, $8, $9 [0x0000100c] 0xac0a5008 sw $10, 20488($0) [C] ; 10: sw $10, C [0x00001010] 0x08000404 j 0x00001010 [exit] ; 11: j exit }}} となる。乗算命令に対応する機械語は「0x71095002」である。 R形式命令であることに注意してOPCODEとFUNCTがどうなるかを考えること。 == 課題3 == 乗算を利用するプログラムの例として、Ex03「再帰手続き呼び出し」の動作をシミュレーションで確認しなさい。 ただし、階乗はN = 9まで検証すればよい。