計算機構成 第5回 RISCの命令セットアーキテクチャ テキスト第4章

Slides:



Advertisements
Similar presentations
天野 コンピュータ基礎  入出力
Advertisements

CPU設計と パイプライン.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
VLSI設計論第4回 アキュムレータマシンと 仮遅延シミュレーション
計算機システムⅡ 主記憶装置とALU,レジスタの制御
CPU実験 第1回中間発表 4班 瀬沼、高橋、津田、富山、張本.
情報システム基盤学基礎1 コンピュータアーキテクチャ編 第2回 命令
Ibaraki Univ. Dept of Electrical & Electronic Eng.
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
Verilog HDL 12月21日(月).
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目
オリジナルなCPUの開発 指導教授:笠原 宏 05IE063 戸塚 雄太 05IE074 橋本 将平 05IE089 牧野 政道
計算機構成 第7回 サブルーチンコールとスタック テキストp85-90
第4回目 2006/05/08.
コンピュータ工学基礎 パイプラインハザード テキスト9章 115~124
計算機システムⅡ 命令セットアーキテクチャ
プログラムはなぜ動くのか.
計算機構成 第9回 POCOの性能評価と論理合成 テキスト7章
2016年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
基本情報技術概論(第8回) 埼玉大学 理工学研究科 堀山 貴史
第7回 2006/6/12.
計算機入門I ハードウェア(1) 計算機のハードウェア構成 ~計算機のハードウェアとは何か~
第3回目 2006/05/01.
計算機構成 第1回 ガイダンス VerilogHDLのシミュレーション環境
計算機システム 第1回 2006/04/22.
・ディジタル回路とクロック ・プロセッサアーキテクチャ ・例外処理 ・パイプライン ・ハザード
高速剰余算アルゴリズムとそのハードウェア実装についての研究
アドバンスト コンピュータ アーキテクチャ RISC と 命令パイプライン
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
TA 高田正法 B10 CPUを作る 3日目 SPIMの改造 TA 高田正法
第6回 6/4/2011 状態遷移回路とシングルサイクルCPU設計
コンピュータの基本構成について 1E16M001-1 秋田梨紗 1E16M010-2 梅山桃香 1E16M013-3 大津智紗子
計算機構成 第6回 分岐命令とプログラムの実行 テキスト第5章
ディジタル回路の設計と CADによるシステム設計
計算機構成 第2回 ALUと組み合わせ回路の記述
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
計算機構成 第4回 アキュムレータマシン テキスト第3章
VLSI設計論第3回 順序回路の記述と論理合成
08. メモリ非曖昧化 五島 正裕.
計算機構成 第8回 POCOの構造とVerilog記述 テキスト第5章-第6章
計算機構成 第11回 マルチサイクルCPU 慶應大学 天野英晴.
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
コンピュータアーキテクチャ 第 11 回.
コンピュータアーキテクチャ 第 10 回.
09. メモリ・ディスアンビギュエーション 五島 正裕.
2010年度 情報科学序論 ~ 内部構造と動作の仕組み(2) ~.
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
Ibaraki Univ. Dept of Electrical & Electronic Eng.
コンピュータアーキテクチャ 第 9 回.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 4 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第一回 計算機の歴史、基本構成、動作原理
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
2017年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
コンピュータアーキテクチャ 第 4 回.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
プロセッサ設計支援ツールを用いた 独自プロセッサの設計
コンピュータアーキテクチャ 第 9 回.
コンピュータアーキテクチャ 第 5 回.
コンピュータアーキテクチャ 第 11 回.
コンピュータ工学基礎 マルチサイクル化とパイプライン化 テキスト9章 115~124
2014年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
情報システム基盤学基礎1 コンピュータアーキテクチャ編
2008年度 情報科学序論 ~ 内部構造と動作の仕組み(2) ~.
情報システム基盤学基礎1 コンピュータアーキテクチャ編
Presentation transcript:

計算機構成 第5回 RISCの命令セットアーキテクチャ テキスト第4章 情報工学科 天野英晴

アキュムレータマシン 利点:単純、オペランドが1つ 欠点:レジスタが1つで不便 メモリへのポインタができない → 他の命令セットへ → 他の命令セットへ   operand 00000000 + 7 1 com --- Y S A B clk Dec. =0? PC 1010 en=0 clk 2 6 命令 1010 00000000 2 3 1 … … 命令メモリ clk we=0

