wiki:Ex08課題2015

Version 1 (modified by nakasato, 11 years ago) (diff)

--

トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2015

制御部の設計(2)

各状態における出力信号を定義すると、以下のファイルのようになります。 ただし、このファイルでは、状態0と1の場合のみ記述してあります。

未完成の制御回路 http://galaxy.u-aizu.ac.jp/comparch2014/V/ControlUnit_2.v

課題1

全ての状態の場合の出力信号を定義して、主制御ユニット(ファイル名は"ControlUnit.v")を完成させること。

制御回路の動作確認

テストベンチファイルの例 http://galaxy.u-aizu.ac.jp/comparch2014/V/CUbench.v

このテストベンチファイルを実行し、各命令(LW, SW, RTYPE命令, BEQ, JMP, ADDI, SLTI, ANDI, ORI)ごとに、 状態番号stateごとに正しい信号が出力されていることを確認してください。

例えばLW命令の場合は、state=0では:

state= 0: MemRead=1,ALUSrcA=0,IorD=0,IRWrite=1,ALUSrcB=001,ALUOp=00,PCWrite=1,PCSource=00

と出力されます。これを状態遷移図を比べて、正しいかどうかを確認してください。

http://galaxy.u-aizu.ac.jp/comparch2014/image/comparch_ex8.png

他の命令と他のstateについても同様に確認すること。

注意:状態遷移図には各状態で変化する信号のみが書いてあります。例えば!MemReadはstate = 0の時は真であるべきですが、それ以外の状態では偽になっている必要があります。そのためstate = 1では!MemReadは偽になっています。他のstateの時も同様です。

データパスの完成

課題2

これまでに作成・利用したモジュールを組み合わせて、データパスを完成させてください。 データパスとは、ブロック図で、全体制御部とALU制御部を除いた部分のことです。

データパスの入出力は、クロック信号CK、クリア信号CLR、制御部と接続される各信号(32ビットの命令および、!RegDstなどの信号)です。 制御部との接続は、例えば、!RegWriteという入力ポートを宣言し、 その入力がレジスタファイルの所定の入力につながるように (レジスタファイルをインスタンス宣言し、宣言のなかの入出力ポートにRegWriteをふくめておく)します。

データパスのテンプレートは以下になります。

Datapath module

   ...  
module Datapath(PCwriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg,
                IRwrite, PCSource, ALUop, ALUSrcB, ALUSrcA, RegWrite, RegDST,
                PCload, ZeroFlag,
                OP, CK, CLR);

   input CK, CLR;
   // 1 bit control                                                                                                      
   input       PCwriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, IRwrite;
   input       ALUSrcA, RegWrite, RegDST, PCload;
   // 2 bit control                                                                                                      
   input [1:0] PCSource, ALUop;
   // 3 bit control                                                                                                      
   input [2:0] ALUSrcB;
   //                                                                                                                   
   output      ZeroFlag; // ALU zero flag                                                                               
   output [5:0] OP;

...

endmodule

全体の完成

課題3

マルチサイクルプロセッサ全体を「MIPSmulticyle」とし、以下のテンプレートに従い、 これまで設計したモジュールをインスタンス化し、プロセッサを完成させてください。

テンプレートではCK, CLRとGenPCLに関する信号のみ接続しています。他の信号の接続は各自おこなうこと。

module MIPSmulticycle(CK, CLR);
   input CK, CLR;
   wire  PCWriteCond, PCWrite, ZeroFlag, PCload;
   // 必要な信号をさらに加える

   // データパスのインスタンス化
   Datapath MCDP (.CK(CK), .CLR(CLR), .ZeroFlag(ZeroFlag),
                  .PCwriteCond(PCwriteCond), .PCWrite(PCWrite), .PCload(PCLoad));

   // Three control units                                                                                               
   ALUControl alucnt ();
   ControlUnit cntunit (.CK(CK), .CLR(CLR));
   GenPCL genpcload (PCwriteCond, PCWrite, ZeroFlag, PCload);
endmodule

「GenPCL」は、ブロック図左上のPCWriteCondとPCwriteとZeroFlagから、PCをロードする信号を生成するモジュールです。 それ以外のものは、入出力の信号名のみ記述します。

module GenPCL(PCWriteCond, PCWrite, ZeroFlag, PCload);
   input PCWriteCond, PCWrite, ZeroFlag;
   output PCload;

   assign PCload = (PCWriteCond && ZeroFlag) || PCWrite;
endmodule

テストベンチの例

MIPSmulticycleモジュールのテストベンチの例は以下のようになります。

`timescale 1ns/1ps

`include "MIPSmulticycle.v"

module MIPStestbench;
   reg ck,clear;

   MIPSmulticycle mips(ck,clear);

   initial
     begin

        $dumpfile("MIPStestbench.vcd");
        $dumpvars(0, mips);

	// memory initialization

        //

        #0
	ck    = 1'b1;
	clear = 1'b1;

        #110
        clear = 1'b0;

      	#90

        #1000
	  // execute 10 cycles

        $finish;
     end

   always #50 CK <= ~CK;
endmodule

エラーチェック

テストベンチを利用して、文法エラーがないかを確認すること。

ncverilog MIPStestbench.v

プログラムの実行確認については次回におこないます。

Attachments (2)

Download all attachments as: .zip