Changes between Version 1 and Version 2 of Ex04課題2015


Ignore:
Timestamp:
Apr 30, 2015 6:17:28 PM (11 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Ex04課題2015

    v1 v2  
    5555 
    5656== ALUモジュールの作成 == 
     57ALUは3つの入力A,B,ALUoperation、2つの出力ALUresultとZeroをもちます。 
    5758 
     59以下は、ALUモジュールのVerilog HDL記述です。 
     60{{{ 
     61module  ALU(A,B,ALUoperation,ALUresult,Zero);     
     62       
     63input [31:0]     A;  
     64input [31:0]     B;  
     65input [3:0]      ALUoperation;  
     66output [31:0]    ALUresult;  
     67output           Zero;  
     68       
     69reg    [31:0]    ALUresult;  
     70wire   [32:0]    tmp;  
     71       
     72      // Output Zero is defined by assign statement  
     73       
     74      assign Zero = (ALUresult == 0)? 1'b1 : 1'b0;  
     75       
     76      // tmp is the result of A - B, in 33bit  
     77       
     78      assign tmp = {A[31], A} - {B[31], B};  
     79       
     80      // Output ALUresult is defined by always statement  
     81       
     82      always @(A or B or ALUoperation or tmp)  
     83        begin case( ALUoperation )  
     84          4'b0000 : ALUresult <= A & B;  
     85          4'b0001 : ALUresult <= A | B;  
     86          4'b0010 : ALUresult <= A + B;  
     87          4'b0110 : ALUresult <= A - B;  
     88          4'b0111 : ALUresult <= {31'b0, tmp[32]};  
     89          4'b1100 : ALUresult <= (~A) & (~B);  
     90          default : ALUresult <= 32'b0;  
     91       endcase  
     92      end  
     93       
     94endmodule      
     95}}} 
    5896 
     97上記の記述をファイル名「ALU.v」として保存します。 
     98以下の演習では、ファイル名は「(モジュール名).v」としてください。 
     99また、1つのファイルには1つのモジュールを定義します。 
    59100 
     101VerilogHDLの記述方法は、参考図書を参考にしてください。 
     102この記述では、抽象度の高いBehaviorレベルでの設計が行われています。 
    60103 
     104このALU記述では、assign文とalways文を用いています。 
     105両方をalways文で設計することもできます. 
     106加減算、大小比較は、VerilogHDLの算術演算を用いて実現しています。 
     107 
     108加減算における入力AとBは2の補数で表された符号付き32bitデータです。 
     109下位31ビットが数をあらわし、最上位ビットが符号を表します。 
     110減算は、減数の2の補数を求めてから加算ししています。 
     111 
     112== テストベンチの作成 == 
     113作成したALUが正しく動作するかどうかシミュレーションによって確認します。 
     114すべての入力値の組み合わせについてチェックするのは 不可能ですから(非常に時間がかかる)、 
     115下の表に示されている入力の組み合わせについてシミュレーションを行い、出力が期待値と一致することを確認します。  
     116 
     117まず、テストパターンをシミュレーションするためのテストベンチのテンプレートを示します。 
     118{{{ 
     119`timescale 1ns/1ps       
     120       
     121`include "ALU.v"   // Include statement of ALU module    
     122       
     123module  ALUtestbench;   // testbench module ALUtestbench do not have inputs and output  
     124       
     125reg [31:0]     inA;  
     126reg [31:0]     inB;  
     127reg [3:0]      inALUop;  
     128wire [31:0]    outALUresult;  
     129wire           outZero;  
     130       
     131ALU     alu(inA,inB,inALUop,outALUresult,outZero); // Instance definition  
     132       
     133initial       
     134 begin       
     135       
     136  $dumpfile("ALUtestbench.vcd"); //Function call for the save of execution results as VCD format to       
     137  $dumpvars(0, alu); //Function call to specify the top module       
     138       
     139  #0 inALUop = 4'b0000; inA= 32'h00000000; inB = 32'h00000000;      //Setting of inputs  
     140       
     141  #100      //Time passes. ALU operates for inputs.  
     142       
     143  $display( $time, " ALUoperation=%h, A=%h, B=%h, ALUresult=%h, Zero=%h",inALUop,inA,inB,outALUresult,outZero);      
     144      // Display of inputs and outputs  
     145       
     146  inALUop = 4'b0000; inA= 32'h0F0F0F0F; inB = 32'hF0F0F0F0;        
     147       
     148  #100        
     149       
     150  $display( $time, " ALUoperation=%h, A=%h, B=%h, ALUresult=%h, Zero=%h",inALUop,inA,inB,outALUresult,outZero);      
     151       
     152     ....  
     153     // In this space, describe other testbench descriptions  
     154     ....  
     155       
     156  inALUop = 4'b0000; inA= 32'h00000000; inB = 32'h00000000; // dummy input  
     157  $finish;        
     158 end       
     159endmodule      
     160}}} 
     161 
     162このテストベンチ記述を完成させます。ファイル名は「ALUtestbench.v」とします。 
     163 
     164このテストベンチを実行すると、$DISPLAY文により結果がテキスト形式で表示され、 
     165同時に$dumpfileと$dumpvars文によりVCD形式でファイル「ALUtestbench.vcd」に保存されます。 
     166 
     167== テストベンチの実行 == 
     168シミュレータは「nverilog」コマンドを使います。 
     169 
     170{{{ 
     171ncverilog ALUtestbench.v 
     172}}} 
     173 
     174というコマンドで、テストベンチを実行することができます。 
     175最初に文法チェックが行われるので,そこでエラーが発生したら、ファイルを修正してください。 
     176エラーがなくなったら、テストベンチが実行されます。 
     177$display文による実行結果を確認してください。 
     178実行途中の全ての信号の状態は「ALUtestbench.vcd」に保存されます。 
     179 
     180波形ビューアsimvisionを用いて実行結果を確認します。 
     181simvision起動後、File -> Open Database で、シミュレーションで作成したVCDファイル「ALUtestbench.vcd」を選択します。 
     182ファイルの種類をVCD Fileにして、ファイルを選択すること。 
     183これ以降は、今までCadenceの統合環境icdsでの作業と同じです。 
     184確認したい信号名を選んで、右上の波形マークをクリックして、波形を確認します。