命令セットアーキテクチャ(Instruction Set Architecture: ISA)とは? ソフトウェアとハードウェアのインタフェース プログラムはISAを対象にすれば個々のハードウェアは気にしなくてもいい ハードウェアはISAが動けば共通のプログラムが動く IBM360開発時に明確になった概念 それまでは開発したマシン毎にソフトウェアを作っていた 様々な性能、価格のモデルが同じISAを共通できた → IBMのメインフレームでの覇権を確立した IntelのIA32、ARM、SPARC、MIPSなどが長期間に渡って拡張され、利用されている

ISAの分類 オペランド数による分類 0:スタックマシン 1:アキュムレータマシン 2,3:汎用(専用)レジスタマシン PUSH 0 PUSH 1 ADD POP 2 演算スタックを使う方法 B5000、HP9000などの名機があったが80年代に絶滅→スタックを使うとパイプライン化、複数命令発行ができない 1:アキュムレータマシン LD 0 ADD 1 ST 2 EDSAC、EDVACなど黎明期のマシン 6800、6502など黎明期のマイクロプロセッサ 当初からインデックスレジスタは必要としていた レジスタが増えて汎用(専用)レジスタマシンに進化し、消滅 2,3:汎用(専用)レジスタマシン LD R0,0 ADD R1,1 ST R0,2 現在のマシンは全てここに分類される

汎用レジスタマシンの分類 オペランド中にメモリの指定をいくつ許すか? 一つも許さない:register-register型 (load/storeマシン) RISC (Reduced Instruction Set Computer)   〇命令長が固定、各命令が簡単、高速実行可能   ×命令数が多くなる          ARM、MIPS、SPARCなど 一つだけ許す:register-memory型  中間的な性質: IA32(x86)など 全て許す:memory-memory型  CISC (Complex Instruction Set Computer) 〇命令数が少なくて済む ×命令長が可変、各命令が複雑になりがち           VAX-11、PDP-11など

register-register型の データパス Y S A B 必ずレジスタに持ってきてから演算を行う LD R0,0 LD R1,1 ADD R1,R0 ST R1,2 固定長命令が可能だが 命令数が増える LD/STばかりやる→load/storeマシン 簡単な命令で構成 RISC(Reduced Instruction Set Computer) … we clk

memory-memory型の データパス Y S A B メモリ同士の演算が可能 (もちろんレジスタとの間でも可能) ADD 2,1,0 一命令で複雑な操作が実行可能 高級言語との間のギャップ(Semantic Gap)が小さい 命令長が可変 複雑 CISC(Complex Instruction Set Computer) … we clk

register-memory型の データパス Y S A B メモリとレジスタの演算は可能 LD R0,0 ADD R0,1 ST R0,2 命令長は可変だがmemory-memoryよりは簡単 アキュムレータマシンの自然な発展形 … we clk

各型の消長 1950 1960 1970 1980 1990 草創期のコンピュータ アキュムレータ マシン 見た目は 全盛 IBM360/370 x86の登場 register-memory メインフレーム Pentium-II でバイナリ変換 PDP-8 VAX-11で全盛期 memory-memory 絶滅 RISC vs. CISC論争 register-register IBM801 RISC-I,MIPS、ARM B5000が慶應ITCに! スタック マシン 絶滅

教育用RISC POCO 16bitのregister-register型 レジスタ8本 (r0-r7) 2オペランド命令 命令メモリ、データメモリのアドレス、データ共に16bit(64K×16ビット) レジスタ8本 (r0-r7) 2オペランド命令     ADD r0,r1 r0 ← r0+r1 左:destination operand 右:source operand (IBM/Intel方式) 前身のPICOをさらに簡単化 とにかく実装が楽になるように

メモリの読み書き レジスタ間接指定 実効アドレス(実際に読み書きされるアドレス)=レジスタの内容 LD r0,(r1) r1の中身の番地のデータを読み出してr0に転送 ST r0,(r1) r1の中身の番地に、r0を書き込む 実効アドレス(実際に読み書きされるアドレス)=レジスタの内容 他にもアドレッシングモード(実効アドレスを決める方法)は色々あるがPOCOはレジスタ間接指定しか持って居ない アキュムレータマシンの際のLD 0は、直接指定と呼ぶ しかしこれはPOCOでは持っていない

