流水線處理機(jī)及其設(shè)計(jì)精講_第1頁
流水線處理機(jī)及其設(shè)計(jì)精講_第2頁
流水線處理機(jī)及其設(shè)計(jì)精講_第3頁
流水線處理機(jī)及其設(shè)計(jì)精講_第4頁
流水線處理機(jī)及其設(shè)計(jì)精講_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、6. 3. 3流水線各級(jí)信號(hào)的產(chǎn)生至此,我們已經(jīng)描述過了所有 3種指令類型的流水線操作。下面我們來總結(jié)控制信號(hào) 的產(chǎn)生方法。控制信號(hào)分布在流水線處理機(jī)的各級(jí),我們當(dāng)然可以在它們要被使用的流水 線級(jí)產(chǎn)生,例如 simm可在exe級(jí)產(chǎn)生。但這樣,除了譯碼將會(huì)造成本級(jí)一些延遲之外, 還要使用流水線寄存器來傳遞必要的信息,例如指令操作碼等。我們采用的方法是,控制 信號(hào)集中在id級(jí)由譯碼電路產(chǎn)生,并使用流水線寄存器把每一個(gè)控制信號(hào)傳遞到它被使用 的流水線級(jí)。我們把所有的控制信號(hào)歸納在表6. 4中。表6. 5列出了除了 aluop的各控制信號(hào)的產(chǎn)生表達(dá)式。表 6. 6列出了 aluop控制信號(hào)的產(chǎn)生表達(dá)式

2、。由以上表達(dá)式,我們可以有如圖6. 29所示的控制電路。圖中使用了流水線寄存器來把控制信號(hào)傳遞到合適的流水線級(jí)。我們可以看出,流水線控制部件的設(shè)計(jì)方法與非流水 線單周期處理機(jī)的控制部件的設(shè)計(jì)方法非常類似,而有限狀態(tài)機(jī)和微程序的設(shè)計(jì)方法顯得 不太適合。表6. 4 流水線各級(jí)控制信號(hào)的定義流水線級(jí)控制信號(hào)注釋if級(jí)btaken轉(zhuǎn)移發(fā)生id級(jí)sst選擇 store(rd)exe級(jí)simmaluopwz選擇立即數(shù)alu操作碼寫z標(biāo)志mem級(jí)wmem與存何命wb級(jí)sldwreg選擇load與備存順堆表6. 5控制信號(hào)的產(chǎn)生表達(dá)式btaken=branch+bne z +beqzsst=storesimm

3、=andi+ori+addi+subi+load+storewz=andi+ori+addi+subi+and+or+add+subwmem=storesld=loadwreg=andi+ori+addi+subi+and+or+add+sub+load表6.6 alu控制信號(hào)的產(chǎn)生表達(dá)式指令aluop1aluop0操作指令aluop1aluop0操作and00與andi00與or01或ori01或add10加addi10加sub11減subi11減load1 i 0| 力口 i store i 10aluopl = add+addi+sub+subi+load+storei'a-sl

4、pzero1akegbt4ken工eku aluup圖 6. 29流水線處理機(jī)的數(shù)據(jù)路徑和控制部件aluopo = or+ori+sub+subi;1譯科相simmaluopwmem6. 4結(jié)構(gòu)相關(guān)及解決方法流水線處理機(jī)的設(shè)計(jì)存在3個(gè)非常著名的問題(hazard)。它們是11)結(jié)構(gòu)相關(guān)問題(structural hazard);(2)數(shù)據(jù)相關(guān)問題(data hazard);(3)轉(zhuǎn)移相關(guān)問題(branch hazard)。我們將在本節(jié)簡(jiǎn)要介紹第一個(gè)問題,下面兩節(jié)分別介紹第二和第三個(gè)問題。結(jié)構(gòu)相關(guān) (structural dependence)問題指的是,由于硬件資源不充足而導(dǎo)致流水線不暢通。我

5、們將舉3個(gè)例子來說明結(jié)構(gòu)相關(guān)問題及其相應(yīng)的解決方案。,第一個(gè)例子,也是最典型的例子,就是設(shè)想只為流水線處理機(jī)配備一個(gè)外部公共存儲(chǔ) 器模塊。這在現(xiàn)代計(jì)算機(jī)系統(tǒng)設(shè)計(jì)中是常見的。它的好處是程序和數(shù)據(jù)可以共享這個(gè)存儲(chǔ) 器模塊,二者之間的界限是可以動(dòng)態(tài)調(diào)整的。使用分開的兩個(gè)外部指令存儲(chǔ)器模塊和數(shù)據(jù) 存儲(chǔ)器模塊的計(jì)算機(jī)被稱為具有哈佛(harvard)結(jié)構(gòu)的計(jì)算機(jī)。依程序類型的不同,有的需要較大的程序空間和較小的數(shù)據(jù)空間;有的則需要較小的程序空間和較大的數(shù)據(jù)空間。在 這種情況下,哈佛結(jié)構(gòu)的存儲(chǔ)器不能被靈活、充分地利用。然而,如果只采用一個(gè)存儲(chǔ)器模塊而不采取任何其它的措施,則會(huì)出現(xiàn)結(jié)構(gòu)相關(guān)問題,造成流水線堵塞

6、。圖 6. 30示出了由于存儲(chǔ)器端口資源的不充足而使取指令和load/store指令訪問存儲(chǔ)器的動(dòng)作不能同時(shí)進(jìn)行。if1t mj5,rst .3 tdse十da nom uaddi rer ,4 hid r£tlflo(rs) wb r4«re*i<md r7,r5ri5 siqre rs»200(r9) subi riotilorli zefko aluu*|xmkiw圖6. 30單個(gè)存儲(chǔ)器模塊所造成的流水線堵塞圖6. 30中的存儲(chǔ)器模塊只有一套訪問端口。當(dāng)load/store指令訪問存儲(chǔ)器時(shí),必須暫停取指令操作。當(dāng)然也可以讓取指令優(yōu)先而暫停load/st

