| | 59 | 以下は、ALUモジュールのVerilog HDL記述です。 |
| | 60 | {{{ |
| | 61 | module ALU(A,B,ALUoperation,ALUresult,Zero); |
| | 62 | |
| | 63 | input [31:0] A; |
| | 64 | input [31:0] B; |
| | 65 | input [3:0] ALUoperation; |
| | 66 | output [31:0] ALUresult; |
| | 67 | output Zero; |
| | 68 | |
| | 69 | reg [31:0] ALUresult; |
| | 70 | wire [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 | |
| | 94 | endmodule |
| | 95 | }}} |
| | 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 | |
| | 123 | module ALUtestbench; // testbench module ALUtestbench do not have inputs and output |
| | 124 | |
| | 125 | reg [31:0] inA; |
| | 126 | reg [31:0] inB; |
| | 127 | reg [3:0] inALUop; |
| | 128 | wire [31:0] outALUresult; |
| | 129 | wire outZero; |
| | 130 | |
| | 131 | ALU alu(inA,inB,inALUop,outALUresult,outZero); // Instance definition |
| | 132 | |
| | 133 | initial |
| | 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 |
| | 159 | endmodule |
| | 160 | }}} |
| | 161 | |
| | 162 | このテストベンチ記述を完成させます。ファイル名は「ALUtestbench.v」とします。 |
| | 163 | |
| | 164 | このテストベンチを実行すると、$DISPLAY文により結果がテキスト形式で表示され、 |
| | 165 | 同時に$dumpfileと$dumpvars文によりVCD形式でファイル「ALUtestbench.vcd」に保存されます。 |
| | 166 | |
| | 167 | == テストベンチの実行 == |
| | 168 | シミュレータは「nverilog」コマンドを使います。 |
| | 169 | |
| | 170 | {{{ |
| | 171 | ncverilog ALUtestbench.v |
| | 172 | }}} |
| | 173 | |
| | 174 | というコマンドで、テストベンチを実行することができます。 |
| | 175 | 最初に文法チェックが行われるので,そこでエラーが発生したら、ファイルを修正してください。 |
| | 176 | エラーがなくなったら、テストベンチが実行されます。 |
| | 177 | $display文による実行結果を確認してください。 |
| | 178 | 実行途中の全ての信号の状態は「ALUtestbench.vcd」に保存されます。 |
| | 179 | |
| | 180 | 波形ビューアsimvisionを用いて実行結果を確認します。 |
| | 181 | simvision起動後、File -> Open Database で、シミュレーションで作成したVCDファイル「ALUtestbench.vcd」を選択します。 |
| | 182 | ファイルの種類をVCD Fileにして、ファイルを選択すること。 |
| | 183 | これ以降は、今までCadenceの統合環境icdsでの作業と同じです。 |
| | 184 | 確認したい信号名を選んで、右上の波形マークをクリックして、波形を確認します。 |