基本演算命令 レジスタ同士でしか演算はできない ADD r1,r2 r1←r1+r2 SUB r1,r2 r1←r1-r2 AND r1,r2    r1←r1 AND r2 OR r1, r2    r1←r1 OR r2 SL r1       r1<<1 SR r1      r1>>1 MV r1,r2 r1 ← r2 単純な移動 NOP             何もしない(NoOperation)

イミーディエイト命令 命令コード中の数字(直値)がそのまま演算に使われる LDI r1,#1 r1←1 ADDI r1,#5 r1←r1+5 直値は8ビット符号付 → 演算時は16ビットに符号拡張(sign extension)される 符号無し命令 LDIU r1,#200 r1←200 ADDIU r1,#0xf0 r1←r1+0xf0 (ADDI r1,#0xf0ならばr1←r1-16)

プログラム例 0番地の内容と1番地の内容を加算して2番地に格納せよ LDI r0,#0 // r0: ポインタ LD r1,(r0) // 0番地から読み出し ADDI r0,#1   // ポインタを先に進める LDI r0,#1でもいい LD r2,(r0)    // 1番地から読み出し ADD r1,r2    // 加算 ADDI r0,#1   // ポインタを先に進める LDI r0,#2でもいい ST r1,(r0)    // 結果を2番地にしまう LDIの代わりにLDIU、ADDIの代わりにADDIUでも良い

命令のフィールド決め 16ビット長 opcodeで命令を判別 Immediateは8ビット I形式 ADDI ADDIU LDI LDIU 15 11 10 8 7 I形式 ADDI ADDIU LDI LDIU opcode rd Immediate 例 ADDI r2,#5  00110_010_00000101 opcodeは常に0 functを第2opcodeとして利用 15 11 10 8 7 5 4 R形式 LD ST ADD 他演算命令 00000 rd rs funct. 例 ADD r2,r3  00000_010_011_00110

レジスタファイル Aポート Bポート Address Bで与えた 番号のレジスタが Bポートから出てくる Address Aで与えた Address C rwe clk 3ポートメモリ r0-r7まで8個入っている Addressは3ビット 入出力は16ビット →要するにレジスタの集合体 rwe=1の時Address Cで与えた 番号のレジスタに対して次のclkの立上りでCポートのデータが書き込まれる Cポート

POCOの構成 Y S A B + 1 ext ext0 PC rwe … … 命令メモリ データメモリ we 2:0 00 THB 01 ADD 10 A B alu_bsel comsel + 00 01 10 1 ext ext0 7:0 rf_a rf_b aadr 10:8 badr PC cadr rf_c rwe rf_csel 1 7:5 ddatain idatain iaddr … … ddataout daddr 命令メモリ データメモリ we

LDI r1,#0の実行 Y S A B + 1 ext ext0 PC rwe=1 … … 命令メモリ データメモリ we 2:0 00 Y THB 01 S ADD 10 A B alu_bsel =01 comsel= 01 + 00 01 10 1 ext ext0 7:0 00000000 rf_a rf_b 001 aadr 10:8 badr PC cadr rf_c rwe=1 rf_csel =0 1 7:5 01000_001_00000000 ddatain idatain iaddr … … ddataout daddr 命令メモリ データメモリ we

LD r2,(r0)の実行 Y S A B + 1 ext ext0 PC rwe=1 … … 命令メモリ データメモリ we 010 2:0 00 Y THB 01 S ADD 10 A B alu_bsel comsel + 00 01 10 1 ext ext0 7:0 rf_a rf_b 010 aadr 10:8 badr PC cadr 000 rf_c rwe=1 rf_csel =1 1 7:5 00000_010_000_01001 ddatain idatain iaddr … … ddataout daddr 命令メモリ データメモリ we

ST r2,(r0)の実行 Y S A B + 1 ext ext0 PC rwe=0 … … 命令メモリ データメモリ we=1 010 2:0 00 Y THB 01 S ADD 10 A B alu_bsel comsel + 00 01 10 1 ext ext0 7:0 rf_a rf_b 010 aadr 10:8 badr PC cadr 000 rf_c rwe=0 rf_csel =1 1 7:5 00000_010_000_01000 ddatain idatain iaddr … … ddataout daddr 命令メモリ データメモリ we=1

ADD r1,r2の実行 Y S A B + 1 ext ext0 PC rwe=1 … … 命令メモリ データメモリ we 110 001 2:0 00 110 Y THB 01 S ADD 10 A B alu_bsel =00 comsel= 01 + 00 01 10 1 ext ext0 7:0 rf_a rf_b 001 aadr 10:8 badr PC cadr 010 rf_c rwe=1 rf_csel =0 1 7:5 01000_001_010_00110 ddatain idatain iaddr … … ddataout daddr 命令メモリ データメモリ we