7、ore指令的存儲(chǔ)器訪問操作。然而,不管是哪一種情況,計(jì)算機(jī)的性能將會(huì)有很大的損失。那么,采用一個(gè)外部存儲(chǔ)器模 塊的現(xiàn)代計(jì)算機(jī)是如何解決這個(gè)問題的呢?說起來很簡(jiǎn)單,如圖6. 31所示,在處理機(jī)內(nèi)部,設(shè)置兩個(gè)分開指令和數(shù)據(jù)的高速緩沖存儲(chǔ)器(cache)。把存儲(chǔ)器中經(jīng)常使用的程序段和數(shù)據(jù)分別放在指令 cache和數(shù)據(jù)cache中。訪問cache命中時(shí),處理機(jī)可直接從 cache 得到指令和數(shù)據(jù),而不再訪問外部存儲(chǔ)器。有關(guān) cache的原理和結(jié)構(gòu),我們將在9章詳細(xì)討論。再舉第二個(gè)例子。把 alu指令的wb級(jí)提前一個(gè)周期。由以前的描述可知,alu指令在exe級(jí)結(jié)束時(shí)已把結(jié)果放在了流水線寄存器r,在mem

8、級(jí)不做任何運(yùn)算,只是把它傳遞到流水線寄存器c,以便在wb級(jí)寫入寄存器堆。我們可以把這樣的數(shù)據(jù)路徑加以改造, 使alu指令提前一個(gè)周期i即在通常的mem級(jí)就把結(jié)果寫入寄存器堆。如果load指令仍用5個(gè)周期,則勢(shì)必在有的周期有兩個(gè)數(shù)據(jù)要同時(shí)寫入寄存器堆;而有的周期則沒有一個(gè) 數(shù)據(jù)要寫入,見圖6, 32(a)。由于寄存器堆只有一個(gè)寫端口,勢(shì)必造成有些alu寫操作被延后。解決這個(gè)問題的方法有3種:第一種就是前面已經(jīng)描述過的方法,即alu指令也用5個(gè)周期;第二種是設(shè)計(jì)兩個(gè)寫端口的寄存器堆;第三種是改造load指令的格式,消除存儲(chǔ)器地址計(jì)算周期。辦法是直接用一個(gè)寄存器操作數(shù)作為地址訪問存儲(chǔ)器,其指令格式形

9、 如loadrd , (fsl),即把由rsl指定的寄存器操作數(shù)拿來直接作為存儲(chǔ)器的地址,把訪問到的 存儲(chǔ)器數(shù)據(jù)寫入寄存器 rd,見圖6. 32(b)。這樣做會(huì)帶來一個(gè)額外的好處,這就是 store指 令可以有store(rsl), rs2之類的格式,即把寄存器rsl的內(nèi)容直接作為存儲(chǔ)器地址i把寄存器rs2的內(nèi)容寫入存儲(chǔ)器,從而可以省去寄存器堆前面的多路器以及相應(yīng)的控制信號(hào)sst。ddi rl.rl * jc*d i3t100(i3> sub r4.r5,r add rfir5tr6 rtnre ra.2q0(ruj ubi 門。r10.1ifmemrldil訪但指令cachemux |

10、transf.etyhk數(shù)據(jù)總麒1有博斯uj_s£2 ip+力,丁3jl.詁詞數(shù)炯cacheif.rl上1 i捻令cacheadq1q2a2zero )alu圖6. 31分開的指令cache和數(shù)據(jù)cache使流水線暢通第三個(gè)結(jié)構(gòu)相關(guān)的例子是,如果store指令格式形如storerd, (rsl, rs2),而寄存器堆只有兩個(gè)讀端口。寄存器rsl和rs2的內(nèi)容相加得到存儲(chǔ)器地址,寄存器rd的內(nèi)容存入存儲(chǔ)器。這樣的store指令要求同時(shí)讀出 3個(gè)寄存器的內(nèi)容。如果寄存器堆只有兩個(gè)讀端d ,肯定要堵塞流水線。辦法只有一個(gè),設(shè)計(jì)一個(gè)帶有3個(gè)讀端口的寄存器堆,并在流水線處理圖6.32 用4個(gè)周

11、期完成alu指令(a), load指令也用4個(gè)周期完成(b)機(jī)中為它配置3個(gè)流水線寄 存器。還看很多其它類型的結(jié)構(gòu)相關(guān)的例子,例如浮點(diǎn)除法器使用迭代的方法計(jì)算商,而 每次迭代用相同的電路等,我們?cè)诖瞬灰灰涣信e。addi rltfl ,4had ik, l<kitr5)sub rqrra add35尸6 fin討 rft.ioo(r) ubi iiotiidii1frjuifrljoo+memt2if檸r4if+r7if+m£mifrlo i(i)圖6.32用4個(gè)周期完成alu指令(a), load指令也用4個(gè)周期完成(b)依賴于其它指令的計(jì)算結(jié)果。 來看看下面的程序例子:11:

