プロセッサの設計と実装 後期実験 プロセッサの設計と実装 1 コンピュータの論理設計 • 「コンピュータを作る」 この実験では – – – – 仕様設計 論理設計 回路・レイアウト 物性・デバイス 課題としてIA-32サブセット仕様が与えられる 各自RTL設計 → ツールで論理合成 FPGAを対象とした配置配線をツールが算出 FPGAボードへのダウンロード テスト QuartusII Modelsim 後期実験 プロセッサの設計と実装 2 実験の流れ • Wiki – www.mtl.t.u-tokyo.ac.jp/~jikken/cpu/wiki/ 1. 2. 3. 4. 環境構築,FPGA動作テスト ハードウェア記述入門 プロセッサ設計の理解 プロセッサ実装 1. 2. 3. カウントアッププログラム フィボナッチ数計算プログラム(再帰) エラトステネスのふるい 5. 最終報告,アピール 後期実験 プロセッサの設計と実装 3 スケジュール:1日目 • 講義:実験の流れ • インストールと動作 – Quartus2 – ModelSim – 7segを光らせるソースをDL • 開発環境への読み込み • FPGAボードの動作確認 後期実験 プロセッサの設計と実装 4 スケジュール:2日目 • 講義:前回のVerilogソースコード説明 • 各自改変して好きな物を表示してみる • 必要ファイルや手順の把握 – シミュレーション,ダウンロード 後期実験 プロセッサの設計と実装 5 スケジュール:3日目 • 講義:プロセッサの設計と今回の仕様 • 仕様の把握 • 目標バイナリの確認 – 3種類 • モジュール構成の設計 後期実験 プロセッサの設計と実装 6 スケジュール:4日目 • 講義:モジュールとその機能 • モジュールを一つ実装してみる – モジュール単位のテストのやりかたを身につける 後期実験 プロセッサの設計と実装 7 スケジュール:5日目~8日目 • 必要モジュールを実装する 順次統合 – – – – レジスタ デコーダ フェッチユニット(無条件分岐にも対応) ALU • までできればカウントアップは動くはず – メモリまわり • までできればfibが動くはず – 条件分岐まわり • までできればエラトステネスが動くはず 後期実験 プロセッサの設計と実装 8 スケジュール:9日目 • デバッグ,追い込み 後期実験 プロセッサの設計と実装 9 最終日 • デバッグ,追い込み • 発表,愛機のアピールプレゼン 後期実験 プロセッサの設計と実装 10 アーキテクチャ仕様 • IA-32の独自サブセット – IA-32z-4B(6B) • IA-32のイヤな部分をできるだけ解消 – – – – (でもフラグレジスタとか残ってる) 固定長 一命令で単一操作 ロードストアアーキテクチャ • 仕様はWikiに 後期実験 プロセッサの設計と実装 11 主記憶,レジスタ,フラグ 主記憶 32 2 Bytes (最大) 32bit x 8本 eax, ebx, ecx, edx, esi, edi, esp, ebp 順番に注意 マクロの引数は e 抜きで フラグ rg1/rg2 Name 000 ax 001 cx 010 dx 011 bx 100 sp 101 bp 110 si 111 di Sign, Zero, Carry, Overflow 12 命令の種類 分類: 1. ロード/ストア命令 2. 演算命令 1. 算術論理演算 (ALU: Arithmetic Logic Unit) 2. シフト 3. 制御移譲 (control transfer) 命令(広義の分岐命令) 1. 分岐 (branch) 命令 :PC 相対 2. ジャンプ命令 :絶対 4. プッシュ/ポップ (オプション) 5. コール/リターン (オプション) 6. その他 13 命令フォーマット 4B : op 24 22 19 16 31 6B : op 47 op : op code imm1 rg1rg2 imm0 8 rg1rg2 imm0 40 38 35 32 rg1 : src reg # rg2 : dst reg # 0 imm1 24 imm2 16 imm3 8 0 imm0 : immediate 0 imm1 : immediate 1 14 1. ロード/ストア命令 ロード命令 zLD sim8/32, rg2, rg1 # r[rg1] = *(r[rg2] + sim8/32) rg1, sim8/32, rg2 # *(r[rg2] + sim8/32) = r[rg1] ストア命令 zST 4B : op 24 22 19 16 31 6B : op 47 rg1rg2 sim8 nop 8 rg1rg2 40 38 35 32 0 simm32 24 16 8 0 15 1. 即値ロード命令 即値ロード命令 zLI im32, rg2 # r[rg2] = im32 zLIL im16, rg2 # r[rg2] = (r[rg2] & 0xFFFF0000) | im16 little-endian のため,im16 は,[15:8] が下位,[7:0] が上位 4B : op 24 22 19 16 31 6B : op 47 rg1rg2 im16 8 rg1rg2 40 38 35 32 0 im32 24 16 8 0 16 2. 演算命令 レジスタ―レジスタ 算術論理演算 (ALU, Arithmetic Logic Unit) 命令 zADD zSUB zCMP zAND … 4B : rg1, rg1, rg1, rg1, op op 47 # # # # r[rg2] r[rg2] r[rg2] r[rg2] rg1rg2 sim8 24 22 19 16 31 6B : rg2 rg2 rg2 rg2 nop 8 rg1rg2 40 38 35 32 += r[rg1] -= r[rg1] - r[rg1] # 比較のみ &= r[rg1] 0 simm32 24 16 8 0 17 2. 演算命令 レジスタ―即値 算術論理演算 (ALU, Arithmetic Logic Unit) 命令 zADDI … sim8/32, rg2 # r[rg2] += sim8/32 sim8/32, rg2 # r[rg2] <<= sim8/32 シフト命令 zSLL … 4B : op 31 6B : 24 22 19 16 op 47 rg2 sim8 nop 8 rg2 40 38 35 32 0 simm32 24 16 8 0 18 3. 制御委譲命令 (条件)分岐命令 zBcc 4B : tttn, sim8/32 op 6B : tttn sim8 24 31 op 47 # if (tttn) PC = PC + 3/6 + sim8 20 16 nop 8 simm32 tttn 40 36 32 0 24 16 8 0 19 3. 制御委譲命令 ジャンプ命令(レジスタ間接) zJR rg2 4B : nop nop 47 op rg2 nop 24 22 19 16 31 6B : # PC = r[rg2] nop 8 op rg2 nop 40 38 35 32 0 nop 24 nop 16 nop 8 0 20 4. プッシュ/ポップ プッシュ命令 zPUSH rg2 # sp -= 4; rg2 = *sp rg2 # *sp = rg2; sp += 4 ポップ命令 zPOP 4B : nop 24 22 19 16 31 6B : nop 47 op rg2 nop nop 8 op rg2 nop 40 38 35 32 0 nop 24 nop 16 nop 8 0 21 5. コール/リターン PC 相対コール命令(6B エンコーディングのみ) zCALL sim32 # zPUSH PC; PC = PC + 6 + sim32 レジスタ間接ジャンプ & リンク命令 zJALR rg2 # zPUSH PC; PC = r[rg2] リターン命令 zRET # PC = zPOP; 22 プロセッサの実装 • モジュール構成 • 各モジュールの実装 後期実験 プロセッサの設計と実装 23 命令の実行フェーズ 1. F 命令フェッチ 2. R 命令デコード/レジスタ読み出し 3. X 実行 4. M メモリ・アクセス 5. W レジスタ書き戻し (Write-Back) 24 コンポーネント 略称 アーキテクチャ ステート メモリ・バス アーキテクチャ ステートではない レジスタ 名称 RF レジスタ・ファイル PC プログラム・カウンタ MM メイン・メモリ MA メモリ・アドレス・バス MD メモリ・データ・バス 説明 IR 命令レジスタ フェッチした命令を格納 SR ソース・レジスタ ソース・オペランドを格納 TR ターゲット・レジスタ ※1 ↑ DR データ・レジスタ 演算の結果を格納 MAR メモリ・アドレス・レジスタ ※2 ロード/ストア命令で MM へのアドレスを格納 MDR メモリ・データ・レジスタ ロード命令で MM から読み出したデータを格納 ※1: ターゲット・レジスタという名称は必ずしも一般的ではない. ※2: この資料のブロック図では DR で代用している. 25 PC F R IR rg1 rg2 Reg File X TR SR MA M W flags MD DR MDR Main Memory 26 PC F R IR rg1 rg2 Reg File X TR SR MA M W flags DR MD MAR MDR Main Memory 27 PC F R IR rg1 rg2 Reg File X TR SR MA MD SR2 M flags DR Main Memory W DR2 28 実行例 100 zLD cx, 8, dx # r2 = *(r1 + 8) 104 zADDI 1, dx # r2 += 1 29 F 100 104 R 0 200 ld 2 1 8 IR rg1 100 ld 2 1 8 rg2 Reg File X PC 104 add 2 2 1 TR SR 208 M W flags DR DR2 MA MDR 1000 MD Main Memory 30 F 104 0 R 200 PC ld 2 1 8 IR rg1 104 add 2 2 1 200 X 100 ld 2 1 8 rg2 Reg File TR 8 SR 208 M W flags DR DR2 MA MDR 1000 MD Main Memory 31 F 104 PC ld 2 1 8 0 R IR 200 rg1 104 add 2 2 1 200 X 100 ld 2 1 8 rg2 Reg File TR 8 SR 208 M W 208 flags DR2 DR MA MDR 1000 MD Main Memory 32 F 104 PC ld 2 1 8 0 R IR 200 rg1 104 add 2 2 1 200 X 100 ld 2 1 8 rg2 Reg File TR 8 SR 208 M W 208 flags DR2 MA DR 1000 MDR 1000 MD Main Memory 33 F 104 PC ld 2 1 8 0 R IR 200 rg1 1000 Reg File 104 add 2 2 1 200 X 100 ld 2 1 8 rg2 TR 8 SR 208 M W 208 flags DR2 MA DR 1000 MDR 1000 MD Main Memory 34 F 104 108 PC ld 2- 12 81 add 0 R IR 200 rg1 1000 Reg File 104 add - 2 1 200 X 100 ld 2 1 8 rg2 TR 8 SR 208 M W 208 flags DR2 MA DR 1000 MDR 1000 MD Main Memory 35 F 108 PC add - 2 1 0 R IR 200 rg1 1000 Reg File 104 add - 2 1 1000 200 X 100 ld 2 1 8 rg2 TR 81 SR 208 M W 208 flags DR2 MA DR 1000 MDR 1000 MD Main Memory 36 F 108 PC 0 R 200 1000 Reg File add - 2 1 IR rg1 104 add - 2 1 1000 X 100 ld 2 1 8 rg2 TR 1 SR 208 M W 1001 208 flags DR2 MA DR 1000 MDR 1000 MD Main Memory 37 F 108 PC 0 R 200 1000 Reg File add - 2 1 IR rg1 104 add - 2 1 1000 X 100 ld 2 1 8 rg2 TR 1 SR 208 M W 1001 flags DR2 1001 MA DR 1000 MDR 1000 MD Main Memory 38 F 108 PC 0 R 200 1001 1000 Reg File add - 2 1 IR rg1 104 add - 2 1 1000 X 100 ld 2 1 8 rg2 TR 1 SR 208 M W 1001 flags DR2 1001 MA DR 1000 MDR 1000 MD Main Memory 39 フェーズ・フロー・チャート F LD R X RF → TR M W DR → MA MD → MDR MDR → RF DR → MA SR → MD ー TR + sim8 → DR ST ALU R&R ALU R&I TR op SR → DR PC++ → MA MD → IR DR2 → RF RF → TR TR op sim8 → DR DR → DR2 PC + sim8 → DR DR2 → PC … 分岐 RF → SR RF → TR 40 PC 周辺 F フェーズ インクリメント 1 W フェーズ 分岐成立なら,DR をロード dr[31:2] phase[`ph_f] phase[`ph_w] we ct_taken pc[31:2] 41 PC 周辺 (Verilog) module pc(phase, ct_taken, dr, pc, clk, n_rst); input [`ph_w : `ph_f] phase; // フェーズ信号. input ct_taken; // 分岐成立.zB, zJR などでも 1 input [31:0] dr; // 分岐先 output [31:0] pc; // PC 本体の出力 input clk, n_rst; // リセットは負論理 reg [31:0] pc; always @(posedge clk or negedge n_rst) begin if (n_rsts == 0) pc <= 0; else if (phase[`ph_f] == 1) pc <= pc + 4; else if (phase['ph_w] == 1 && ct_taken == 1) pc <= dr; end // always endmodule 42 教科書に良くあるシングルサイクルプロセッサ (ただしこの絵はMIPS風) Taken (br & 0) regDest regWrite srcImm 1 0 + aluFunc npc <<2 memRead + 4 memData memWrite [25-21] [20-16] PC inst. [31-0] 命令メモリ [15-11] ALU #rs1 rs1 #rs2 1 0 rd rs2 result [15-0] 0 1 sign ext. 後期実験 プロセッサの設計と実装 データメモリ 0 1 43 レポートについて 1. 紙媒体 – レポート表紙 2. ソースコード – TAさんに提出 3. レポート本文 – – PDFまたはtxt [email protected] • サブジェクトを必ず「2015PEX-(学籍番号)」とすること – 設計の概要,とくに工夫/苦労した実装について詳細,性能評価 • 簡潔でOK ただし上の3点が分かるようになっていること • 〆切:実験終了から2週間後 後期実験 プロセッサの設計と実装 44 性能評価? • まずは課題プログラムがどこまで動いたか,正確 な結果がでたか • 性能評価指標…? – クロック数 – プログラム毎のMIPSとか • 性能改善にむけて – どのようにすればどれくらい良くなりそうか – 実際にやってみた結果 後期実験 プロセッサの設計と実装 45 提出方法 • 紙媒体 – 表紙だけなのでできれば最終日に提出 – そこで出し損ねたら研究室まで • ソースコード – とりあえず最終日に回収 – その後もコーディング続けたければ研究室までどうぞ • で,二週間後に提出 • レポート – サブジェクトに気をつけてメールで提出 後期実験 プロセッサの設計と実装 46 研究室での継続・提出 • 11F112B • ふらっと来てくれて構いませんが 入江までアポイントとってからの方が確実です 後期実験 プロセッサの設計と実装 47
© Copyright 2025 ExpyDoc