PIPE是最終要實現的簡易處理器,本篇主要介紹PIPE的硬件結構和流水線控制邏輯.
PIPE的硬件結構
————
流水化的最終實現-PIPE
PIPE使用旁路轉發技術,能夠解決大多數形式的數據冒險,但是不能解決Load/Use冒險和控制冒險,這需要通過流水線控制邏輯來進行控制.
PIPE的各個階段的詳見:wside-hcl.pdf,這篇文檔使用HCL詳細描述了PIPE的各個階段的實現.下面簡單圖示下.
(1).Select PC &Fetch
(2).Decode & Write Back
(3).Execute
(4).Memory
PIPE流水線的控制邏輯
————
PIPE流水線的控制邏輯必須要包含下面四個:
-加載/使用冒險(Load/UseHazard)
-預測錯誤的分支(Mispredicted Branch )
-處理ret(Processing ret)
-異常(Exception)
前三個是對冒險的控制,將它們放在一起討論,異常另外討論.
1.冒險
-觸發條件
條件 |
觸發條件 |
加載/使用冒險 |
E_icode in { IMRMOVL, IPOPL } && E_dstM in { d_srcA, d_srcB } |
預測錯誤的分支 |
E_icode = IJXX & !e_Bch |
處理ret |
IRET in { D_icode, E_icode, M_icode } |
-流水線控制邏輯的動作
Condition |
F |
D |
E |
M |
W |
加載/使用冒險 |
stall |
stall |
bubble |
normal |
normal |
預測錯誤的分支 |
normal |
bubble |
bubble |
normal |
normal |
處理ret |
stall |
bubble |
normal |
normal |
normal |
附:流水線寄存器的動作(Normal; Stall; Bubble).
- PIPE流水線控制邏輯(原始)
HCL描述
boolF_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB }||
# Stalling at fetch
while ret passes through pipeline
IRET in { D_icode, E_icode, M_icode };
boolD_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB };
boolF_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB }||
# Stalling at fetch
while ret passes through pipeline
IRET in { D_icode, E_icode, M_icode };
boolD_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB };
- PIPE流水線控制邏輯(合併) - 詳見CSAPP 301-303
2.異常處理
-異常簡介
(1).在一個實際的處理器中,處理器中很多事情會導致異常控制流,程序正常的執行流程被破壞.
(2).在一個完整的設計中,一旦異常發生,處理器會調用操作系統提供的異常處理程序.
(3).可能恢復正常的程序流.
(4).異常可以由程序執行從內部產生,也可以來自外部信號.
-異常的誘發
本文只討論四種內部產生的異常: (1). Halt指令; (2). 非法指令; (3).取指或者數據讀取訪問非法地址; (4).流水線控制錯誤.很明顯,這四類都會導致正常的程序流破壞.
-異常的處理
爲了方便處理
(1).當處理器遇到異常時,處理器直接停止運行;
(2).設置適當的狀態碼.
-典型異常示例
(1).發生在Fetch階段
主要有三種情況:
jmp $-1 #Invalid jump target(-1=0xF…F)
.byte 0xFF # Invalid instruction code
halt # Halt instruction
(2).發生在Memory階段
訪問非法地址.例如:
irmovl $100,%eax
rmmovl %eax,0x10000(%eax) # invalid address(假定如允許超過0x10000以上的地址)
(3).流水線控制錯誤
很重要的一點就是在exception發生時,引起exception的語句之前的語句已經全部執行完畢,而在exception之後的語句還沒有被執行.
示例1:多條導致異常的指令
處理方式:應該rmmovl導致異常.
示例2:分支預測錯誤
處理方式:應該沒有異常發生.
-處理方法
(1).每一個階段設置一個狀態碼;
(2). Fetch階段將狀態字段設置爲"AOK"(表示合法指令), "ADR"(取指時訪問非法地址)和"INS"(非法指令);
(3). Decode和Execute階段直接傳遞狀態字段;
(4). Memory當出現訪問非法指令,設置"ADR",或者直接使用傳遞指令;
(5).只有在Write Back階段異常才觸發.
---消除副作用:前面的exception引發後就不應該執行後面的指令.
rmmovl應該引發異常, addl指令addl指令也就不應該修改狀態.
解決方法:
(1).當在Memory階段檢測到異常,Execute階段Condition Code就不應該設置;
(2).當異常傳遞到Write Back階段(只有在Write Back階段異常纔會觸發),應該避免寫回存儲器和設置ConditionCode.
注*:本篇中的圖片均來自本書的官網,我進行了改造(註釋和添加),詳見http://csapp.cs.cmu.edu/public/figures.html
(Copyright© 2011, Randal E. Bryant and David R. O'Hallaron )
reference:
(版權所有,轉載時請註明作者和出處-dennis_fan-http://blog.csdn.net/dennis_fan