12、 :12:13:14:15:add sub and or addirir4r6r8r10r2 rl. r7 ririr3r5rir9100i1指令把寄存器r2和r3的內(nèi)容相加,結(jié)果存入寄存器ri。它下面的4條指令均與i1相關(guān),6. 5數(shù)據(jù)相關(guān)及解決方法6. 5. 1數(shù)據(jù)相關(guān)問題上一節(jié)給出的例子中,所有的指令都是不相關(guān)的,即任何一一條指令的源操作數(shù)都不本節(jié)討論數(shù)據(jù)相關(guān)(datadependence及解決方法。現(xiàn)在讓我們即使用i1的結(jié)果,見圖6. 33給出的數(shù)據(jù)相關(guān)關(guān)系圖。從圖中可見是在每個(gè)周期結(jié)束時(shí), 由時(shí)鐘上升沿把數(shù)據(jù)打人寄存器。在數(shù)據(jù)沒被打人之前,任何從該寄存器讀出的數(shù)據(jù)都是 過時(shí)的。圖中的

13、i2到i4的3條指令就屬于這種情況,它們從r1寄存器讀出的數(shù)據(jù)都是過時(shí)的,是不能使用的。15則沒關(guān)系,當(dāng)它讀r1寄存器時(shí),n已把結(jié)果寫入。為了減少數(shù)據(jù)相關(guān)指令的條數(shù),我們讓寫寄存器堆的操作提前半個(gè)周期,即由時(shí)鐘的34。10ns,寄存器堆的訪問只需下降沿打入。這樣做是可行的,因?yàn)槲覀兗俣ㄒ粋€(gè)時(shí)鐘周期是 要5ns。這樣,數(shù)據(jù)相關(guān)的指令條數(shù)減至兩條,見圖 6.卜面我們討論如何在流水線處理機(jī)中處理數(shù)據(jù)相關(guān)問題。我們將描述兩種方法,一種圖6.33 i1下面有3條指令不能從寄存器ri讀出正確的數(shù)據(jù)fljtttj-ljtj-lj-ln_rij lit add rl .rz,r3 i2j ikih r4rrl

14、.r5 13r tnd r6,r7tr1 14 t or rstrl .r9 is iddi rlotrl«100圖6.34把wb提前半個(gè)周期,i1下面還有兩條指不能從寄存器ri讀出正確的數(shù)據(jù)是暫停相關(guān)指令的執(zhí)行(暫停流水線),直到能夠正確讀出寄存器操作數(shù)為止;另一種是采 用專門的數(shù)據(jù)通路,直接把結(jié)果送到 alu的輸入端(內(nèi)部數(shù)據(jù)前推)。在描述這兩種方法時(shí), 我們使用圖6. 34的方案,即把寫寄存器堆提前半個(gè)周期。這時(shí),我們只需考慮兩條相關(guān) 指令。下面以 alu指令為例,分別對(duì)兩種方法加以描述,然后再討論load指令同時(shí)使用這兩種方法的情況。6. 5. 2暫停數(shù)據(jù)相關(guān)流水線暫停數(shù)據(jù)相

15、關(guān)流水線指的是當(dāng)數(shù)據(jù)相關(guān)出現(xiàn)時(shí),暫時(shí)停止相關(guān)指令的執(zhí)行,等到相關(guān)數(shù)據(jù)能從寄存器讀出,再恢復(fù)執(zhí)行。暫停流水線的兩種表示方法見圖6. 35和圖6. 36。這里涉及到兩個(gè)問題:一個(gè)是如何檢測(cè)出數(shù)據(jù)相關(guān),再一個(gè)是如何暫停流水線。以下我們對(duì)這兩個(gè)問題分別加以描述。首先,讓我們考慮數(shù)據(jù)相關(guān)如何用硬件電路檢測(cè)出來。參照本節(jié)開始給出的程序例子,i1寫目的寄存器rd, i2和i3的源操作數(shù)是寄存器 rsl或rs2中的數(shù)據(jù),且它們的 rsl或rs2與i1的目的寄存器號(hào) rd相等時(shí)才有可能發(fā)生數(shù)據(jù)相關(guān),因此,硬件電路中要有比較器。由于指令格式中源寄存器號(hào)rs2與立即數(shù)部分重疊,而立即數(shù)是不會(huì)出現(xiàn)相關(guān)的,因此,指令操

16、作碼必須要參與檢測(cè) (區(qū)分是寄存器操作數(shù)還是立即數(shù))。;另外,如例子中的i1指令,rd 一定作為目的寄存器號(hào)使用,即結(jié)果是要被寫入目的寄存器時(shí),后面的指令才有可能與之相關(guān)。由于store指令也使用rd,但它不寫寄存器,因此, wreg信號(hào)也應(yīng)參與檢測(cè)(實(shí) 際上,wreg也是從操作碼中得出的)。我們把上述規(guī)則用表達(dá)式寫出如下 (它們是在id級(jí) 檢測(cè)數(shù)據(jù)相關(guān)的表達(dá)式):depen =a_depen+b_depena_depen = exe_a_depen+mem_a_depenb_depen = exe_b_depen+mem_b_depenexe_a_depen = (1d_rsl = = ex

17、e_rd)(exe_wreg = 1)(1d_rsllsreg)exe_b_depen = (1d_rs2 = = exe_rd)(exe_wreg = 1)(1d_rs21sreg) +(1d_rd = = exe_rd)(exe_wreg = = 1)(store)mem_a_depen = (1d_rsl = = mem_rd)(mem_wreg = 1)(1d_nllsreg) mem_b_depen = (1d_rs2 = = mem_rd)(mem_wreg = 1)(1d_rs2isreg) 十(1d_rd = = mem_rd)(mem_wreg = = 1)(store)id

18、_rsllsreg = and 十 andi 十 or 十 ori 十 add 十 addi 十 sub 十 subi 十 load 十 store id_rs2isreg = and 十 or 十 add 十 sub由于一條指令中的兩個(gè)源操作數(shù)都可能與上一條指令的目的操作數(shù)相關(guān),因此總的數(shù)據(jù)相關(guān) depen由a_depen和b_depen兩部分組成。 a_depen指的是源寄存器 rsl數(shù) 據(jù)相關(guān);b_depen指的是源寄存器rs2數(shù)據(jù)相關(guān)。另外,兩條指令12和13都可能與u相 關(guān)。如果是在流水線id級(jí)檢測(cè)數(shù)據(jù)相關(guān),則對(duì)于 12來講,n處在exe級(jí);對(duì)于13來講, n處在 mem 級(jí);因止匕

