設計一個簡易的處理器(9)--PIPE的硬件結構, 流水線控制邏輯

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=0xFF)

.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). DecodeExecute階段直接傳遞狀態字段;

(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:

1. 深入理解計算機系統(原書第2版)

 

(版權所有,轉載時請註明作者和出處-dennis_fan-http://blog.csdn.net/dennis_fan

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章