4.パイプラインの検討(Jun.28.2004)

パイプラインの段数をいくらにするべきか?

当初、3段、4段、を検討し、最終的に5段に決定しました。

LUT節約の為、レジスタファイルは、RAMにせざるを得ません。ブロック図を数回書き直し/論理合成、試行錯誤を繰り返した結果、パイプラインの段数が増えてしまいました。また、見かけのパフォーマンスを良く見せるために、ドライストーンベンチマークでは、最低16KBの内部RAMが必要で、このRAMに対し1CLOCKでR/Wできることを重要視しました。結果、分岐性能にしわ寄せがきてしまいました。

StaratixUWEB EDITIONのフロアプランなしでも150MHz程度(100DMPIS)で駆動できます。
100DMIPSは10年前のペンティアム90MHzに相当する値です。
 









パイプライン検討





StratixUを論理合成しながら、最適なStage構成を考える





Jun.28.2004 Tak.Sugawara

































通常命令




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1 RF
   
t2 F&D1 RF ALU       
t3 F&D1 RF ALU MEM

t4 F&D1 RF ALU MEM WB
t5
RF ALU MEM WB
t6

ALU MEM WB
t7

  MEM WB
 


  WB

   

 






















NOTE:





メモリアクセス(R/W)は、パイプラインの同じステージでやらないと、競合する。





Forwardingは、RReg(前段)、RReg(後段)から、ALU_left_latch,ALU_Right_latchへ行う





メモリリード結果は、STAGE5に得られる。1NOPを挿入し、STAGE5から3へのFORWARDING



















ジャンプ先がフェッチ時に既定の場合




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1(JMP命令発見) RF
   
t2 ディレイドブランチ命令 ジャンプ先SET ALU       
t3 F&D1(ジャンプ先命令) RF ALU MEM

t4 F&D1 RF ALU MEM WB
t5
RF ALU MEM WB
t6

ALU MEM WB
t7

  MEM WB
 


  WB

   

 















NOTE:





JMP先が既定なので、Stage2でPCをSETできる。


























レジスタジャンプ




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1(レジスタJMP命令発見) RF
   
t2 ディレイドブランチ命令 RF ALU       
t3 F&D1 RF ジャンプ先アドレスSET MEM

t4 F&D1(ジャンプ先命令) NOPにする ALU MEM WB
t5
RF NOP MEM WB
t6

ALU NOP WB
t7

  MEM NOP
 


  WB








NOTE:





レジスタが決まらないとJMPできない。





決まるのは、STAGE3





 =>2命令のディレイドブランチをCコンパイラで検討要





ディレイドブランチ命令は、ブランチ命令でないこと(Check)












ブランチ命令でブランチする場合




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1(BracnchP命令発見) RF
   
t2 ディレイドブランチ命令 RF ALU       
t3 F&D1 RF ジャンプ先判断(Taken) MEM

t4 F$D1 NOPにする ALU ブランチ先SET WB
t5 ブランチ先命令 NOPにする NOP MEM  
t6
RF NOP NOP WB
t7

ALU NOP NOP
 


MEM NOP
 



WB

NOTE:





ブランチ判断とブランチアドレスSETをStage3にしたい、





レジスタ決定がStage3、それから、32ビットコンペアして、アドレス計算、アドレスSet





 =>timing間に合わずアドレスSetをStage4に移行





 =>3命令のディレイドブランチをCコンパイラで検討要





ディレイドブランチ命令は、ブランチ命令でないこと(Check)



















ブランチ命令でブランチしない場合




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1(BracnchP命令発見) RF
   
t2 ディレイドブランチ命令 RF ALU       
t3 F&D1 RF ジャンプ先判断(NotTaken) MEM

t4 F&D1 RF ALU MEM WB
t5 F&D1 RF ALU MEM WB
t6
RF ALU MEM WB
t7

ALU MEM NOP
 


MEM NOP
 



WB




































割り込みの条件




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1(割り込み命令発見) RF
   
t2 InterruptNOP 割り込み先SET ALU       
t3 F&D1(割り込み先命令) NOP  ALU MEM

t4 F&D1 RF NOP MEM WB
t5
RF ALU NOP WB
t6

ALU MEM NOP
t7

  MEM WB
 


  WB

割り込みの条件





Branch中ではないこと。



















乗除算結果読み込み命令




時刻  Stage1 Stage2 Stage3 Stage4 Stage5

フェッチ&デコード1  デコード2 MEMアドレスセット MEM読み出し整列 MEM読み出し

レジスタファイル読み出しアドレスセット レジスタファイル読み出し MEMWrite
レジスタファイル書き込み

  Alu前段ラッチ(LEFT/RIGHT_LATCH) Alu演算結果ラッチ(AReg) Nreg Rreg
t0 F&D1      

t1 F&D1(乗算Read命令発見) Set RF
   
t2 NOP SAVE_PC ALU       
t3 乗除算が終了していないなら待ち NOP  NOP MEM

t4 NOP 次のPC<=読み込み命令の再実行 NOP NOP WB
Tx-1 NOP NOP  NOP NOP NOP
Tx  F&D1 NOP  NOP MEM NOP
Tx+1
RF NOP MEM WB
 

ALU NOP WB








MULDIVは、ストールしない。





実行Moduleが、実行するのみ。





読み出し命令が来て、終了していないときストールし、乗除算終了を待って再実行する。





(ストール機構を簡単にするため。現在の実装では、乗算が2CLOCKで終了するのに対し、待ちで8CLK消費してしまう。アセンブラでNOPを乗算は挿入した方がよい。)