19、,a_depen 包括 exe_a_depen 和 mem_a_depen 兩部分。 exe_a_depen 的意思是處在id級(jí)的指令與處在exe級(jí)的指令數(shù)據(jù)相關(guān)。同理,mem_a_depen 的意思是處在 id級(jí)的指令與處在mem級(jí)的指令數(shù)據(jù)相關(guān)。同樣,b_depen 包括 exe_b_depen 和 mem_b_depen 兩音b分。exe_a_depen 為真的條件是 i2 的 rsl 與 i1 的 rd 相等(即 id_rsl = exerd)、rsl 字 段是寄存器(1d rs1isreg)并且i1的rd確實(shí)是目的寄存器(即exe_wreg =1)。后一個(gè) 條件是為排除 store指

20、令而加上的。 exe-b-depen與exe-a-depen類似,但rs2 確實(shí)是源寄存器號(hào)(1drs21sreg)所包含的指令要比id rslisreg少得多。i3與i1的數(shù)據(jù) 相關(guān)判斷與此類似,只是把宇頭 exe換成mem。exe代表流水線exe級(jí);mem代表流 水線mem級(jí)。exe_rd和mem_rd分別是exe級(jí)和mem級(jí)流水線寄存器 d的輸出。數(shù)據(jù)相關(guān)條件就這樣得出來了。需要注意的一點(diǎn)是,rs2應(yīng)包含store指令的rd。當(dāng)條件滿足時(shí),要暫停流水線,因此下一步的任務(wù)是確定如何暫停流水線。這里要特別注意的 一個(gè)問題是,不能停止所有指令的流水線,而只是暫停相關(guān)指令及其后續(xù)的所有指令。上

21、例中,若12與n相關(guān),只暫停12及12以下的指令,而不應(yīng)把 n也暫停,否則的話,處理 機(jī)將永遠(yuǎn)暫停下去。暫停流水線要做以下 3件事情:封鎖當(dāng)前正在譯碼的指令的寫控制信號(hào);不把從 存儲(chǔ)器取來的下一條指令打人ir;不改變當(dāng)前pc值。我們使用如下的方法實(shí)現(xiàn)流水線的暫停:wpc= depenwir = depenid wz = depen decoderwzidwmem = depen decoderwmemidwreg = depen decoder reg圖6. 37給出的是實(shí)現(xiàn)暫停流水線的硬件電路。 暫停條件判斷電路 stall的輸入包括 opcode , id rsl, id rs2, exe

22、 rd, exe wreg , memrd 和 mem wreg。輸 出為depen。用depen信號(hào)來封鎖本條指令及后續(xù)指令。封鎖本條指令的方法是把depen 求反,再分別和譯碼器的輸出 decoderwz , decoderwmem 和 decoder-wreg 相與,再送到id級(jí)和exe級(jí)之間的流水線寄存器的輸入端。只有這些寫信號(hào)才改變處理 機(jī)或存儲(chǔ)器的狀態(tài),。因而我們不必去封鎖諸如 aluop或多路器的選擇信號(hào)。封鎖其后續(xù)指令的方法是禁止向ir及pc寫入新的數(shù)據(jù),即把 depen的非接到ir和pc的寫使能端wir和wpc。當(dāng)這兩個(gè)信號(hào)為 0時(shí),禁止向ir和pc寫人數(shù)據(jù)。讀者不妨試著畫出

23、它在 數(shù)據(jù)相關(guān)前后的時(shí)序圖。mem.wrecmem圖6. 37實(shí)現(xiàn)暫停流水線的硬件電路mema nodl效據(jù)存制”u- xst dwregwb當(dāng)i2與i1相關(guān)時(shí),流水線暫停兩個(gè)周期;i3與il相關(guān)時(shí)流水線暫停一個(gè)周期。我們把被暫停掉的周期稱作流水線“氣泡”。暫停流水線是解決流水線處理機(jī)數(shù)據(jù)相關(guān)問題的一種方法。使用這種方法,保證處理機(jī)能夠從寄存器堆讀出正確的數(shù)據(jù)。但是,暫停流水線 兩個(gè)或一個(gè)周期造成了處理機(jī)性能的損失。如果沒有數(shù)據(jù)相關(guān),處理機(jī)完全可以多執(zhí)行兩 條或一條指令。在由使用這種方法的處理機(jī)組成的計(jì)算機(jī)系統(tǒng)中,高級(jí)語言的編譯器和匯 編器在產(chǎn)生最終目標(biāo)機(jī)器碼時(shí),應(yīng)盡量避免出現(xiàn)過多的數(shù)據(jù)相關(guān)指

24、令序列。編譯器和匯編 器最初可以在相關(guān)指令之間插入nop指令,然后進(jìn)行優(yōu)化,用一些有意義的不相關(guān)的指令替換掉nop,以減少“氣泡”的出現(xiàn)。較早的 mips處理機(jī)甚至沒有數(shù)據(jù)相關(guān)的硬件檢測(cè)電 路,完全依靠軟件優(yōu)化來保證不出現(xiàn)指令之間的數(shù)據(jù)相關(guān)。下一小節(jié)介紹的方法則能完全 避免由于與alu指令相關(guān)而造成的“氣泡”的出現(xiàn)。6. 5. 3提高流水線處理機(jī)的性能內(nèi)部前推流水線數(shù)據(jù)相關(guān)問題的本質(zhì)在于一條指令執(zhí)行時(shí)要用到上面指令的計(jì)算結(jié)果,但這個(gè).結(jié)果尚未被寫入寄存器堆。如果我們不拘泥于形式,非要alu使用從寄存器堆讀出的數(shù)據(jù)不可的話,流水線“氣泡”問題也可以得到解決。試想,數(shù)據(jù)相關(guān)發(fā)生在alu計(jì)算周期,而

