| Version 2 (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/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2015/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
と出力されます。これを状態遷移図を比べて、正しいかどうかを確認してください。
他の命令と他の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)
- ControlUnit_2.v (2.6 KB) - added by nakasato 11 years ago.
- CUbench.v (6.6 KB) - added by nakasato 11 years ago.
Download all attachments as: .zip

