pex

プロセッサの設計と実装
後期実験
プロセッサの設計と実装
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