1 / 31

PICO のパイプライン化

PICO のパイプライン化. 慶應義塾大学 理工学部 天野. MUX. MUX. MUX. MUX. MUX. PICO の構成(前期の図を若干変更). regc. aluout. outc. op. pc. ir. com. op2. ALU. op. 110 001. alubin. aluain. Expander. ‘2’. regb. op2. rega. dest. adrA. src. adrB. idata. regfile. ddatain. ddataout. we_. Instruction

irving
Télécharger la présentation

PICO のパイプライン化

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PICOのパイプライン化 慶應義塾大学 理工学部 天野

  2. MUX MUX MUX MUX MUX PICOの構成(前期の図を若干変更) regc aluout outc op pc ir com op2 ALU op 110 001 alubin aluain Expander ‘2’ regb op2 rega dest adrA src adrB idata regfile ddatain ddataout we_ Instruction Memory Data Memory iadr dadr

  3. パイプライン処理の設計 • 大きな処理を一定の同じ大きさの小さな段階(ステージ)に分解 • それぞれのステージにそれぞれの処理装置を設ける • 順にデータを流してやり、自分の処理が終わったらすぐ次のステージに渡す • 流れ作業と基本は同じ • ステージ数をSとすると、理想の場合は性能はS倍 • ステージの処理量が均等でないと、最も重いものに律速される • ステージ間の受け渡しで大概ロスがある

  4. 組合せ回路 ステージ 1 ステージ 2 ステージ 3 ステージ 4 ステージ 1 ステージ 2 ステージ 3 ステージ 4 ステージ 1 ステージ 2 ステージ 3 ステージ 4 ステージ 1 ステージ 2 ステージ 3 ステージ 4 ステージ 1 ステージ 2 ステージ 3 ステージ 4 パイプライン処理 時間

  5. 流れ作業(パイプライン処理)vs 多人数による並列処理流れ作業(パイプライン処理)vs 多人数による並列処理 • S人居れば最大S倍、これは同じ • 流れ作業は、各人がそのステージの処理だけできれば良い ⇔並列処理は、すべての人が全作業をする能力がなければならない • 流れ作業は、各人がそのステージの処理をするのに必要な工具(リソース)を持てば良い⇔並列処理は、すべての人がすべての工具、場所を持つ必要がある • このため、日常的な作業効率向上、工場のオートメーションなどもまずは流れ作業を導入する

  6. 状態遷移→ステージ 結果を書き込む命令 それ以外:分岐、STなど IF RF EX WB 演算実行 飛び先セット メモリからの読み 書き込み irに命令を フェッチ レジスタ 読み出し PC←PC+2 結果の格納 パイプライン化されていない設計が良くできていれば、それぞれの状態は 遅延時間がほぼ均等に分割されているはず。このため、状態をそのまま パイプラインのステージに割り当ててしまうのが基本的な設計手法

  7. PICOのパイプライン構造 RFPC WB IF RF EX a 2 regc rega + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  8. LDLI r1,#1 RFPC IF RF EX WB a 2 regc rega + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  9. LDLI r2,#2 LDLI r1,#1 RFPC IF RF EX WB a 2 regc rega + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  10. LDLI r3,#3 LDLI r2,#2 LDLI r1,#1 RFPC IF RF EX WB a 2 regc rega + 1 ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  11. ADD r1,#2 LDLI r3,#3 LDLI r2,#2 LDLI r1,#1 RFPC IF RF EX WB a 2 regc 1 rega + 2 ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  12. ADD r2,r2 ADD r1,#2 LDLI r3,#3 LDLI r2,#2 RFPC IF RF EX WB a 2 regc 2 rega + 3 ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  13. ADD r2,r2 ADD r1,#2 LDLI r3,#3 RFPC IF RF EX WB a 2 regc 3 rega + 3 ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  14. ADD r2,r2 ADD r1,#2 RFPC IF RF EX WB a 2 regc 3 rega + 4 ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  15. ADD r2,r2 RFPC IF RF EX WB a 2 regc 4 rega + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory

  16. 今回のverilog記述 ppico16_test.v テストベンチ memory.v メモリ ppico16.v CPU if_stage.v 命令フェッチ rf_stage.v レジスタフェッチ ex_stagef.v (ex_stage.v) 実行 パイプライン化はしてある Data Hazard, Control Hazardの除去はしてない →これは来週 合成対象

  17. if_stage.v module if_stage (clk,reset_,idata,pcset,badr,ifpc,ifir); `include "pico.h" input clk, reset_; input [DataBus-1:0] idata; // Data from I-Cache input pcset; // Branch Taken Signal input [AddrBus-1:0] badr; // Branch Addr output [AddrBus-1:0] ifpc; // PC ( IFstage output ) output [DataBus-1:0] ifir; // IR ( IFstage output ) reg [AddrBus-1:0] pc; reg [DataBus-1:0] ir; assign ifpc = pc; assign ifir = ir; always @( posedge clk ) begin if ( reset_ == Enable_ ) begin pc <= NULL;ir <= NULL; end else begin ir <= idata; if( pcset == Enable ) begin pc <= badr; end else begin pc <= ifpc + 2; end end end endmodule pcsetが1ならば分岐先アドレスのセット そうでなければ+2 (バイトアドレスなので)

  18. pico.h コードの定義 parameter Enable = 1'b1; parameter Disable = 1'b0; parameter Enable_ = 1'b0; parameter Disable_ = 1'b1; parameter AddrBus = 16; parameter DataBus = 16; parameter ComNum = 3; parameter RegNum = 3; parameter StateNum = 4; parameter MemSize = 32768; parameter Opcode = 5; parameter NULL = 16'h0000; parameter ROP = 5'b00000; parameter LDLI = 5'b11100; parameter LDHI = 5'b11101; parameter BNEZ = 5'b01001; parameter BEQZ = 5'b01010; parameter JMP = 5'b01111; parameter LD = 5'b01000; parameter ST = 5'b01001; parameter NOP = 5'b00000; parameter THA = 3'b000; parameter THB = 3'b001; parameter ANDOP = 3'b010; parameter OROP = 3'b011; parameter SLOP = 3'b100; parameter SROP = 3'b101; parameter ADDOP = 3'b110; parameter SUBOP = 3'b111;

  19. rf_stage.v 1 入出力と定義 module rf_stage ( clk, reset_, ifir, ifpc, rwe, c, rwadr, rfpc, rfir, a, b, imm ); `include "pico.h" input clk; input reset_; input [DataBus-1:0] ifir; // IR ( IF stage output ) input [AddrBus-1:0] ifpc; // PC ( IF state output ) input rwe; // Register Write Enable (c) input [DataBus-1:0] c; // Destination Data input [RegNum-1:0] rwadr; // Destination Register No output [DataBus-1:0] rfpc; // PC ( RFstage output ) output [DataBus-1:0] rfir; // IR ( RFstage output ) output [DataBus-1:0] a; // Source Data A output [DataBus-1:0] b; // Source Data B output [DataBus-1:0] imm; // Immediate Data // Pipeline Registers reg [DataBus-1:0] reg_a; reg [DataBus-1:0] reg_b; reg [DataBus-1:0] reg_im; reg [DataBus-1:0] reg_ir; reg [AddrBus-1:0] reg_pc; // Outputs assign rfir = reg_ir; assign rfpc = reg_pc; assign a = reg_a; assign b = reg_b; assign imm = reg_im;

  20. rf_stage.v 2 レジスタファイルとレジスタセットrf_stage.v 2 レジスタファイルとレジスタセット // Register File wire [DataBus-1:0] dout1; // Register File Output for Source A (Rd) wire [DataBus-1:0] dout2; // Register File Output for Source B (Rs) regfile regfile ( // See regfile.v .clk( clk ), .adrA( ifir[10:8] ), // Read Address for Source A .adrB( ifir[7:5] ), // Read Address for Source B .adrC( rwadr ), // Write Address .inc( c ), // Write Data .outa( dout1 ), .outb( dout2 ), .rwe( rwe ) // Write Enable ); always @( posedge clk ) begin if ( reset_ == Enable_ ) begin reg_ir <= NULL;reg_pc <= NULL; reg_a <= NULL;reg_b <= NULL; end else begin reg_ir <= ifir;reg_pc <= ifpc; reg_a <= dout1;reg_b <= dout2; reg_im <= {{8{ifir[7]}},ifir[7:0]}; end end endmodule

  21.  レジスタファイル本体 module regfile (clk, adrA, adrB, adrC, inc, outa, outb, rwe); `include "pico.h" input clk; input [RegNum-1:0] adrA, adrB, adrC; input [DataBus-1:0] inc; output [DataBus-1:0] outa, outb; input rwe; reg [DataBus-1:0] rfile [0:7]; assign outa = rfile[adrA]; assign outb = rfile[adrB]; always @(posedge clk) if (rwe) rfile[adrC] <= inc; endmodule データ入力用Cポートを独立

  22. ex_stage.v 入出力 module ex_stage (clk,reset_,rfir,rfim,a,b,ddatain,rfpc,c,ddataout, address,rwadr,dmwe,rwe,pcset); `include "pico.h" input clk; input reset_; input [DataBus-1:0] rfir; // IR ( RF stage output ) input [DataBus-1:0] rfim; // Immediate Data input [DataBus-1:0] a; // Source Data A input [DataBus-1:0] b; // Source Data B input [DataBus-1:0] ddatain; // Read Data from D-Memory input [DataBus-1:0] rfpc; // PC (RF stage output ) output [DataBus-1:0] c; // Operation Result output [DataBus-1:0] ddataout; // Write Data to D-Memory output [AddrBus-1:0] address; // Address for D-Memory access output [RegNum-1:0] rwadr; // Destination Register No output dmwe; // D-Memory Write Enable output rwe; // Register Write Enable output pcset; // PC branch address set

  23. ex_stage.v レジスタと簡単な論理部の接続 // Pipeline Registers reg [DataBus-1:0] reg_c; reg [RegNum-1:0] reg_rwadr; reg reg_rwe; reg pcsetr; // Temporary Wire wire [DataBus-1:0] aluout; // ALU Output wire [ComNum-1:0] aluope; // ALU Operation wire [DataBus-1:0] alu_ina, alu_inb;// Temporary Wire for ALU Source B wire [DataBus-1:0] result; // Temporary Wire for results wire rwen; wire pcsett; wire [Opcode-1:0] op, op2; wire [RegNum-1:0] dest; // Output assign rwadr = reg_rwadr; assign rwe = reg_rwe; assign c = reg_c; assign pcset = pcsetr; assign address = (op ==ROP) & (op2 == ST)? a : b; assign ddataout = b; assign op = rfir[15:11]; assign dest = rfir[10:8]; assign op2 = rfir[4:0]; assign dmwe = ( op == ROP )& (op2 == ST) ? Enable : Disable;

  24. ex_stage.v ALU // ALU operation assign aluout = alu ( alu_ina, alu_inb, aluope ); // ALU ( ThrohghA, ThrohghB, And, Or, ShiftLeft, ShiftRight, Add, Sub ) function [DataBus-1:0] alu ; input [DataBus-1:0] a, b; input [ComNum-1:0] com; case(com) THA: alu = a ; THB: alu = b ; ANDOP: alu = a & b; OROP: alu = a | b; SLOP: alu = a << b[3:0]; SROP: alu = a >> b[3:0]; ADDOP: alu = a + b; SUBOP: alu = a - b; endcase endfunction

  25. ex_stage.v ALU周辺中間信号線 やや見にくい // Intermediate wires assign alu_ina = (op == BNEZ) | (op == BEQZ) ? rfpc: a; assign alu_inb = // Sign extended immediate ( rfir[15:13] == 3‘b001 ) | (op == BEQZ) | (op == BNEZ) | (op == LDLI) ? rfim: (op == ROP) ? b: (op == LDHI) ? {rfir[7:0],8'b0}: // LDHI {8'b0,rfir[7:0]}; // Sign unextended immediate assign aluope = // Braches (op == BEQZ) | (op == BNEZ) ? ADDOP: (op == LDLI) | (op == LDHI) ? THB: // LDLI, LDHI (op == ROP) ? rfir[2:0]: rfir[13:11]; assign rwen = // Disable when Braches or ST (op == BEQZ) | (op == BNEZ) | ((op == ROP) & (op2 == ST)) | ((op == ROP) & (op2 == NOP)) ? Disable : Enable; assign result = // when LD datain ((op == ROP) & (op2 == LD)) ? ddatain : aluout; assign pcsett = ( op == BEQZ )& (a==16'h0000) | ( op == BNEZ )& (a!=16'h0000) ;

  26. ex_stagef.v functionの利用 複雑な記述をfunction文で置き換える // Intermediate wires assign alu_ina = (op == BNEZ) | (op == BEQZ) ? rfpc: a; function [DataBus-1:0] aluinb; input [Opcode-1:0] ope; input [7:0] imm; input [DataBus-1:0] rfim, b; if(ope[4:2]==3'b001) aluinb = rfim; else case(ope) BEQZ, BNEZ, LDLI : aluinb = rfim; ROP: aluinb = b; LDHI: aluinb = {imm,8'b0}; default: aluinb = {8'b0,imm}; endcase endfunction assign alu_inb = aluinb(op,rfir[7:0],rfim,b); function [ComNum-1:0] aluope; input [Opcode-1:0] ope; input [ComNum-1:0] func; case (ope) BEQZ, BNEZ : aluope = ADDOP; LDLI, LDHI : aluope = THB; ROP: aluope = func; default: aluope = ope[ComNum-1:0]; endcase endfunction assign alu_ope = aluope(op,op2[ComNum-1:0]); 簡単なものは今まで通り

  27. ex_stage.v レジスタのセット always @ ( posedge clk or negedge reset_ ) begin if ( reset_ == Enable_ ) begin reg_c <= NULL; reg_rwadr <= NULL; reg_rwe <= Disable; pcsetr <= Disable; end else begin // See Figure reg_c <= result; reg_rwadr <= dest; reg_rwe <= rwen; pcsetr <= pcsett; end end

  28. ppico.v 入出力と接続信号線 module ppico16 (clk,reset_,idata,ddatain,iaddr,daddr,ddataout,dmwe); `include "pico.h" input clk, reset_; input [DataBus-1:0] idata; // Instruction Data from I-Memory input [DataBus-1:0] ddatain; // Read Data from D-Memory output [AddrBus-1:0] iaddr; // Instruction Addr to I-Memory output [AddrBus-1:0] daddr; // Data Addr to D-Memory output [DataBus-1:0] ddataout; // Write Data to D-Memory output dmwe; // D-Memory Write Enable // IF & RF stage wire pcset; // Branch Taken Signal wire [AddrBus-1:0] ifpc; // PC ( IFstage output ) wire [DataBus-1:0] ifir; // IR ( IFstage output ) // RF stage wire rwe; // Register Write Enable wire rwen; // RWE for Next Clock Cycle // RF & EX stage wire [DataBus-1:0] a; // Source Data A wire [DataBus-1:0] b; // Source Data B wire [DataBus-1:0] c; // Destination Data wire [DataBus-1:0] imm; // Immediate Data wire [ComNum-1:0] rwadr; // Destination Register No wire [DataBus-1:0] rfir; // IR ( RFstage output ) wire [AddrBus-1:0] rfpc; // PC ( RFstage output )

  29. ppico.v ステージ間接続 assign iaddr = ifpc; // Fetch Addr to Instruction Memory if_stage if_stage ( .clk( clk ), .reset_( reset_ ), .idata( idata ), .pcset( pcset ), .badr( c ), .ifpc( ifpc ), .ifir( ifir ) ); rf_stage rf_stage ( .clk( clk ), .reset_( reset_ ), .ifir( ifir ), .ifpc( ifpc ), .rwe( rwe ), .c( c ), .rwadr( rwadr ), .rfpc( rfpc ), .rfir( rfir ), .a( a ), .b( b ), .imm( imm ) ); ex_stage ex_stage ( .clk( clk ) .reset_( reset_ ),.rfir( rfir ), .a( a ), .b( b ), .rfim( imm ), .ddatain( ddatain ), .rfpc(rfpc), .c( c ), .ddataout( ddataout ), .address( daddr ), .rwadr( rwadr ), .dmwe( dmwe ), .rwe( rwe ), .pcset(pcset) );

  30. test.prg 11100_001_00000001 // LDLI r1,#1 11100_010_00000010 // LDLI r2,#2 11100_011_00000011 // LDLI r3,#3 00110_001_00000010 // ADDI r1#2 00000_010_010_00110 // ADD r2,r2 00000_000_00000000 // NOP 00000_000_00000000 // NOP 00000_000_00000000 // NOP 00000_000_00000000 // NOP 00000_000_00000000 // NOP ikarus verilog で実行してgtkwaveで波形を見てみよう

  31. 演習 • LDHI2 rd,#X rdの上位8ビットにXをセットし、下位8ビットはrdのままにする命令を付け加えてみよ。

More Related