| | 1 | トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2017 |
| | 2 | |
| | 3 | = データパスの完成 = |
| | 4 | == 課題1 == |
| | 5 | これまでに作成・利用したモジュールを組み合わせて、データパスを完成させてください。 |
| | 6 | データパスとは、ブロック図で、全体制御部とALU制御部を除いた部分のことです。 |
| | 7 | |
| | 8 | データパスの入出力は、クロック信号CK、クリア信号CLR、制御部と接続される各信号(32ビットの命令および、RegDstなどの信号)です。 |
| | 9 | 制御部との接続は、例えば、RegWriteという入力ポートを宣言し、 |
| | 10 | その入力がレジスタファイルの所定の入力につながるように |
| | 11 | (レジスタファイルをインスタンス宣言し、宣言のなかの入出力ポートにRegWriteを含めておく)します。 |
| | 12 | |
| | 13 | データバスの出力は、!ZeroFlag、OP1(制御部に接続する、命令の上位6ビット部分)とOP2(ALU制御部に接続する、命令の下位6ビット部分) |
| | 14 | |
| | 15 | データパスのテンプレートは以下になります。なお、インスタンス化するモジュールをincludeすること。 |
| | 16 | === Datapath module === |
| | 17 | {{{ |
| | 18 | ... |
| | 19 | module Datapath(PCwriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, |
| | 20 | IRwrite, PCSource, ALUop, ALUSrcB, ALUSrcA, RegWrite, RegDST, |
| | 21 | PCload, ZeroFlag, OP1, OP2, |
| | 22 | CK, CLR); |
| | 23 | |
| | 24 | input CK, CLR; |
| | 25 | // 1 bit control |
| | 26 | input PCwriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, IRwrite; |
| | 27 | input ALUSrcA, RegWrite, RegDST, PCload; |
| | 28 | // 2 bit control |
| | 29 | input [1:0] PCSource, ALUop; |
| | 30 | // 3 bit control |
| | 31 | input [2:0] ALUSrcB; |
| | 32 | // |
| | 33 | output ZeroFlag; // ALU zero flag |
| | 34 | output [5:0] OP1, OP2; |
| | 35 | ... |
| | 36 | |
| | 37 | endmodule |
| | 38 | }}} |
| | 39 | |
| | 40 | = 全体の完成 = |
| | 41 | == 課題2 == |
| | 42 | マルチサイクルプロセッサ全体を「MIPSmulticyle」とし、以下のテンプレートに従い、 |
| | 43 | これまで設計したモジュールをインスタンス化し、プロセッサを完成させてください。 |
| | 44 | |
| | 45 | テンプレートではCK, CLRとGenPCLに関する信号のみ接続しています。他の信号の接続は各自おこなうこと。 |
| | 46 | |
| | 47 | {{{ |
| | 48 | module MIPSmulticycle(CK, CLR); |
| | 49 | input CK, CLR; |
| | 50 | wire PCWriteCond, PCWrite, ZeroFlag, PCload; |
| | 51 | // 必要な信号をさらに加える |
| | 52 | |
| | 53 | // データパスのインスタンス化 |
| | 54 | Datapath MCDP (.CK(CK), .CLR(CLR), .ZeroFlag(ZeroFlag), |
| | 55 | .PCwriteCond(PCwriteCond), .PCWrite(PCWrite), .PCload(PCLoad)); |
| | 56 | |
| | 57 | // Three control units |
| | 58 | ALUControl alucnt (); |
| | 59 | ControlUnit cntunit (.CK(CK), .CLR(CLR)); |
| | 60 | GenPCL genpcload (PCwriteCond, PCWrite, ZeroFlag, PCload); |
| | 61 | endmodule |
| | 62 | }}} |
| | 63 | |
| | 64 | 「GenPCL」は、ブロック図左上のPCWriteCondとPCwriteとZeroFlagから、PCをロードする信号を生成するモジュールです。 |
| | 65 | それ以外のものは、入出力の信号名のみ記述します。 |
| | 66 | {{{ |
| | 67 | module GenPCL(PCWriteCond, PCWrite, ZeroFlag, PCload); |
| | 68 | input PCWriteCond, PCWrite, ZeroFlag; |
| | 69 | output PCload; |
| | 70 | |
| | 71 | assign PCload = (PCWriteCond && ZeroFlag) || PCWrite; |
| | 72 | endmodule |
| | 73 | }}} |
| | 74 | |
| | 75 | |
| | 76 | == テストベンチの例 == |
| | 77 | MIPSmulticycleモジュールのテストベンチの例は以下のようになります。 |
| | 78 | {{{ |
| | 79 | `timescale 1ns/1ps |
| | 80 | |
| | 81 | `include "MIPSmulticycle.v" |
| | 82 | |
| | 83 | module MIPStestbench; |
| | 84 | reg CK,clear; |
| | 85 | |
| | 86 | MIPSmulticycle mips(CK,clear); |
| | 87 | |
| | 88 | initial |
| | 89 | begin |
| | 90 | |
| | 91 | $dumpfile("MIPStestbench.vcd"); |
| | 92 | $dumpvars(0, mips); |
| | 93 | |
| | 94 | // memory initialization |
| | 95 | |
| | 96 | // |
| | 97 | |
| | 98 | #0 |
| | 99 | CK = 1'b1; |
| | 100 | clear = 1'b1; |
| | 101 | |
| | 102 | #110 |
| | 103 | clear = 1'b0; |
| | 104 | |
| | 105 | #90 |
| | 106 | |
| | 107 | #1000 |
| | 108 | // execute 10 cycles |
| | 109 | |
| | 110 | $finish; |
| | 111 | end |
| | 112 | |
| | 113 | always #50 CK <= ~CK; |
| | 114 | endmodule |
| | 115 | }}} |
| | 116 | |
| | 117 | == エラーチェック == |
| | 118 | テストベンチを利用して、文法エラーがないかを確認すること。 |
| | 119 | {{{ |
| | 120 | ncverilog MIPStestbench.v |
| | 121 | }}} |
| | 122 | |
| | 123 | |
| | 124 | = ブロック図の確認方法 = |
| | 125 | ncverilogコマンドでテストベンチの文法ミスがなくなり、シミュレーションが可能になったら、以下のようにしてモジュールとその間の接続を確認できます。 |
| | 126 | |
| | 127 | == PPEオプションで実行する == |
| | 128 | {{{ |
| | 129 | ncverilog +PPE MIPSmulticycle.v |
| | 130 | }}} |
| | 131 | しばらくするとSimvisionのウインドウが開きます。 |
| | 132 | |
| | 133 | [[Image(http://galaxy.u-aizu.ac.jp/g/data/8955add0bfbde43a3a3c811c70c02ccb.png)]] |
| | 134 | |
| | 135 | == マルチサイクルプロセッサのトップモジュールを選択 == |
| | 136 | [[Image(http://galaxy.u-aizu.ac.jp/g/data/e1e50afda8fa300a147053d161621c17.png)]] |
| | 137 | |
| | 138 | == 右クリックして「Send to New」から「Schematic Tracer」を選択 == |
| | 139 | [[Image(http://galaxy.u-aizu.ac.jp/g/data/e4af225341376dc74d0a7dfda80abaa7.png)]] |
| | 140 | |
| | 141 | |
| | 142 | === ブロック図のウインドウが開き、トップモジュールが表示される === |
| | 143 | [[Image(http://galaxy.u-aizu.ac.jp/g/data/12b78356bd1d1731da7fbaa1a74a547d.png)]] |
| | 144 | |
| | 145 | == モジュールをダブルクリックするとブロック図と配線が確認できます == |
| | 146 | [[Image(http://galaxy.u-aizu.ac.jp/g/data/9eedd1265793a4f18494dd7965a067c5.png)]] |
| | 147 | |
| | 148 | モジュール間の配線が間違っていないかをブロック図で把握して下さい。 |