| | 1 | トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2015 |
| | 2 | |
| | 3 | = 制御部の設計(2) = |
| | 4 | 各状態における出力信号を定義すると、以下のファイルのようになります。 |
| | 5 | ただし、このファイルでは、状態0と1の場合のみ記述してあります。 |
| | 6 | |
| | 7 | 未完成の制御回路 http://galaxy.u-aizu.ac.jp/comparch2014/V/ControlUnit_2.v |
| | 8 | |
| | 9 | == 課題1 == |
| | 10 | 全ての状態の場合の出力信号を定義して、主制御ユニット(ファイル名は"!ControlUnit.v")を完成させること。 |
| | 11 | |
| | 12 | === 制御回路の動作確認 === |
| | 13 | テストベンチファイルの例 http://galaxy.u-aizu.ac.jp/comparch2014/V/CUbench.v |
| | 14 | |
| | 15 | このテストベンチファイルを実行し、各命令(LW, SW, RTYPE命令, BEQ, JMP, ADDI, SLTI, ANDI, ORI)ごとに、 |
| | 16 | 状態番号stateごとに正しい信号が出力されていることを確認してください。 |
| | 17 | |
| | 18 | 例えばLW命令の場合は、state=0では: |
| | 19 | {{{ |
| | 20 | state= 0: MemRead=1,ALUSrcA=0,IorD=0,IRWrite=1,ALUSrcB=001,ALUOp=00,PCWrite=1,PCSource=00 |
| | 21 | }}} |
| | 22 | と出力されます。これを状態遷移図を比べて、正しいかどうかを確認してください。 |
| | 23 | |
| | 24 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/image/comparch_ex8.png)]] |
| | 25 | |
| | 26 | 他の命令と他のstateについても同様に確認すること。 |
| | 27 | |
| | 28 | 注意:状態遷移図には各状態で変化する信号のみが書いてあります。例えば!MemReadはstate = 0の時は真であるべきですが、それ以外の状態では偽になっている必要があります。そのためstate = 1では!MemReadは偽になっています。他のstateの時も同様です。 |
| | 29 | |
| | 30 | = データパスの完成 = |
| | 31 | == 課題2 == |
| | 32 | これまでに作成・利用したモジュールを組み合わせて、データパスを完成させてください。 |
| | 33 | データパスとは、ブロック図で、全体制御部とALU制御部を除いた部分のことです。 |
| | 34 | |
| | 35 | データパスの入出力は、クロック信号CK、クリア信号CLR、制御部と接続される各信号(32ビットの命令および、!RegDstなどの信号)です。 |
| | 36 | 制御部との接続は、例えば、!RegWriteという入力ポートを宣言し、 |
| | 37 | その入力がレジスタファイルの所定の入力につながるように (レジスタファイルをインスタンス宣言し、宣言のなかの入出力ポートにRegWriteをふくめておく)します。 |
| | 38 | |
| | 39 | データパスのテンプレートは以下になります。 |
| | 40 | === Datapath module === |
| | 41 | {{{ |
| | 42 | ... |
| | 43 | module Datapath(PCwriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, |
| | 44 | IRwrite, PCSource, ALUop, ALUSrcB, ALUSrcA, RegWrite, RegDST, |
| | 45 | PCload, ZeroFlag, |
| | 46 | OP, CK, CLR); |
| | 47 | |
| | 48 | input CK, CLR; |
| | 49 | // 1 bit control |
| | 50 | input PCwriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, IRwrite; |
| | 51 | input ALUSrcA, RegWrite, RegDST, PCload; |
| | 52 | // 2 bit control |
| | 53 | input [1:0] PCSource, ALUop; |
| | 54 | // 3 bit control |
| | 55 | input [2:0] ALUSrcB; |
| | 56 | // |
| | 57 | output ZeroFlag; // ALU zero flag |
| | 58 | output [5:0] OP; |
| | 59 | |
| | 60 | ... |
| | 61 | |
| | 62 | endmodule |
| | 63 | }}} |
| | 64 | |
| | 65 | |
| | 66 | = 全体の完成 = |
| | 67 | == 課題3 == |
| | 68 | マルチサイクルプロセッサ全体を「MIPSmulticyle」とし、以下のテンプレートに従い、 |
| | 69 | これまで設計したモジュールをインスタンス化し、プロセッサを完成させてください。 |
| | 70 | |
| | 71 | テンプレートではCK, CLRとGenPCLに関する信号のみ接続しています。他の信号の接続は各自おこなうこと。 |
| | 72 | |
| | 73 | {{{ |
| | 74 | module MIPSmulticycle(CK, CLR); |
| | 75 | input CK, CLR; |
| | 76 | wire PCWriteCond, PCWrite, ZeroFlag, PCload; |
| | 77 | // 必要な信号をさらに加える |
| | 78 | |
| | 79 | // データパスのインスタンス化 |
| | 80 | Datapath MCDP (.CK(CK), .CLR(CLR), .ZeroFlag(ZeroFlag), |
| | 81 | .PCwriteCond(PCwriteCond), .PCWrite(PCWrite), .PCload(PCLoad)); |
| | 82 | |
| | 83 | // Three control units |
| | 84 | ALUControl alucnt (); |
| | 85 | ControlUnit cntunit (.CK(CK), .CLR(CLR)); |
| | 86 | GenPCL genpcload (PCwriteCond, PCWrite, ZeroFlag, PCload); |
| | 87 | endmodule |
| | 88 | }}} |
| | 89 | |
| | 90 | 「GenPCL」は、ブロック図左上のPCWriteCondとPCwriteとZeroFlagから、PCをロードする信号を生成するモジュールです。 |
| | 91 | それ以外のものは、入出力の信号名のみ記述します。 |
| | 92 | {{{ |
| | 93 | module GenPCL(PCWriteCond, PCWrite, ZeroFlag, PCload); |
| | 94 | input PCWriteCond, PCWrite, ZeroFlag; |
| | 95 | output PCload; |
| | 96 | |
| | 97 | assign PCload = (PCWriteCond && ZeroFlag) || PCWrite; |
| | 98 | endmodule |
| | 99 | }}} |
| | 100 | |
| | 101 | |
| | 102 | == テストベンチの例 == |
| | 103 | MIPSmulticycleモジュールのテストベンチの例は以下のようになります。 |
| | 104 | {{{ |
| | 105 | `timescale 1ns/1ps |
| | 106 | |
| | 107 | `include "MIPSmulticycle.v" |
| | 108 | |
| | 109 | module MIPStestbench; |
| | 110 | reg ck,clear; |
| | 111 | |
| | 112 | MIPSmulticycle mips(ck,clear); |
| | 113 | |
| | 114 | initial |
| | 115 | begin |
| | 116 | |
| | 117 | $dumpfile("MIPStestbench.vcd"); |
| | 118 | $dumpvars(0, mips); |
| | 119 | |
| | 120 | // memory initialization |
| | 121 | |
| | 122 | // |
| | 123 | |
| | 124 | #0 |
| | 125 | ck = 1'b1; |
| | 126 | clear = 1'b1; |
| | 127 | |
| | 128 | #110 |
| | 129 | clear = 1'b0; |
| | 130 | |
| | 131 | #90 |
| | 132 | |
| | 133 | #1000 |
| | 134 | // execute 10 cycles |
| | 135 | |
| | 136 | $finish; |
| | 137 | end |
| | 138 | |
| | 139 | always #50 CK <= ~CK; |
| | 140 | endmodule |
| | 141 | }}} |
| | 142 | |
| | 143 | == エラーチェック == |
| | 144 | テストベンチを利用して、文法エラーがないかを確認すること。 |
| | 145 | {{{ |
| | 146 | ncverilog MIPStestbench.v |
| | 147 | }}} |
| | 148 | |
| | 149 | プログラムの実行確認については次回におこないます。 |