| | 1 | トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2017 |
| | 2 | |
| | 3 | = マルチサイクルプロセッサの制御 = |
| | 4 | |
| | 5 | マルチサイクルプロセッサでは、ひとつの命令を複数のステップ(サイクル)に渡って実現します。 |
| | 6 | その各ステップで利用する信号、モジュールが異なります。その動作をまとめたものが以下の状態遷移図です。 |
| | 7 | |
| | 8 | 状態遷移図:http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/FSM.pdf |
| | 9 | |
| | 10 | この状態遷移図では状態は0から12の13状態が定義されています。 |
| | 11 | 各状態には、その時に出力されるべき信号名とその値が書いてあります。 |
| | 12 | |
| | 13 | 例えばR形式命令の場合、1サイクルごとに「0→1→6→7」と遷移することがわかります。 |
| | 14 | 他の命令の場合も「0→1」の遷移は共通です。状態0は命令フェッチ、状態1は命令デコード&レジスタ読み出しをおこないます。 |
| | 15 | |
| | 16 | === 状態0では、以下の動作が同時に実施されます === |
| | 17 | * メモリから現在のPCのアドレスにある命令を読み出す。 |
| | 18 | * PC+4を計算してPCを更新する。 |
| | 19 | |
| | 20 | そのためメモリのアドレスにはPCの値を入力すると同時にメモリを読み込むための信号(!MemRead)を真に(アサート)します。 |
| | 21 | またメモリから読み出す値が命令かデータかを判別する信号IoDは、偽に(ネゲート)します。 |
| | 22 | さらに、IRWriteをアサートすることで、読み出された命令がメモリレジスタ(MDR)に保持されます。 |
| | 23 | |
| | 24 | ALUの入力AにはPCの値を入力するため、それを制御する信号ALUSrcAはネゲートします。 |
| | 25 | ALUの入力Bには"4"を入力するので、それを制御する信号ALUSrcB(3 bit)は"001"となり、 |
| | 26 | ALUは加算をするため、それを制御する信号ALUOp(2 bit)は"00"とします。 |
| | 27 | その結果をPCレジスタに書き込むため、PCWriteはアサートされ、PCSource(2 bit)は"00"となります。 |
| | 28 | |
| | 29 | === 状態1では、以下の動作が同時に実施されます === |
| | 30 | * 次のサイクルで計算に利用するレジスタファイルの値を読み出す |
| | 31 | * ジャンプ先のアドレス(PC+オフセット)を計算する |
| | 32 | |
| | 33 | この時に必要な動作は、主としてALUでのアドレス計算です。 |
| | 34 | ALUの入力AにはPCの値を入力するため、それを制御する信号ALUSrcAはネゲートします。 |
| | 35 | ALUの入力Bにはアドレスのオフセットを入力するので、それを制御する信号ALUSrcBは"011"となります。 |
| | 36 | この時入力される値は、状態0で読み出された命令の下位16ビットを符号拡張して2ビット左シフトした値となります。 |
| | 37 | 状態0と同様に、ALUは加算をするためALUOp(2 bit)は"00"とします。 |
| | 38 | |
| | 39 | またレジスタファイルから読み出された値は、A, Bレジスタに保持されます。読み出すレジスタの番号は命令の該当部分を利用します。 |
| | 40 | |
| | 41 | === 状態6では、以下の動作が同時に実施されます === |
| | 42 | この場合R形式命令を実行するので、ALUでレジスタ間の演算をおこないます。 |
| | 43 | |
| | 44 | * ALUにはA, Bレジスタをそれぞれ入力する |
| | 45 | * 命令に応じてALUでの演算をおこなう |
| | 46 | * 結果はALUレジスタに保持される |
| | 47 | |
| | 48 | そのためALUSrcAはアサートされ、ALUSrcBは"000"となります。ALUでのおこなう演算を制御する信号ALUOpは"10"とします。 |
| | 49 | |
| | 50 | === 状態7では、以下の動作が同時に実施されます === |
| | 51 | * ALUレジスタに保持された値を指定されたレジスタに書き込む |
| | 52 | |
| | 53 | この時、ALUは利用しません。レジスタファイルへの書き込みを制御する信号RegWriteはアサートされます。 |
| | 54 | また、書き込むレジスタファイルの番号を制御する信号RegDstもアサートされます。 |
| | 55 | レジスタファイルには、ALUレジスタの値を書き込むため、それを制御するMemtoRegはネゲートされます。 |
| | 56 | |
| | 57 | == 以上の各サイクルでR形式命令を実現できます。 == |
| | 58 | 他の命令の場合、つまりLW命令、SW命令、BEQ命令等の場合にも、同様に状態遷移をしながら、 |
| | 59 | 各状態での信号が変化していくことを理解してください。 |
| | 60 | |
| | 61 | == 制御部の設計(1) == |
| | 62 | 制御部モジュールのテンプレートは以下のようになります。 |
| | 63 | |
| | 64 | {{{ |
| | 65 | module ControlUnit(PCWriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, |
| | 66 | IRWrite, PCSource, ALUOp, ALUSrcB, ALUSrcA, |
| | 67 | RegWrite, RegDST, Op, CK, CLR); |
| | 68 | |
| | 69 | // clock |
| | 70 | input CK; |
| | 71 | input CLR; |
| | 72 | |
| | 73 | // opcode (6 bit) |
| | 74 | input [5:0] Op; |
| | 75 | |
| | 76 | // 1 bit control signal |
| | 77 | output PCWriteCond; |
| | 78 | output PCWrite; |
| | 79 | output IorD; |
| | 80 | output MemRead; |
| | 81 | output MemWrite; |
| | 82 | output MemtoReg; |
| | 83 | output IRWrite; |
| | 84 | output RegWrite; |
| | 85 | output RegDST; |
| | 86 | output ALUSrcA; |
| | 87 | |
| | 88 | // 2 bit control signal |
| | 89 | output [1:0] PCSource; |
| | 90 | output [1:0] ALUOp; |
| | 91 | output [2:0] ALUSrcB; |
| | 92 | |
| | 93 | // register declaration |
| | 94 | reg PCWriteCond; |
| | 95 | reg PCWrite; |
| | 96 | reg IorD; |
| | 97 | reg MemRead; |
| | 98 | reg MemWrite; |
| | 99 | reg MemtoReg; |
| | 100 | reg IRWrite; |
| | 101 | reg [1:0] PCSource; |
| | 102 | reg [1:0] ALUOp; |
| | 103 | reg [2:0] ALUSrcB; |
| | 104 | reg ALUSrcA; |
| | 105 | reg RegWrite; |
| | 106 | reg RegDST; |
| | 107 | |
| | 108 | // state register |
| | 109 | reg [3:0] state; |
| | 110 | |
| | 111 | |
| | 112 | endmodule // ControlUnit |
| | 113 | }}} |
| | 114 | |
| | 115 | 入力信号はOpとCK(クロック信号)とCLR(リセット信号)で、その他は出力になります。 |
| | 116 | Op信号はMIPS命令コードの25-31ビットの部分です。各命令コードごとのOp信号を以下のテーブルに示します。 |
| | 117 | |
| | 118 | == 命令コード == |
| | 119 | || 命令の種類 || opcode(10進数) || |
| | 120 | || R形式 || 0 || |
| | 121 | || Load Word || 35 || |
| | 122 | || Store Word || 43 || |
| | 123 | || Branch on EQ|| 4 || |
| | 124 | || ADD imm || 8 || |
| | 125 | || SLT imm || 10 || |
| | 126 | || AND imm || 12 || |
| | 127 | || ORI imm || 13 || |
| | 128 | |
| | 129 | 注意:R形式命令では、命令コードの0-5ビットの部分で演算の種類を指定します。 |
| | 130 | |
| | 131 | == 例題 == |
| | 132 | 状態遷移図から、R形式命令の実行には4サイクル必要になります。 |
| | 133 | このことを、以下のファイルを使ってシミュレーションを行い確かめなさい。 |
| | 134 | |
| | 135 | 状態遷移のみの制御回路 |
| | 136 | http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/ControlUnit_1.v |
| | 137 | |
| | 138 | テストベンチファイル |
| | 139 | http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/CUbench_1.v |
| | 140 | |
| | 141 | === 実行例 === |
| | 142 | それぞれのファイルをダウンロードまたは保存して、以下のコマンドを実行。 |
| | 143 | {{{ |
| | 144 | ncverilog CUbench_1.v |
| | 145 | }}} |
| | 146 | |
| | 147 | この状態遷移の回路では、always文の部分はCLKが上向きに変化する時に状態が遷移します。 |
| | 148 | また、CLR信号が真になったら状態0になります(リセット)。 |
| | 149 | そのため状態遷移を行う時にはCLR信号を適切に変化させる必要があります。 |
| | 150 | |
| | 151 | === 実行波形 === |
| | 152 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/image/CUbench1.png, 800)]] |
| | 153 | |
| | 154 | == 課題1 == |
| | 155 | LW命令とADDI命令の場合に、例題を参考にテストベンチファイルを作成して、 |
| | 156 | シミュレーションを行い、実行波形を確認してください。 |
| | 157 | それぞれの場合、実行までに何サイクル必要かを考えること。 |
| | 158 | |
| | 159 | = 制御部の設計(2) = |
| | 160 | 各状態における出力信号を定義すると、以下のファイルのようになります。 |
| | 161 | ただし、このファイルでは、状態0と1の場合のみ記述してあります。 |
| | 162 | |
| | 163 | 未完成の制御回路 http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/ControlUnit_2.v |
| | 164 | |
| | 165 | == 課題2 == |
| | 166 | 全ての状態の場合の出力信号を定義して、主制御ユニット(ファイル名は"!ControlUnit.v")を完成させること。 |
| | 167 | |
| | 168 | === 制御回路の動作確認 === |
| | 169 | テストベンチファイルの例 http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/CUbench_2.v |
| | 170 | |
| | 171 | このテストベンチファイルを実行し、各命令(LW, SW, RTYPE命令, BEQ, JMP, ADDI, SLTI, ANDI, ORI)ごとに、 |
| | 172 | 状態番号stateごとに正しい信号が出力されていることを確認してください。 |
| | 173 | |
| | 174 | 例えばLW命令の場合は、state=0では: |
| | 175 | {{{ |
| | 176 | state= 0: MemRead=1,ALUSrcA=0,IorD=0,IRWrite=1,ALUSrcB=001,ALUOp=00,PCWrite=1,PCSource=00 |
| | 177 | }}} |
| | 178 | と出力されます。これを状態遷移図を比べて、正しいかどうかを確認してください。 |
| | 179 | |
| | 180 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/image/comparch_ex8.png)]] |
| | 181 | |
| | 182 | 他の命令と他のstateについても同様に確認すること。 |
| | 183 | |
| | 184 | 注意:状態遷移図には各状態で変化する信号のみが書いてあります。例えばMemReadはstate = 0, 3の時は真であるべきですが、それ以外の状態では偽になっている必要があります。そのためstate = 1ではMemReadは偽になっています。他のstateの時も同様です。 |
| | 185 | |
| | 186 | == 動作確認 == |
| | 187 | RTYPE命令とJMP命令の場合の波形を表示して、TAに動作確認を受けること。 |