| | 1 | トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2017 |
| | 2 | |
| | 3 | = マルチサイクルプロセッサの設計 = |
| | 4 | |
| | 5 | これまでの演習で設計してきたモジュールを組み合わせて、MIPS ISA互換のマルチサイクルプロセッサを設計します。 |
| | 6 | |
| | 7 | 設計するプロセッサのブロック図全体図は以下のようになります。 |
| | 8 | |
| | 9 | = ブロック図 = |
| | 10 | [[Image(http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex07%E8%AA%B2%E9%A1%8C2015/datapath.png, 800)]] |
| | 11 | |
| | 12 | 詳細を見るためのPDF version -> |
| | 13 | |
| | 14 | = 設計の指針 = |
| | 15 | * ブロック図を参照して、どのようなモジュールが必要かをリストアップする。 |
| | 16 | * それぞれのモジュールを設計する。 |
| | 17 | * モジュール間接続について考える。この時にモジュールごとに入力と出力の種類やbit幅を考慮する。 |
| | 18 | * "Datapath.v"を作成し、そこからモジュールのインスタンス化および接続をおこなう。 |
| | 19 | |
| | 20 | == モジュールのリストアップ == |
| | 21 | プロセッサを完成させるには、ブロック図を参照して、必要なモジュールをリストアップします。 |
| | 22 | これまでの演習で利用してきた、あるいは設計してきたモジュールは: |
| | 23 | |
| | 24 | * ALU (演習第4週) |
| | 25 | * ALU control (演習第5週) |
| | 26 | * Memory(メモリ)/Registers(レジスタファイル) (演習第6週) |
| | 27 | |
| | 28 | です。その他に必要なモジュールを列挙すると以下になります。 |
| | 29 | |
| | 30 | 1. PCレジスタ |
| | 31 | 1. Aレジスタ |
| | 32 | 1. Bレジスタ |
| | 33 | 1. ALUOutレジスタ |
| | 34 | 1. Instruction register |
| | 35 | 1. Memory data register |
| | 36 | 1. 2 to 1 マルチプレクサ x 4 |
| | 37 | 1. 3 to 1 マルチプレクサ x 1 |
| | 38 | 1. 5 to 1 マルチプレクサ x 1 |
| | 39 | 1. Sign extendモジュール |
| | 40 | 1. Zero extendモジュール |
| | 41 | 1. "Shift left 2"モジュール x 2 |
| | 42 | 1. 制御部 |
| | 43 | |
| | 44 | == 各モジュールの設計 == |
| | 45 | === レジスタ === |
| | 46 | レジスタは全て32bitです。例えばAレジスタのHDL記述は以下のようになります。 |
| | 47 | {{{ |
| | 48 | module RegA(i, CK, CLR, o); |
| | 49 | input CK, CLR; |
| | 50 | input [31:0] i; |
| | 51 | output [31:0] o; |
| | 52 | reg [31:0] o; |
| | 53 | |
| | 54 | always @(posedge CK) begin |
| | 55 | if (CLR == 1'b1) |
| | 56 | o <= 32'h00000000; |
| | 57 | else |
| | 58 | o <= i; |
| | 59 | end |
| | 60 | endmodule |
| | 61 | }}} |
| | 62 | |
| | 63 | CLRが真の時にレジスタは0x0にクリアされます。 |
| | 64 | |
| | 65 | レジスタのうちPCレジスタ、Instruction registerは、制御信号で書き込みが制御されます。 |
| | 66 | |
| | 67 | 例えば、PCレジスタはPCloadが真の時のみにレジスタの内容をアップデートします。記述例は以下のようになります。 |
| | 68 | {{{ |
| | 69 | module RegPC(i, PCload, CK, CLR, o); |
| | 70 | input CK, CLR, PCload; |
| | 71 | input [31:0] i; |
| | 72 | output [31:0] o; |
| | 73 | reg [31:0] o; |
| | 74 | |
| | 75 | always @(posedge CK) begin |
| | 76 | if (CLR == 1'b1) |
| | 77 | o <= 32'h00000000; |
| | 78 | else if (PCload == 1'b1) |
| | 79 | o <= i; |
| | 80 | end |
| | 81 | endmodule |
| | 82 | }}} |
| | 83 | |
| | 84 | === Instruction register === |
| | 85 | ブロック図を見るとわかるように、このレジスタはメモリモジュールから出力を保持する32bitレジスタですが、 |
| | 86 | 出力は4種の信号線に分かれます。このレジスタが命令を保持するレジスタであるからです。 |
| | 87 | |
| | 88 | 例えば今実行中の命令がR形式命令の場合、21-25ビットの部分はレジスタのアドレスを表すので、 |
| | 89 | その信号はレジスタファイルの読み出しアドレス(Read register 1)に接続されています。 |
| | 90 | 同様に、26-31ビットの部分は制御部のOpに接続されます。 |
| | 91 | |
| | 92 | よって、この命令レジスタは以下の入出力となるように設計してください。 |
| | 93 | |
| | 94 | {{{ |
| | 95 | module RegInst(i, IRWrite, CK, CLR, o0_15, o16_20, o21_25, o26_31); |
| | 96 | input CK, CLR, IRWrite; |
| | 97 | input [31:0] i; |
| | 98 | output [15:0] o0_15; |
| | 99 | output [4:0] o16_20, o21_25; |
| | 100 | output [5:0] o26_31; |
| | 101 | endmodule |
| | 102 | }}} |
| | 103 | |
| | 104 | |
| | 105 | === マルチプレクサ === |
| | 106 | マルチプレクサは、制御信号に応じて、複数の入力から出力を選択します。 |
| | 107 | |
| | 108 | 例えば、2入力から信号sに応じて、片方を選択する2 to 1マルチプレクサの記述は以下になります。 |
| | 109 | {{{ |
| | 110 | // 32bit : 2 to 1 multiplexer |
| | 111 | module mux2(i0, i1, s, o); |
| | 112 | input [31:0] i0, i1; |
| | 113 | input s; |
| | 114 | output [31:0] o; |
| | 115 | reg [31:0] o; // always分で代入する場合にはreg宣言も必要 |
| | 116 | |
| | 117 | always @(i0 or i1 or s) begin |
| | 118 | if (s == 1'b1) |
| | 119 | o <= i1; |
| | 120 | else |
| | 121 | o <= i0; |
| | 122 | end |
| | 123 | endmodule |
| | 124 | }}} |
| | 125 | |
| | 126 | 3入力以上のマルチプレクサはcase文で記述します。参考書の67ページを参照すること。 |
| | 127 | センシティビティリスト(「@()」の部分)に全ての入力信号を列挙する必要があることに注意すること。 |
| | 128 | |
| | 129 | === Sign extendモジュール === |
| | 130 | このモジュールは入力が16bitで出力が32bitになります。 |
| | 131 | |
| | 132 | === Zero extendモジュール === |
| | 133 | このモジュールも、入力が16bitで出力が32bitになります。 |
| | 134 | |
| | 135 | === "Shift left 2"モジュール === |
| | 136 | このモジュールは2回利用されていて、どちらも入力を左に2 bitシフトしたものが出力です。 |
| | 137 | |
| | 138 | ただし、Sign extendモジュールに接続されているものは入出力とも32bitですが、 |
| | 139 | 命令の0-25ビットが入力されているものは、入力が26bitで出力が28bitです。 |
| | 140 | この28bitの出力信号は、PCレジスタの28-31ビットと合わせて32bit信号になり、 |
| | 141 | 一番右にあるマルチプレクサの入力になります。 |
| | 142 | |
| | 143 | === 制御部 === |
| | 144 | 制御部は図の上部中心にあるオレンジ色の部分で、この部分については別途説明します。 |
| | 145 | |
| | 146 | = 課題1 データパスの理解 = |
| | 147 | 以下のPDFで示された黄色い箱の番号(1 - 8)のデータパスの信号幅を答えなさい。 |
| | 148 | |
| | 149 | |
| | 150 | = 課題2 モジュールの設計 = |
| | 151 | 制御部を除いて、リストアップされた必要なモジュールを設計してください。 |
| | 152 | そのうち、5 to 1マルチプレクサ、Sign extend、Zero extend、Shift left 2の各モジュールは、 |
| | 153 | テストベンチを書いて正しい動作をするかを確認してください。 |