Changes between Version 3 and Version 4 of Ex04 ALUの設計とテスト2017


Ignore:
Timestamp:
May 8, 2017 2:05:02 PM (9 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Ex04 ALUの設計とテスト2017

    v3 v4  
    33= 準備 =  
    44今週から、MIPSアーキテクチャのプロセッサを設計します。 
    5 そのために、VerilogHDLを用いた記述方法、シミュレータ、波形ビューアなどの各種CADツールの使いかたを習得します。 
     5そのために、Verilog HDLを用いた記述方法、シミュレータ、波形ビューアなどの各種CADツールの使いかたを習得します。 
    66 
    77== 注意点 == 
    8 CADのツールは、Linuxのサーバーで動作します。プロセッサを設計するためには、Verilogによりプロセッサを記述したり、 
     8CADのツールは、Linuxのサーバーで動作します。プロセッサを設計するためには、Verilog HDLによりプロセッサを記述したり、 
    99テストベンチを作成する必要があり、emacsを使って編集する際にはSolarisのサーバーを使う必要があります。 
    1010今回以降の演習では、"solsv"(Solaris)のターミナルと"cadsv"(Linux)のターミナルの両方を立ち上げて、ファイル編集とCADの利用を使い分けてください。 
     
    2424[[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)]] 
    2525 
     26このALUでは下に示す6種類の演算をサポートします。第5版上巻p.251参照。 
     27 
     28|| ALU制御入力 || 機能 || 
     29|| 0b0000      || AND  ||  
     30|| 0b0001      || OR   ||  
     31|| 0b0010      || 加算  ||  
     32|| 0b0110      || 減算  ||  
     33|| 0b0111      || Set on less than ||  
     34|| 0b1100      || NOR  ||  
     35 
     36ANDは2つの入力の各ビットの論理積、ORは論理和を実行することを意味します。 
     37Set on less than は比較命令で利用される演算で、2つの入力の大小関係によって 0 または 1 を次の表のように出力します。 
     38 
     39|| || ALUの出力 || 
     40|| A < B || 0x00000001 || 
     41|| A ≧ B || 0x00000000 || 
     42 
     43今回作成するプロセッサでは、加算、減算実行時にはオーバフローは想定しません。 
     44オーバフローが発生した場合でも、下位のbitは正しい値が出力されるように設計します。 
     45 
     46== ALUモジュールの作成 == 
     47ALUは3つの入力A,B,ALUoperation、2つの出力ALUresultとZeroをもちます。 
     48 
     49以下は、ALUモジュールのVerilog HDL記述です。 
     50{{{ 
     51module  ALU(A,B,ALUoperation,ALUresult,Zero);     
     52       
     53input [31:0]     A;  
     54input [31:0]     B;  
     55input [3:0]      ALUoperation;  
     56output [31:0]    ALUresult;  
     57output           Zero;  
     58       
     59reg    [31:0]    ALUresult;  
     60wire   [32:0]    tmp;  
     61       
     62      // Output Zero is defined by assign statement       
     63      assign Zero = (ALUresult == 0)? 1'b1 : 1'b0;  
     64       
     65      // tmp is the result of A - B, in 33bit  
     66      assign tmp = {A[31], A} - {B[31], B};  
     67       
     68      // Output ALUresult is defined by always statement  
     69      always @(A or B or ALUoperation or tmp)  
     70        begin case( ALUoperation )  
     71          4'b0000 : ALUresult <= A & B;  
     72          4'b0001 : ALUresult <= A | B;  
     73          4'b0010 : ALUresult <= A + B;  
     74          4'b0110 : ALUresult <= A - B;  
     75          4'b0111 : ALUresult <= {31'b0, tmp[32]};  
     76          4'b1100 : ALUresult <= (~A) & (~B);  
     77          default : ALUresult <= 32'b0;  
     78       endcase  
     79      end  
     80       
     81endmodule      
     82}}} 
     83VerilogHDLの記述方法は、参考図書を参考にしてください。 
     84この記述では、抽象度の高いBehaviorレベルでの設計が行われています。 
     85 
     86加減算における入力AとBは2の補数で表された符号付き32bitデータです。 
     87下位31ビットが数をあらわし、最上位ビットが符号を表します。 
     88 
     89このALU記述では、assign文とalways文を用いています。 
     90両方をalways文で設計することもできます. 
     91加減算、大小比較は、VerilogHDLの算術演算を用いて実現しています。 
     92 
     93上記のVerilog HDL記述をファイル名「ALU.v」として保存してください。 
     94 
     95以降の演習では、ファイル名は「(モジュール名).v」としてください。また、1つのファイルには1つのモジュールを定義します。 
     96 
     97 
     98