25、所有的計(jì)算任務(wù)均由這一個(gè)alu來按順序完成。這也就是說,alu計(jì)算時(shí)發(fā)現(xiàn)與上一條或兩條指令的結(jié)果發(fā)生數(shù)據(jù)相關(guān)的話,這些結(jié)果實(shí)際上已由 alu計(jì)算出來了,只是還沒有寫入寄存器堆。那么,這時(shí)的結(jié)果在哪兒呢?當(dāng)然,它們還在流水線寄存器r和c中。這就好了,把它們直接拿過來用!為此,我們?cè)赼l。u的兩個(gè)數(shù)據(jù)輸入端各加一個(gè)多路器,使r和c中的數(shù)據(jù)能被直接送到alu的輸入端,見圖6. 38到圖6. 40。這就是所謂的內(nèi)部前推(internal forwarding)技術(shù)。| cci ccs i ccj i ct-x i i ccfi i cc7 i ccb i dc. | ri圖6. 38內(nèi)部前推一一cc3

26、周期,add指令在exe級(jí)見圖6-38, alu輸入端a的多路器有3個(gè)輸入。無數(shù)據(jù)相關(guān)時(shí),選才i 0號(hào)輸入,也就 是流水線寄存器 a中的內(nèi)容;相關(guān)時(shí),選才12或3號(hào)輸入,它們來自于流水線寄存器 r或。 co在本節(jié)的例子中,12與n相關(guān)時(shí),選擇2號(hào)輸入;13與n相關(guān)時(shí),選擇3號(hào)輸入。1 號(hào)輸入沒有被使用,只是標(biāo)在那里,在設(shè)計(jì)多路器時(shí)可以去掉該輸入以使電路簡(jiǎn)化。alu輸入端b:的多路器有4個(gè)輸入。無數(shù)據(jù)相關(guān)時(shí),若是寄存器操作數(shù), :選擇0號(hào)輸入:若 是立即數(shù),選擇1號(hào)輸入。2號(hào)與3號(hào)輸入等同于 alu的a端多路器。i cc1 i ccj i cc3 i cc4 cc5 ! cc0 cct | cc

27、f | cc9rutj-utj-u-u-u-lttj1產(chǎn)5 、疝_lb hd - ia.b大與防推i霜>lib r1hr| ,r5 nj | c7*t) i indi r6111afttl rf .r 71rl1ra ,bc rcgj4|ur r£ j hr3b,燦 n白41.loois華存用若eerrtifmemr mrl9and r仇格1sub rl.rlprbidd !.噓睛jrdepenqexei 0 4 d圖6. 39內(nèi)部前推-cc4周期,add結(jié)果在r中,sub使用r的內(nèi)容運(yùn)算de ccciokoi b:alj£”£m = 20】q3ab如何產(chǎn)生

28、這兩個(gè)多路器的選擇信號(hào)是內(nèi)部前推電路的關(guān)鍵所在。表 6. 7和表6. 8列 出了兩個(gè)多路器選擇信號(hào)的輸出真值表。注意,表 6. 8中的rs2包含了 store指令中的rd, 參見圖6. 39和圖6. 40中的電路,其中的rs2來自于寄存器堆前面多路器的輸出。表6. 7 alua端多路器選擇信號(hào)的輸出真值表輸入輸出exe_rs1 =exe_rs1 =輸入選擇mem_wreg=mem_rdwb_wreg=wb_rdadepen1adepen00x0x00a100x00a110x10mem_r0x1000a0x1111wb_c101000a111010mem_r101111wb_c111110mem

29、_r表6. 8 alub端多路器選擇信號(hào)的輸出真值表輸入輸出exe_rs2 isregmem_wregexe_rs2=mem_rdwb_wregexe-rs2=wb_rdbdepen1bdepen0輸入選擇0xxxx01立即數(shù)10x0x00b1100x00b1110x10mem_r10x1000b10x1111wb_c1101000b1111010mem_r1101111wb_c1111110mem_r表6. 8比表6. ?多了一項(xiàng)exe rs21sreg,這是因?yàn)橹噶钪械牧⒓磾?shù)本身是不與上面指令的結(jié)果相關(guān)的。我們?cè)诒?6. 7中忽略了 exers/isreg,這是因?yàn)槌宿D(zhuǎn)移指令, 所有其它

30、指令的rsl的位置均是寄存器描述符,而轉(zhuǎn)移指令在 exe級(jí)是不做任何操作的。兩表中的最后一行需要特別說明一下。例如在表6. 8中,mem_wreg =1, exe_rs2= mem_rd ,并且 wb_wreg =1, exe_rs2=wb_rd ,說明當(dāng)前指令的第二個(gè)源寄存器操 作數(shù)與它上面的兩條指令都相關(guān)。也就是說,上面的兩條指令向同一個(gè)目的寄存器寫入結(jié) 果。這種情況一般是不會(huì)出現(xiàn)的。若出現(xiàn),我們選擇較新的結(jié)果,即mem -r,送到alu的b數(shù)據(jù)輸入端。hr dd rhrjprli3i uid rd,*ii+i m r8.ilwr9cc1cc2uc3 cc«ccscc6 | bt

31、 |ccs |pcaddrira,bc reg"d | ""1 1 .ndpc 1r a.h ri亙工pc lkk|c reg| iiddi itibioo, biddlki tdi h5r1 jmfropcodrtt rt7m;史世膽ise p-sdeken -gikexememor rg .ri arfiand ""7,獷!zero alu口i qtal.'fbj hddi rlo.rldqqd memary后凈存拈器adepem 2e3c regc/d工圖6. 40內(nèi)部前推一一cc5周期,add結(jié)果在c中,and使用c的內(nèi)容運(yùn)算圖

