トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2017 = 準備 = 今週から、MIPSアーキテクチャのプロセッサを設計します。 そのために、Verilog HDLを用いた記述方法、シミュレータ、波形ビューアなどの各種CADツールの使いかたを習得します。 == 注意点 == CADのツールは、Linuxのサーバーで動作します。プロセッサを設計するためには、Verilog HDLによりプロセッサを記述したり、 テストベンチを作成する必要があり、emacsを使って編集する際にはSolarisのサーバーを使う必要があります。 今回以降の演習では、"solsv"(Solaris)のターミナルと"cadsv"(Linux)のターミナルの両方を立ち上げて、ファイル編集とCADの利用を使い分けてください。 = ALUモジュールの設計とテスト(動作検証) = 算術論理演算ユニット(arithmetic logic unit, ALU)は、加算や減算などの算術演算や、 ANDやORなどの論理演算を行う、プロセッサの中枢部分です。 今週はMIPSプロセッサで使われる32ビットのALUを作成し、 さらにシミュレーションによって動作検証をします。 今回設計するALUの入出力信号は次の図の通りです。 AとBは入力でどちらも32ビット幅です。 ALU制御入力(ALUoperation)は4ビット幅の入力で、演算の種類を指定します。 演算結果(ALUresult)も32ビットで出力されます。 ゼロ判定出力(Zero)は演算結果が32ビットとも0であるときに1となる信号です。 [[Image(http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex04%20ALU%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E3%83%86%E3%82%B9%E3%83%882017/alu.gif)]] このALUでは下に示す6種類の演算をサポートします。第5版上巻p.251参照。 || ALU制御入力 || 機能 || || 0b0000 || AND || || 0b0001 || OR || || 0b0010 || 加算 || || 0b0110 || 減算 || || 0b0111 || Set on less than || || 0b1100 || NOR || ANDは2つの入力の各ビットの論理積、ORは論理和を実行することを意味します。 Set on less than は比較命令で利用される演算で、2つの入力の大小関係によって 0 または 1 を次の表のように出力します。 || || ALUの出力 || || A < B || 0x00000001 || || A ≧ B || 0x00000000 || 今回作成するプロセッサでは、加算、減算実行時にはオーバフローは想定しません。 オーバフローが発生した場合でも、下位のbitは正しい値が出力されるように設計します。 == ALUモジュールの作成 == ALUは3つの入力A,B,ALUoperation、2つの出力ALUresultとZeroをもちます。 以下は、ALUモジュールのVerilog HDL記述です。 {{{ module ALU(A,B,ALUoperation,ALUresult,Zero); input [31:0] A; input [31:0] B; input [3:0] ALUoperation; output [31:0] ALUresult; output Zero; reg [31:0] ALUresult; wire [32:0] tmp; // Output Zero is defined by assign statement assign Zero = (ALUresult == 0)? 1'b1 : 1'b0; // tmp is the result of A - B, in 33bit assign tmp = {A[31], A} - {B[31], B}; // Output ALUresult is defined by always statement always @(A or B or ALUoperation or tmp) begin case( ALUoperation ) 4'b0000 : ALUresult <= A & B; 4'b0001 : ALUresult <= A | B; 4'b0010 : ALUresult <= A + B; 4'b0110 : ALUresult <= A - B; 4'b0111 : ALUresult <= {31'b0, tmp[32]}; 4'b1100 : ALUresult <= (~A) & (~B); default : ALUresult <= 32'b0; endcase end endmodule }}} VerilogHDLの記述方法は、参考図書を参考にしてください。 この記述では、抽象度の高いBehaviorレベルでの設計が行われています。 加減算における入力AとBは2の補数で表された符号付き32bitデータです。 下位31ビットが数をあらわし、最上位ビットが符号を表します。 このALU記述では、assign文とalways文を用いています。 両方をalways文で設計することもできます. 加減算、大小比較は、VerilogHDLの算術演算を用いて実現しています。 上記のVerilog HDL記述をファイル名「ALU.v」として保存してください。 以降の演習では、ファイル名は「(モジュール名).v」としてください。また、1つのファイルには1つのモジュールを定義します。