トップ: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/note/raw-attachment/wiki/Ex08%E8%AA%B2%E9%A1%8C2015/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 }}} と出力されます。これを状態遷移図を比べて、正しいかどうかを確認してください。 [[Image(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 }}} プログラムの実行確認については次回におこないます。