32、6. 38到圖6.扎以及表6. 7和表亂8演示的是在exe級(jí)alu操作時(shí)才檢測(cè)數(shù)據(jù) 相關(guān),有點(diǎn)臨陣磨槍的味道。我們完全可以在id級(jí)完成這項(xiàng)工作,并把結(jié)果 (多路器的選擇信號(hào)adepen兩位和bdepen兩位)作為控制信號(hào)打人流水線寄存器,以便輕裝上陣, 在進(jìn)入exe級(jí)后立即開始 alu的操作。圖6. 41給出的是采用數(shù)據(jù)前推技術(shù)的流水線處 理機(jī)的數(shù)據(jù)路徑和控制部件的結(jié)構(gòu)圖。你會(huì)發(fā)現(xiàn)數(shù)據(jù)相關(guān)檢測(cè)電路也放在id級(jí)來做了(表6. 7。和表6. 8中所有信號(hào)的字頭都用前一級(jí)的符號(hào)來代替,即 mem用exe來代替, wb用mem來代替)。wregmem jdfxe wkegzeho圖6. 41采用數(shù)據(jù)前

33、推技術(shù)的流水線處理機(jī)的數(shù)據(jù)路徑和控制部件的結(jié)構(gòu)圖jen*,£kl4uh si”:3 nsl粗裾并q鋅l . l6. 5. 4處理10ad指令一一暫停與內(nèi)部前推相結(jié)合以上討論的都是與 alu指令相關(guān)的情況。alu指令在exe級(jí)結(jié)束后,結(jié)果就出現(xiàn)在 流水線寄存器r中,后續(xù)指令可以通過內(nèi)部前推電路來直接使用它。但是,一條指令若與 1。ad指令相關(guān),情況就不那么簡(jiǎn)單了。在exe級(jí)結(jié)束后,load指令還在忙著訪問存儲(chǔ)器呢。要在mem級(jí)結(jié)束后,結(jié)果才出現(xiàn)在流水線寄存器d中,見圖6. 42。這時(shí),即使使用內(nèi)部前推技術(shù)也無法消除 1。ad指令與它的下一條相關(guān)指令之間的第、一個(gè)“氣泡”。thmem%口

34、 卜rhga,nreg一乂-o內(nèi)郵的撞*ttri rt»r7 frlor rfi.raddi rlotr' joorc rega)rc ke心圖6.42 與load指令相關(guān)怎么辦?辦法有兩個(gè),一個(gè)是硬件方面不做任何努力,完全由軟件來避免使用過時(shí)數(shù)據(jù)進(jìn)行計(jì)算。當(dāng)一條指令與它上面的10ad指令數(shù)據(jù)相關(guān)時(shí),在它們中間插入兩條nop指令,然后優(yōu)化,用兩條不相關(guān)的指令替換兩條nop指令。替換一條是一條,替換不掉就那么放著。第二種辦法是由硬件負(fù)責(zé)檢測(cè)與10ad指令的相關(guān)性。沒有辦法消除的第一一個(gè)“氣泡”就留著。為了保證操作結(jié)果的正確性,我們采用暫停流水線一個(gè)周期的方法。第二個(gè)“氣 泡”用

35、內(nèi)部前推技術(shù)加以消除。:我們給出一f面的用于實(shí)現(xiàn)1。ad流水線暫停的控制信號(hào) 的表達(dá)式。這個(gè)信號(hào)是在id級(jí)產(chǎn)生,并且使用與暫停alu流水線類似的方法。loaddepen = exe_a_depen 十 exe_b_depenexe_a_depen = (id_rs1 = exe_rd)(exe_sld = = 1)(id_rs1isreg)exe_b_depen = (id_rs2 = = exe_rd)(exe_sld = = 1)(id_s2isreg)+(id_rd = exe_rd)(exe_sld = 1)(store)id_rs11sreg = and+andi+or+ori+ad

36、di+addi+sub+subi+load+storeid_rs21sreg = and+or 十 add+sub注意,以上的表達(dá)式中沒有使用wreg信號(hào),而是用了 sld。因此在書寫 sld,不能選擇任意項(xiàng),而應(yīng)只書寫 wreg = = 1處的sld?;蛘?,一一個(gè)保險(xiǎn)的方法是把譯出的 1。ad指令打人流水線寄存器,使用它而不是exesld。l()abde;prnfxemket,exe slbdu51捻 laof-圖6. 43帶有內(nèi)部前推及10ad相關(guān)暫停功能的流水線處理機(jī)由于流水線已經(jīng)暫停了一個(gè)周期,剩下的內(nèi)部前推電路可以仿照上一小節(jié)的描述加以 設(shè)計(jì)。圖6. 43的電路是帶有內(nèi)部前推及 10

37、ad相關(guān)暫停功能的流水線處理機(jī)。所有的控制 信號(hào)士在m級(jí)產(chǎn)生,并使用流水線寄存器把它們傳遞到所需要的位置。注意,封鎖控制信 號(hào)的與門已合并在 decoder中了。即使流水線處理機(jī)有了 10ad相關(guān)暫停功能,但它只保證操作結(jié)果的正確性。如果編譯 器和匯編器能對(duì)程序做些優(yōu)化,盡量消除與10ad指令的相關(guān),就會(huì)提高流水線處理機(jī)的性能。圖6. 44(a)中的第二條指令使用它上面的10ad指令從存儲(chǔ)器取來的結(jié)果。這勢(shì)必造成流水線“氣泡”的產(chǎn)生(圖6. 44(c)。我們把左例中的第二條與第三條指令交換。交換后的 程序列在圖6. 44(b)中。交換后,“氣泡”可以被消除,而且可以使用內(nèi)部前推電路,把從 存儲(chǔ)

38、器取來的數(shù)據(jù)直接從流水線寄存器d傳送給交換后的第三條指令 (圖6. 44(d) ohep, i qhd r3. t)add ri ”1 型idi subi r2 i r2 s t hnr in-np<4)i on p lofld r2po(r4)圖6. 44消除load指令引起的“氣泡”并使用內(nèi)部前推6. 6轉(zhuǎn)移相關(guān)及解決方法6. 6. 1轉(zhuǎn)移相關(guān)問題轉(zhuǎn)移指令改變程序順序執(zhí)行的特性。由于是流水線操作,在轉(zhuǎn)移發(fā)生之前,若干條轉(zhuǎn)移指令的后續(xù)指令已被取到流水線處理機(jī)中。這就是所謂的轉(zhuǎn)移相關(guān)問題(branchhazard),有時(shí)也稱之為控制相關(guān)問題(controlhazard)。這樣的后續(xù)指令的

