| | 1 | トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2015 |
| | 2 | = ALUの制御 = |
| | 3 | 第4版上巻p.291の「ALU制御ユニット」の項を参考にして、ALUを制御するためのユニットを設計します。 |
| | 4 | |
| | 5 | まずここで設計するALU制御ユニットのテンプレートは以下のようになります。 |
| | 6 | |
| | 7 | {{{ |
| | 8 | module ALUcontrol(ALUop,FA, FB, ALUoperation ); |
| | 9 | |
| | 10 | input [1:0] ALUop; |
| | 11 | input [5:0] FA;// {F5,F4,F3,F2,F1,F0} |
| | 12 | input [5:0] FB;// {F31,F30,F29,F28,F27,F26} |
| | 13 | output [3:0] ALUoperation; |
| | 14 | wire ALUOperation0, ALUOperation1, ALUOperation2; |
| | 15 | |
| | 16 | assign ALUoperation0 = ...; |
| | 17 | |
| | 18 | assign ALUoperation1 = ...; |
| | 19 | |
| | 20 | assign ALUoperation2 = ...; |
| | 21 | |
| | 22 | assign ALUoperation = {...}; |
| | 23 | endmodule |
| | 24 | }}} |
| | 25 | |
| | 26 | ALUop(2 bit)は主制御ユニットからの入力です。FAとFB(それぞれ6 bit)も入力です。 |
| | 27 | これはMIPS命令(32 bit)の一部を表します。 |
| | 28 | 命令の各ビットを下位からF0-F31とした時に、FAはF0 - F5を、FBはF26 - F31を表すこととします。 |
| | 29 | ALU制御ユニットはALUop, FA, FBを組み合わせて、 |
| | 30 | 教科書にあるようにALUを制御するための4 bitの信号を作る必要があります(図4.12と4.13)。 |
| | 31 | 今回設計するプロセッサでは、イミディエート命令を追加するため、以下の修正が必要です。 |
| | 32 | |
| | 33 | 追加されるイミディエート命令は、命令語の上位6ビット(FB)に演算の種類が入っているため、 |
| | 34 | イミディエート命令をサポートするためには、上位6ビットの内容もALU制御ユニットに入力しなければなりません。 |
| | 35 | さらに、何らかの手段によってALU制御ユニットに、現在実行中の命令がイミディエート命令であることを伝えなくてはなりません。 |
| | 36 | |
| | 37 | ここでは、ALUOpで未使用の組み合わせだった"2'b11"という値をイミディエート命令であることを表すことにします。 |
| | 38 | この結果、図4.12のALU制御ビットの構成は次のように変更されます。 |
| | 39 | |
| | 40 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/image/ALU1.png)]] |
| | 41 | |
| | 42 | 上記の表に対応して、教科書図4.13、ALU制御コードの真理値表も以下のように拡張されます。 |
| | 43 | |
| | 44 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2013/image/ALU2.png)]] |
| | 45 | |
| | 46 | この真理値表をもとにして、出力であるALUoperation(4 bit)を設計してください。 |
| | 47 | まず、真理値表から、ALUoperation[3]は常に偽(0)であることがわかります。 |
| | 48 | 他のビットは、それが真(1)になるになる条件を考えてください。 |
| | 49 | 例えば、ALUoperation[2]が真になる組み合わせは: |
| | 50 | |
| | 51 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/image/ALU3.png)]] |
| | 52 | |
| | 53 | の時です。 |
| | 54 | |
| | 55 | この真理値表の1行目だけを考慮すると、assign文を使って |
| | 56 | {{{ |
| | 57 | assign ALUoperation[2] = (ALUop[1] == 1'b0 && ALUop[0] == 1'b1); |
| | 58 | }}} |
| | 59 | |
| | 60 | または |
| | 61 | |
| | 62 | {{{ |
| | 63 | assign ALUoperation[2] = (ALUop == 2'b01); |
| | 64 | }}} |
| | 65 | と書くことができます。この文は括弧内の条件が満たされた時にALUoperation[2]が真となることを意味します。 |
| | 66 | 真理値表の他の行もあわせて正しくなるように、ALUoperation[2]を定義してください。 |
| | 67 | |
| | 68 | ALUoperation[1]とALUoperation[0]は同様に真理値表を求めてから、assing文を考えてください。 |
| | 69 | |
| | 70 | |
| | 71 | == 課題:ALU制御ユニットを設計する == |
| | 72 | 以上の説明に従ってALU制御ユニット(ファイル名"ALUControl.v")を設計しなさい。 |
| | 73 | |
| | 74 | 設計するALU制御ユニットへの入力は"ALUop"と"FA"と"FB"であり、最初の図よりその組合せは11パターンあります |
| | 75 | (LWとSWは入力が同じのため)。 |
| | 76 | この11パターンの場合に正しい動作をするかどうかを、以下のテストベンチの例を参考にして動作検証をしなさい。 |
| | 77 | |
| | 78 | テストベンチのテンプレート: |
| | 79 | {{{ |
| | 80 | `timescale 1ns/1ps |
| | 81 | |
| | 82 | `include "ALUcontrol.v" |
| | 83 | |
| | 84 | module ALUcontroltestbench; |
| | 85 | |
| | 86 | reg [1:0] ALUop; |
| | 87 | reg [5:0] FA; |
| | 88 | reg [5:0] FB; |
| | 89 | wire [3:0] ALUoperation; |
| | 90 | |
| | 91 | ALUcontrol aluc(ALUop, FA, FB, ALUoperation); |
| | 92 | |
| | 93 | initial |
| | 94 | begin |
| | 95 | |
| | 96 | $dumpfile("ALUcontroltestbench.vcd"); |
| | 97 | $dumpvars(0, aluc); |
| | 98 | |
| | 99 | #0 ALUop = 2'b00; FA= 6'b000000; FB= 6'b000000; // LW&SW |
| | 100 | |
| | 101 | #100 |
| | 102 | |
| | 103 | $display( $time, " ALUoperation=%h", ALUoperation); // should be "0010" |
| | 104 | |
| | 105 | ALUop = 2'b01; FA= 6'b000000; FB= 6'b000000; // Branch on Equal |
| | 106 | |
| | 107 | #100 |
| | 108 | |
| | 109 | $display( $time, " ALUoperation=%h", ALUoperation); // should be "0110" |
| | 110 | |
| | 111 | // 以下残りの9パターンについて繰り返し |
| | 112 | |
| | 113 | $finish; |
| | 114 | end |
| | 115 | endmodule |
| | 116 | }}} |