POCOのVerilog記述 module poco( input clk, rst_n, input [15:0] idatain, input [15:0] ddatain, output [15:0] iaddr, daddr, output [15:0] ddataout, output we); reg [15:0] pc; wire [15:0] rf_a, rf_b, rf_c, alu_b, alu_y; wire [4:0] opcode, func; wire [2:0] rs,rd; wire [2:0] com; wire [7:0] imm; wire rwe; wire st_op,addi_op, ld_op,alu_op,ldi_op,ldiu_op,addiu_op; 入出力は図通り データパスの中間信号 命令の分離 デコード信号

POCOのVerilog記述 assign ddataout = rf_a; assign iaddr = pc; assign daddr = rf_b; assign {opcode,rd,rs,func} = idatain; assign imm=idatain[7:0]; assign st_op=(opcode==`OP_REG)&(func==`F_ST); assign ld_op=(opcode==`OP_REG)&(func==`F_LD); assign ldi_op=(opcode==`OP_LDI); assign ldiu_op=(opcode==`OP_LDIU); assign addi_op=(opcode==`OP_ADDI); assign addiu_op=(opcode==`OP_ADDIU); assign we = st_op; assign alu_b = (addi_op|addiu_op)?{ {8{imm[7]}},imm} : (addiu_op | ldiu_op)?{8’b0,imm}: rf_b; 命令の分離 命令デコード 符号拡張 ゼロ拡張

符号拡張とゼロ拡張 n{x}はxをn回繰り返して並べることを意味する { {8{imm[7]}},imm} → 符号ビットを8ビット並べ、immと連結→ 符号拡張 {8’b0,imm} → 0を8個とimmを連結→                      ゼロ拡張

POCOのVerilog記述 assign com = (addi_op|laddiu_op) ? `ALU_ADD: マルチプレクサ 図を参照 assign com = (addi_op|laddiu_op) ? `ALU_ADD: (ldi_op|ldiu_op)?`ALU_LD: func[2:0]; assign rf_c = ld_op ? ddatain : alu_y; assign rwe = ld_op | alu_op | ldi_op | ldiu_op | addi_op | addiu_op; alu alu_1(.a(rf_a), .b(alu_b), .s(com), .y(alu_y); rfile rfile_1(.clk(clk), .a(rf_a), .aadr(rd), .b(rf_b), .badr(rs), .c(rf_c), .cadr(rd), .we(rwe)); always @(posedge clk or negedge rst_n) begin if(!rst_n) pc <=0; else pc<=pc+1; 答をレジスタに書き込む命令全て ALU レジスタ ファイル PCのカウントアップ

NOP MV rd,rs rd← rs AND rd,rs rd← rd AND rs OR rd,rs rd← rd OR rs 00000------00000 MV rd,rs rd← rs 00000dddsss00001 AND rd,rs rd← rd AND rs 00000dddsss00010 OR rd,rs rd← rd OR rs 00000dddsss00011 SL rd rd← rd<<1 00000ddd---00100 SR rd rd← rd>>1 00000ddd---00101 ADD rd,rs rd← rd + rs 00000dddsss00110 SUB rd,rs rd← rd - rs 00000dddsss00111 ST rd,(ra) (ra)← rd 00000dddaaa01000 LD rd,(ra) rd← (ra) 00000dddaaa01001

LDI rd,#X rd← X(符号拡張) LDIU rd,rs rd← X(ゼロ拡張) ADDI rd,#X rd←rd+X(符号拡張) 01000dddXXXXXXXX LDIU rd,rs rd← X(ゼロ拡張) 01001dddXXXXXXXX ADDI rd,#X rd←rd+X(符号拡張) 01100dddXXXXXXXX ADDIU rd,#X rd←rd+X(ゼロ拡張) 01101dddXXXXXXXX LDHI rd,#X rd←{X,0} 01010dddXXXXXXXX

演習 演習1:0番地にA、1番地にBがある場合、(A+B) OR (A-B)をプログラムして実行せよ 演習2:LDHI(opcode: 01010)を実装せよ 上位8ビットにImmediateの数字を入れ下位を0にする LHDI r0,#5 r0 いつでも0 00000101 00000000