39、條數(shù)與轉(zhuǎn)移指令執(zhí)行完成需要多少個(gè)時(shí)鐘周期有關(guān)。一般來講,若轉(zhuǎn)移指令從取指令到執(zhí)行完畢需要”個(gè)周期的話, 則(n 1)奈后續(xù)指令將受到影響(圖6。45)。一般比較復(fù)雜的處理機(jī)往往需要35個(gè)周期才能完成轉(zhuǎn)移指令的執(zhí)行。在我們的流水線處理機(jī)方案中,已經(jīng)把轉(zhuǎn)移指令所需的周期數(shù)減至最少,總共只需兩個(gè)時(shí)鐘周期,有一 條后續(xù)指令受到影響。以下我們介紹處理轉(zhuǎn)移相關(guān)問題的3種技術(shù)。這3種技術(shù)是:(1)暫停流水線;(2)假定轉(zhuǎn)移不發(fā)生;圖6.45轉(zhuǎn)移指令造成的延遲周期數(shù)(3)延遲轉(zhuǎn)移。6. 6. 2暫停流水線假設(shè)轉(zhuǎn)移指令從取指令到執(zhí)行結(jié)束共需要n個(gè)時(shí)鐘周期,實(shí)際上,編譯器和匯編器只要在轉(zhuǎn)移指令下面插入(” 一。1

40、)條nop指令,即使在硬件方面不采取任何措施,也可以保 證程序執(zhí)行的正確性。以下我們討論的是,假定沒有插入 nop指令,處理機(jī)如何保證執(zhí)行 結(jié)果正確。以我們的(" =2)的流水線處理機(jī)為例。在對(duì)指令進(jìn)行譯碼時(shí):若發(fā)現(xiàn)當(dāng)前指令 是轉(zhuǎn)移指令,則要廢棄取來的轉(zhuǎn)移指令的后續(xù)一條指令,而并不封鎖pc和ir。廢棄方法見圖6. 46。i-lttj-lttj lj_l_rn-nifeke mehl wbipid ekeifi口 .百一文西 中國圖6. 46轉(zhuǎn)移指令暫停流水線一個(gè)周期轉(zhuǎn)移指令包括條件轉(zhuǎn)移和五條件轉(zhuǎn)移兩種類型。五條件轉(zhuǎn)移指令只要封鎖 ir的打人即可。條件轉(zhuǎn)移指令還要判斷 z標(biāo)志是否能用。

41、若 z標(biāo)志還沒有準(zhǔn)備好,則要暫停流水線。 這一點(diǎn)和判斷數(shù)據(jù)相關(guān)極為相似。但由于轉(zhuǎn)移指令只可能改變pc而不改變其它狀態(tài),因此用不著封鎖 wz, wmem , wreg(對(duì)轉(zhuǎn)移指令來講,這些信號(hào)原本就為0)。如果處在譯碼級(jí)的是條件轉(zhuǎn)移指令,而且處在exe級(jí)的是alu類型的指令(就要寫z標(biāo)志到流水線寄存器 z 了),則要等到alu指令寫完2后,再判斷轉(zhuǎn)移與否,因此要暫停 一個(gè)周期。:wir wpc(id _bne id _beq)exe _instisalu )wir = wpc = -(id _bne id _beq)exe _wreg exe_sld)exe_instisalu 表示處在exe級(jí)

42、的是alu指令。我們使用 exe_wreg exe _sld來產(chǎn)生它:除了 10ad指令,凡是向寄存器堆寫結(jié)果的指令都是alu類型的指令。圖6.47給出了這部分的控制電路。fxf sld一卜_rdc/d*p£w'.tkmsldwregmem wregbtakenifmemwb圖6. 47判斷z標(biāo)志相關(guān)并暫停流水線j:di wead7frhaluopcqdsimmn.uopexe wrkg6. 6. 3假定轉(zhuǎn)移不發(fā)生條件轉(zhuǎn)移指令的判斷結(jié)果可能是不轉(zhuǎn)移。使用廢棄后續(xù)指令的方法時(shí),總是造成一個(gè) 鐘周期的浪費(fèi)。假定轉(zhuǎn)移不發(fā)生(猜測(cè))的思想是把這條指令打人ir并讓它執(zhí)行下去。如果轉(zhuǎn)移沒

43、有發(fā)生,則讓它繼續(xù)執(zhí)行;如果是轉(zhuǎn)移,則終止它的執(zhí)行。問題的關(guān)鍵是如何在猜測(cè)不成功時(shí)終止指令的執(zhí)行。其實(shí)這也不難。指令執(zhí)行的效果 無非就是改變處理機(jī)的狀態(tài)和寄存器堆以及存儲(chǔ)器的內(nèi)容。只要我們能夠在exe級(jí)結(jié)束之前,清除 wz ,在mem級(jí)結(jié)束之前清除 wmem ,以及在 wb級(jí)結(jié)束之前清除 wreg的 話,不會(huì)對(duì)處理機(jī)和存儲(chǔ)器產(chǎn)生任何影響。在我們的流水線處理機(jī)中,轉(zhuǎn)移成功與否,在轉(zhuǎn)移指令的id級(jí)就已明子。我們可以把 這個(gè)信息(例如btaken ,轉(zhuǎn)移成功時(shí)為1)打人流水線寄存器,以便在下一個(gè)周期使用。下一個(gè)周期恰好是猜測(cè)執(zhí)行指令的id級(jí),我們可以通過與門來清除前面提到的3個(gè)寫信號(hào)。不轉(zhuǎn)移時(shí),bt

