Changes between Initial Version and Version 1 of Ex08 マルチサイクルプロセッサの制御2017


Ignore:
Timestamp:
Jun 9, 2017 2:27:12 PM (9 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Ex08 マルチサイクルプロセッサの制御2017

    v1 v1  
     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 
     24ALUの入力AにはPCの値を入力するため、それを制御する信号ALUSrcAはネゲートします。 
     25ALUの入力Bには"4"を入力するので、それを制御する信号ALUSrcB(3 bit)は"001"となり、 
     26ALUは加算をするため、それを制御する信号ALUOp(2 bit)は"00"とします。 
     27その結果をPCレジスタに書き込むため、PCWriteはアサートされ、PCSource(2 bit)は"00"となります。 
     28 
     29=== 状態1では、以下の動作が同時に実施されます === 
     30* 次のサイクルで計算に利用するレジスタファイルの値を読み出す 
     31* ジャンプ先のアドレス(PC+オフセット)を計算する 
     32 
     33この時に必要な動作は、主としてALUでのアドレス計算です。 
     34ALUの入力AにはPCの値を入力するため、それを制御する信号ALUSrcAはネゲートします。 
     35ALUの入力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{{{ 
     65module 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 
     112endmodule // ControlUnit 
     113}}} 
     114 
     115入力信号はOpとCK(クロック信号)とCLR(リセット信号)で、その他は出力になります。 
     116Op信号は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状態遷移のみの制御回路  
     136http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/ControlUnit_1.v 
     137 
     138テストベンチファイル  
     139http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2016/CUbench_1.v 
     140 
     141=== 実行例 === 
     142それぞれのファイルをダウンロードまたは保存して、以下のコマンドを実行。 
     143{{{ 
     144ncverilog 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 == 
     155LW命令と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{{{ 
     176state= 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== 動作確認 == 
     187RTYPE命令とJMP命令の場合の波形を表示して、TAに動作確認を受けること。