44、aken二0,不封鎖,讓其繼續(xù)執(zhí)行 (圖6. 48)。實(shí)際上,圖6. 48與圖6.47 極為類似。圖6. 48的封鎖條件是(bnc+beq+branch),而圖巳47的封鎖條件是(bne z十beq z+branch)。n圖6. 4s猜測(cè)不轉(zhuǎn)移如果程序執(zhí)行時(shí),轉(zhuǎn)移指令占20%,五條件轉(zhuǎn)移,條件轉(zhuǎn)移成功和條件轉(zhuǎn)移不成功各占1/3,則與總是浪費(fèi)一個(gè)周期的方法相比,猜測(cè)執(zhí)行的方法可以節(jié)省1/3 x 20% =6. 7%的周期。其加速比為 1/(10. 067)= 1. 071,或者說,提高效率 7. 1%。6. 6. 4延遲轉(zhuǎn)移延遲轉(zhuǎn)移(delaybranch)總是執(zhí)行轉(zhuǎn)移指令的后續(xù)指令。實(shí)際上我們

45、已經(jīng)熟悉了這種方法。首先我們?cè)诿恳?條轉(zhuǎn)移指令下面安排一一條nop指令,然后再優(yōu)化,用一一條有意義的:原來處在轉(zhuǎn)移指令之前被執(zhí)行的指令來替換nop。若找不到這樣的指令,就留著nop。在我們的流水線處理機(jī)模型中,受轉(zhuǎn)移指令影響的指令只有一條,替換 nop的工作相對(duì)容 易一些。若受影響的指令條數(shù)超過兩條,要想替換所有的nop很難。為了便于對(duì)延遲指令進(jìn)行優(yōu)化,有些處理機(jī)的指令系統(tǒng)中設(shè)置了兩類alu指令,一類根據(jù)alu操作結(jié)果,對(duì)標(biāo)志寄存器置 0或置1,另一類則單純做計(jì)算,并不影響標(biāo)志寄 存器的原來的內(nèi)容。在下面的例子中,我們使用了subicc指令,它將根據(jù)減法結(jié)果設(shè)置標(biāo)志寄存器z的內(nèi)容為?;?yàn)?。其

46、它的alu計(jì)算指令不影響z。經(jīng)過優(yōu)化后,沒有浪費(fèi)一個(gè)時(shí)鐘周期。程序的執(zhí)行時(shí)序在圖6. 49中給出。注意,我們也采用了內(nèi)部前推技術(shù)。圖6. 49采用內(nèi)部前推和延遲轉(zhuǎn)移技術(shù)后程序的執(zhí)行時(shí)序loop : load r3, 0(r4);從存儲(chǔ)器取數(shù)據(jù)放到,3中,;存儲(chǔ)器地址為r4中的內(nèi)容加o,subicc r2, r2, 1;計(jì)數(shù)器減1,并改變z標(biāo)志,add. i r4, r4, 4 ;存儲(chǔ)器地址加4,指向下一個(gè)存儲(chǔ)器字,不影響 z標(biāo)志,bne r2, loop ;若計(jì)數(shù)器不為 0,轉(zhuǎn)移到100p處繼續(xù)執(zhí)行,延遲轉(zhuǎn)移,addy 1, y 1丫 3 ;累加,累加和放在 r1中,延遲指令,總是被執(zhí)行,st

47、ore r1 , 0(r4) ;否則,把累加和送到存儲(chǔ)器中,;存儲(chǔ) atl!lii'gj r4 中的內(nèi)容加0。6 7 異常事件處理我們已在第 5 章中討論了非流水線處理機(jī)如何處理異常事件的問題。異常(exception)事件是指在程序執(zhí)行過程中,由于操作非法,例如除數(shù)為0,結(jié)果上溢等,或者用戶程序試圖執(zhí)行特權(quán)指令,或者指令碼沒有定義等。這時(shí)處理機(jī)應(yīng)該轉(zhuǎn)向特定的程序去處理異常事件。 處理的方法一般是先向用戶報(bào)告哪條指令引起了異常事件以及引起了何種異常事件,然后繼續(xù)用戶程序的執(zhí)行,或者結(jié)束用戶程序的執(zhí)行,返回到操作系統(tǒng)。除了異常事件外,還有外部i/o設(shè)備發(fā)出的中斷(mterrupt)請(qǐng)求以

48、及陷阱(trap)指令等。 以上 3 種事件均改變處理機(jī)正常指令的執(zhí)行次序,引起處理機(jī)從用戶狀態(tài)進(jìn)入系統(tǒng)狀態(tài),并轉(zhuǎn)到相應(yīng)的處理程序去執(zhí)行。陷阱指令般用來實(shí)現(xiàn)系統(tǒng)調(diào)用。 io 中斷用來實(shí)現(xiàn)i ()設(shè)備和處理機(jī)的通信。有關(guān)外部中斷的處理,我們將在第 8 章做專門的闡述。本節(jié)的點(diǎn)放在流水線處理機(jī)如何處理異常事件上。非流水線處理機(jī)是在一條指令執(zhí)行的丑程中檢測(cè)異常事件,當(dāng)異常事件發(fā)生時(shí)處理機(jī)轉(zhuǎn)向異常事件處理程序, 處理完畢后再返回到用戶程序。例如,處理機(jī)在對(duì)指令譯碼階段,可以檢測(cè)當(dāng)前指令是否是合法指令。在指令執(zhí)行時(shí)檢測(cè)操作結(jié)果是否溢出,除數(shù)是否為。等等。當(dāng)這些事件發(fā)生時(shí),處理機(jī)應(yīng)該適當(dāng)?shù)乇4娈?dāng)前處理機(jī)的狀態(tài),比如當(dāng)前程序計(jì)數(shù)器 pc 的內(nèi)容,處理機(jī)狀態(tài)寄存器的內(nèi)容,等等。 ,然后,處理機(jī)由硬件向 pc 寫入特殊的值,即異常事件處理程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論