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

下載本文檔

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

文檔簡介

1、6 流水線處理機(jī)及其設(shè)計(jì)61 引 言流水線(pipeline)是一種能夠使多條指令重疊操作的處理機(jī)的實(shí)現(xiàn)技術(shù),它已成為現(xiàn)代處理機(jī)設(shè)計(jì)中最為關(guān)鍵的技術(shù)。流水線技術(shù)并不是處理機(jī)設(shè)計(jì)領(lǐng)域所獨(dú)有的。早在計(jì)算機(jī)還沒有出現(xiàn)之前,流水線技術(shù)已被廣泛應(yīng)用于工業(yè)生產(chǎn)中了。尤其是現(xiàn)在,幾乎所有的現(xiàn)代化工廠的生產(chǎn)線都采用流水線技術(shù)。一件產(chǎn)品往往需要幾道工序才能完成。每道工序只完成生產(chǎn)過程中的一小部分操作,即送往下道工序。如果單從件產(chǎn)品從開始到完成來看,生產(chǎn)所需要的時(shí)間,與非流水線相比,似乎并沒有縮短。但從整體來看,產(chǎn)品的出產(chǎn)率卻大大提高了。流水線處理機(jī)也是這樣,單條指令的執(zhí)行時(shí)間沒有縮短,但每個(gè)時(shí)鐘周期都會有一條指

2、令執(zhí)行完畢。試想,非流水線多周期處理機(jī)執(zhí)行一條指令平均要花費(fèi)大約4個(gè)時(shí)鐘周期。假設(shè)執(zhí)行1萬條指令,就要用4萬個(gè)時(shí)鐘周期。而流水線處理機(jī)執(zhí)行一條指令可能需要5個(gè)時(shí)鐘周期,但由于多條指令,例如5條,可以重疊操作,總體上,平均每條指令所花費(fèi)的時(shí)間大致為1個(gè)時(shí)鐘周期,總共只需要大約1萬個(gè)時(shí)鐘周期。這就是所謂的“吞吐率”的提高。流水線處理機(jī)把一條指令的執(zhí)行分成幾個(gè)步驟,或稱級(stages)。每一級在一個(gè)時(shí)鐘周期內(nèi)完成。在每個(gè)時(shí)鐘周期,處理機(jī)啟動執(zhí)行一條指令。如果處理機(jī)的流水線有m級,則同時(shí)可重疊執(zhí)行的指令總條數(shù)將為m,每條指令處在不同的執(zhí)行階段。如果分級分得好的話,那么每級都沒有時(shí)間上的浪費(fèi)。這是最理

3、想的情況。流水線處理機(jī)在這種理想的情況下,與非流水線處理機(jī)的性能加速比為其中,I為一個(gè)程序被執(zhí)行的總的指令條數(shù)。它在流水線處理機(jī)和非流水線處理機(jī)中是相等的。CPI是每條指令總體平均所需的時(shí)鐘周期數(shù)。CPInp是非流水線處理機(jī)的CPI,CPIn是流水線處理機(jī)的CPI。因?yàn)榱魉€處理機(jī)把一條指令的執(zhí)行時(shí)間理想地分成了陰級,有m條指令在同時(shí)(重疊)執(zhí)行,則CPIpCPInp/m。也可理解為CPIp1,而CPInp=m。T是每個(gè)時(shí)鐘周期的時(shí)間長度,假設(shè)它在兩種處理機(jī)中也是相同的。最后總的加速比為m,即等于流水線的級數(shù)。 這豈不是說,把流水線級數(shù)分得越多處理機(jī)的性能就越好?但是,實(shí)際的情況往往要受很多條

4、件的限制。流水線處理機(jī)性能提高的關(guān)鍵在于每個(gè)時(shí)鐘周期處理機(jī)都能啟動一條指令的執(zhí)行。這意味者流水線每級中的執(zhí)行部件要有能力在每個(gè)時(shí)鐘周期接收一條新的指令。例如,如果ALU完成一次操作要用10ns的話,那么一個(gè)ALU接收一條指令操作的周期不能短于10ns。指令存儲器以及數(shù)據(jù)存儲器也有這樣的限制。也假設(shè)它們的訪問周期是10ns,則每隔10ns才能從指令存儲器取出一條指令,或者每隔10ns才能讀寫一次數(shù)據(jù)存儲器。 在本章以下的討論中,我們?nèi)允褂?章中定義的指令系統(tǒng)。它們是,ALU操作類型的指令,包括and,of,add和:sub;存儲器訪問指令10ad和store;條件轉(zhuǎn)移指令bne和beq,以及無條

5、件轉(zhuǎn)移指令branch,共9條。ALU指令除了把運(yùn)算結(jié)果寫入寄存器堆之外,也把ZERO標(biāo)志寫入Z寄存器。條件轉(zhuǎn)移指令使用Z標(biāo)志決定是否轉(zhuǎn)移,其它指令不影響Z寄存器。處理機(jī)的指令系統(tǒng)及指令格式如表61所示。表6.1 流水線處理機(jī)的指令系統(tǒng)和指令格式31 2625 2120 1615 54 0指令意義00 0000rdrs1rs2And rd,rs1,rs2寄存器與寄存器00 0001rdrs1immeAndi rd,rs1,imme寄存器與立即數(shù)00 0010rdrs1Rs2or rd rs1,rs2寄存器或寄存器00 0011rdrs1immeori rd,rs1,imme寄存器或立即數(shù)00

6、0100rdrs1rs2add rd,rs1,rs2寄存器加寄存器00 0101rdrs1immeaddi rd,rs1,imme寄存器加立即數(shù)00 0110rdrs1rs2sub rb,rs1 rs2寄存器減寄存器00 011100 100000 1001rdrdrdrs1rs1rs1immeimmeimmesubi rd,rs1,immeload rd,immme(rs1)store rd,imme(rs1)寄存器減立即數(shù)從存儲器讀數(shù)據(jù)向存儲器寫數(shù)據(jù)00 101000 101100 1100dispdispdispbne dispbeq dispbranch disp結(jié)果非0時(shí)轉(zhuǎn)移結(jié)果為0

7、時(shí)轉(zhuǎn)移無條件轉(zhuǎn)移 這些指令執(zhí)行時(shí)用到的主要功能部件和它們所需的時(shí)間如下: 指令存儲器和數(shù)據(jù)存儲器:10ns;ALU和地址加法器:10ns;寄存器堆:5ns;假定其它部件,如PC寄存器、多路器、控制部件等花費(fèi)的時(shí)間為o。表62列出了各指令執(zhí)行時(shí)所需要的時(shí)間。 表6.2 各類指令執(zhí)行時(shí)所需要的時(shí)間 ns10510105ALU指令指令存儲器寄存器堆ALU寄存器堆30load指令指令存儲器寄存器堆ALU數(shù)據(jù)存儲器寄存器堆40store指令指令存儲器寄存器堆ALU數(shù)據(jù)存儲器35轉(zhuǎn)移指令指令存儲器加法器(10)20在設(shè)計(jì)非流水線單周期處理機(jī)時(shí),定義時(shí)鐘周期長度要以執(zhí)行時(shí)間最長的指令為基準(zhǔn)。以上的指令系統(tǒng)中

8、,load指令執(zhí)行時(shí)間最長,需要40ns,因此我們定義時(shí)鐘周期長度為40ns。在5章中,我們也描述了非流水線多周期處理機(jī)的設(shè)計(jì)。它的時(shí)鐘周期定義為10ns。在這種情況下,ALU指令的執(zhí)行用4個(gè)時(shí)鐘周期,load指令用5個(gè)時(shí)鐘周期,store指令用4個(gè)時(shí)鐘周期,轉(zhuǎn)移(無條件轉(zhuǎn)移和條件轉(zhuǎn)移)指令用2個(gè)時(shí)鐘周期。假設(shè)流水線處理機(jī)的時(shí)鐘周期也定義為10ns,流水線級數(shù)是5級。這意味著有5條指令能被同時(shí)執(zhí)行。表63列出了使用流水線技術(shù)后指令執(zhí)行所需要的時(shí)間。表63 使用流水線技術(shù)后指令執(zhí)行所需要的時(shí)間 ns1010101010ALU指令指令存儲器寄存器堆ALU寄存器堆50load指令指令存儲器寄存器堆A

9、LU數(shù)據(jù)存儲器寄存器堆50store指令指令存儲器寄存器堆ALU數(shù)據(jù)存儲器40轉(zhuǎn)移指令指令存儲器加法器203種處理機(jī)的指令執(zhí)行時(shí)序如圖61所示。其中,IF代表取指令,ID代表指令譯碼及讀寄存器操作數(shù),EXE代表ALU指令操作及存儲器有效地址計(jì)算,MEM代表存儲器訪圖6.1 3種處理機(jī)執(zhí)行時(shí)序比較(a)單周期;(b)多周期;(c)流水線問,WB代表結(jié)果寫回寄存器。從流水線處理機(jī)的時(shí)序中可以看出,每個(gè)時(shí)鐘周期處理機(jī)取出一條指令加以執(zhí)行。 在流水線處理機(jī)和非流水線多周期處理機(jī)設(shè)計(jì)中,一個(gè)時(shí)鐘周期要能容下所有類型的功能部件中所需時(shí)間最長的部件的執(zhí)行時(shí)間。我們把時(shí)鐘周期定義為10ns。盡管讀寫寄存器堆只

10、需5ns,也仍然要分配給它一個(gè)整個(gè)周期。對于非流水線多周期處理機(jī)來講,與單周期處理機(jī)相比,它加長了指令的執(zhí)行時(shí)間。例如,執(zhí)行l(wèi)oad指令時(shí),單周期處理機(jī)用40ns,而多周期處理機(jī)需要5個(gè)時(shí)鐘周期,即50ns。50ns過后,開始執(zhí)行下一條指令。流水線處理機(jī)也是這樣。單看一條指令的執(zhí)行,也要5個(gè)時(shí)鐘周期。但是,這對流水線處理機(jī)的性能影響很小。這是由于流水線處理機(jī)性能提高的關(guān)鍵在于每個(gè)時(shí)鐘周期都能啟動一條指令的執(zhí)行。 若流水線級數(shù)為m,總共執(zhí)行n條指令,則所需總的時(shí)鐘周期數(shù)為m+n一1。因此流水線處理機(jī)平均每條指令所需的準(zhǔn)確的時(shí)鐘周期數(shù)為例如,當(dāng)n1,n5時(shí),CPI+5,它與非流水線處理機(jī)是一樣的。

11、但當(dāng)”很大時(shí),例如n=100 000,則CPIp=100 004100 0001,m的影響可以忽略不計(jì)。這就是我們前面所說的流水線處理機(jī)中單條指令執(zhí)行時(shí)間變長將對性能造成很小影響的原因。從本章后面的討論中,我們會發(fā)現(xiàn),它也影響流水線處理機(jī)控制電路的設(shè)計(jì),主要體現(xiàn)在解決流水線處理機(jī)所固有的數(shù)據(jù)相關(guān)的問題變得更復(fù)雜了。因此在設(shè)計(jì)流水線處理機(jī)時(shí)我們應(yīng)考慮的問題有兩個(gè),一個(gè)是縮短單條指令的執(zhí)行時(shí)間,另一個(gè)是提高流水線處理機(jī)的吞吐率。應(yīng)該說后者更重要一些。 流水線技術(shù)的好處在于它既能把指令間的操作并行性充分發(fā)揮出來,同時(shí)又不對用戶編程提出新的要求,即它對用戶來講是“透明的”。本章隨后的幾節(jié)將討論如何實(shí)現(xiàn)

12、我們所定義的指令系統(tǒng)的流水線操作,介紹流水線技術(shù)所帶來的問題,以及描述為解決這些問題所采取的方法。62 流水線處理機(jī)的數(shù)據(jù)路徑 流水線處理機(jī)是比較難于理解的。我們將通過具體的例子,對它的工作原理及工作過程作較為詳細(xì)的描述。6.2.1 流水線級 圖62給出的是我們在5章中描述過的非流水線單周期處理機(jī)的組成結(jié)構(gòu)。我們把執(zhí)行指令的過程分為5部分,使其能夠按流水線方式執(zhí)行指令。分成5部分的意思就是同時(shí)可重疊執(zhí)行的指令為5條,即5級流水線。每一級所使用的名字及其要完成的動作如下:(1)IF(instruction fetch)取指令;(2)ID(instructiondecode)指令譯碼并讀寄存器操作

13、數(shù);(3)EXE(execution)執(zhí)行;(4)MEM(memoryaccess)存儲器訪問;(5)WB(write back)寫回。圖62 把單周期處理機(jī)的指令執(zhí)行分為5級 如圖中的箭頭方向所示,指令執(zhí)行時(shí)從左移向右通過電路。但有兩處從右向左的例外:一處是WB級,它把運(yùn)算結(jié)果寫回中間靠左位置的寄存器堆中;另一處是IF級,它把經(jīng)過計(jì)算的下一條指令的地址寫入程序計(jì)數(shù)器PC中。下一條指令地址的計(jì)算方法有兩種,一種是當(dāng)前PC加1,另一種是當(dāng)前PC加字地址偏移量,偏移量在指令中定義出。 流水線處理機(jī)的最大特點(diǎn)是每一個(gè)時(shí)鐘周期取出一條指令來執(zhí)行。所有的指令按取出的先后次序通過圖62中的從左至右的數(shù)據(jù)路

14、徑。依照指令類型的不同,每種指令在執(zhí)行過程中可能會用到數(shù)據(jù)路徑的不同的部分。例如,圖63中畫出的是處理機(jī)連續(xù)執(zhí)行l(wèi)oad指令時(shí)所要使用的數(shù)據(jù)路徑中的功能部件。load指令實(shí)際上是使用功能部件最多的指令。 圖63中,IM(instruction memory)代表指令存儲器。在第一級,IF級,指令計(jì)數(shù)器PC中的內(nèi)容作為訪問IM的地址,送到IM的地址輸入端。第二級中,REG(register file)代表寄存器堆或者指令中立即數(shù)的擴(kuò)展。load指令訪問存儲器時(shí)所使用的地址由下面兩個(gè)數(shù)據(jù)相加得到,一個(gè)數(shù)據(jù)是寄存器操作數(shù),另一個(gè)數(shù)據(jù)是經(jīng)符號擴(kuò)展的立即數(shù)。第三級的ALU做算術(shù)邏輯運(yùn)算。針對load指令

15、來講,ALU完成加法運(yùn)算。第四級中,DM(data memory)代表數(shù)據(jù)存儲器。存儲器數(shù)據(jù)將在這一級中被讀出。存儲器的地址輸入就是ALU計(jì)算出的結(jié)果。在第五級,從存儲器中取出的數(shù)據(jù)被寫回到寄存器堆中。這一級中的REG就是第二級中的REG。第二級讀REG,第五級寫REG。在單周期處理機(jī)中,如果一條指令還沒有執(zhí)行完畢,PC的內(nèi)容不會改變。這就使得在圖63 流水線處理機(jī)連續(xù)執(zhí)行l(wèi)oad指令時(shí)的情形一條指令的整個(gè)執(zhí)行過程中,IM始終輸出當(dāng)前指令。與單周期處理機(jī)不同,流水線處理機(jī)每個(gè)時(shí)鐘周期都要取出一條指令。這意味著,當(dāng)流水線處理機(jī)已從存儲器取出一條指令并把它送到ID級去譯碼時(shí),下一條指令也正在從存儲

16、器中取出。如果先取出的指令沒被保存,則它后面正在被取出的指令會對它造成影響。也就是說,我們必須要使用寄存器來保存從存儲器取出的指令。推而廣之,我們必須要在流水線的各級之間安排一組寄存器,用以保存當(dāng)前時(shí)鐘周期運(yùn)算出的結(jié)果,以便為下個(gè)周期使用(我們只能使用觸發(fā)器寄存器,它把時(shí)鐘上升沿時(shí)數(shù)據(jù)輸入端的信息打人寄存器中;而不能使用鎖存器,因?yàn)殒i存器的輸出在時(shí)鐘高電平時(shí)跟隨輸入的變化而變化。有關(guān)觸發(fā)器與鎖存器的區(qū)別,見2章中的描述)。我們稱這些寄存器為流水線寄存器。從廣義上講,如果把非流水線單周期處理機(jī)執(zhí)行一條指令的整個(gè)過程看作是流水線處理機(jī)的一級的話,PC則相當(dāng)于流水線寄存器,在該級的執(zhí)行還沒有完成時(shí),

17、不應(yīng)該改變這個(gè)寄存器的內(nèi)容。由此,我們能夠初步設(shè)想出流水線處理機(jī)應(yīng)有圖64所示的結(jié)構(gòu)。 我們可以很自然地把PC作為一個(gè)特殊的流水線寄存器來看待,因?yàn)樵诜橇魉€處理機(jī)中PC也是需要的。由于流水線處理機(jī)每個(gè)時(shí)鐘周期都從指令存儲器取出一條指令,它的值在每次周期結(jié)束時(shí)都將被改變。程序不發(fā)生轉(zhuǎn)移時(shí),PC加l;轉(zhuǎn)移時(shí),PC加符號擴(kuò)展的偏移量。圖中的DSE(displacement sign-extend)表示對指令字偏移量進(jìn)行符號擴(kuò)展。在第一級與第二級之間,我們使用了一個(gè)被稱為IR(instruction register)的指令寄存器。對于字長為32位的處理機(jī)來講,PC一般有30位,它存放的是32位指令

18、的字地址。1只有32位,用來存放一條指令。第二和第三級之間需要較多的寄存器。首先,從寄存器堆中讀出的兩個(gè)32位數(shù)據(jù)A和B必須要保存。再者,經(jīng)符號擴(kuò)展后的32位立即數(shù)I也要保存。圖中的ISE(immediate sign-extend)代表指令中立即數(shù)的符號擴(kuò)展。一般的ALU操作指令,要么是A與B操作,要么是A與I操作。我們能不能增加一個(gè)多路器而省去B或I寄存器,只使用一個(gè)32位寄存器呢?答案是否定的。原因出在store指令上。store指令同時(shí)使用A,B和I。A和I用來計(jì)算存儲器地址,B用來保存寫入存儲器的數(shù)據(jù)。在流水線處理機(jī)中,這些數(shù)據(jù)必須要。在一個(gè)時(shí)鐘周期中同時(shí)產(chǎn)生,以保證不引起資源沖突。

19、還有一個(gè)d寄存器,它被用來保存目的寄存器號;因?yàn)橹噶畹牟僮鹘Y(jié)果要在WB級寫入寄存器堆,目的寄存器號也要在那時(shí)使用,因此必須要同步跟隨過去。圖64 流水線處理機(jī)每級之間的流水線寄存器 第三級和第四級之間除了d之外,還有2,R和S。2用于存放ALU的一位ZERO標(biāo)志。當(dāng)ALU指令的運(yùn)算結(jié)果為全0時(shí),ZERO輸出1,否則輸出0。在執(zhí)行條件轉(zhuǎn)移指令時(shí),Z用來決定是否真正轉(zhuǎn)移。R保存32位ALU運(yùn)算結(jié)果。S專為store指令而設(shè),用來存放要被寫入存儲器中的數(shù)據(jù)。 第四級和第五級之間的寄存器如下:D存放load指令從存儲器中讀出的數(shù)據(jù);C只是保存前一級的R,即ALU指令的結(jié)果。這一級d寄存器的輸出用于指定

20、目的寄存器,D或C的數(shù)據(jù)要被寫入由d所指定的目的寄存器中。我們不妨把寄存器雄看作是最后一級流水線寄存器。下面我們描述每級流水線的操作。622 流水線各級的操作 1IF級在第一級(取指令級)(圖65)處理機(jī)使用PC的內(nèi)容訪問指令存儲器,取出指令,并在該級結(jié)束時(shí),把指令打人1只寄存器。下一條指令的地址也在這一級計(jì)算出,并把它打人PC寄存器。新的PC的計(jì)算有兩種情況:程序不發(fā)生轉(zhuǎn)移時(shí),新的PC地址由當(dāng)前PC值加1得到(1是指令字偏移量,相當(dāng)于字節(jié)地址偏移量的4),即指向下一條頃序的指令;發(fā)生轉(zhuǎn)移時(shí)的情況比較復(fù)雜,我們將在后面進(jìn)行描述。圖65 流水線第一級取指令級 2ID級指令譯碼級(圖66)有兩件事

21、情要做:第一件是數(shù)據(jù)路徑要完成的工作,主要是從寄存器堆中讀寄存器操作數(shù)和對指令中的立即數(shù)部分進(jìn)行符號擴(kuò)展;第二件工作由控制部件完成??刂撇考鶕?jù)指令操作碼OPCODE,產(chǎn)生所有的控制信號。有關(guān)控制信號如何產(chǎn)生的問題,我們將在下一節(jié)描述。正如前面提到的,目的寄存器號要保存在流水線寄存器中,以便在WB級指定把結(jié)果寫入哪一個(gè)寄存器中。寄存器堆A2輸入端前面的多路器為store指令而設(shè)。不是store指令時(shí),多路器選擇指令中的rs2;是store指令時(shí),多路器選擇指令中的rd。轉(zhuǎn)移指令將在本級結(jié)束,我們稍后再詳細(xì)討論它。圖66 流水線第二級指令譯碼級 3EXE級執(zhí)行級(圖6?)的工作均由ALU來做。A

22、LU運(yùn)算類型的指令將在本級由ALU計(jì)算出結(jié)果,并把它打人R寄存器。同時(shí),ALU的ZERO輸出也被打人Z寄存器。ALU的兩個(gè)操作數(shù),一個(gè)來自于寄存器rsl,它在前一級已被打人流水線寄存器A中了;另一個(gè)可能是寄存器rs2操作數(shù)(流水線寄存器B中的內(nèi)容),也可能是立即數(shù)(流水線寄存器I中的內(nèi)容)。load和store指令要在本級中計(jì)算存儲器地址(ALU做加法)。兩個(gè)源操作數(shù)一個(gè)來自于A,一個(gè)來自于I。若是store指令,B的內(nèi)容將被打人流水線寄存器S。圖6.7 流水線第三級一一執(zhí)行級 4MEM級存儲器訪問級<圖68)專為10adstore指令而設(shè)。兩條指令均使用流水線寄存器R的輸出作為訪問存儲

23、器的地址。store指令把S中的內(nèi)容寫入存儲器。10ad指令讀存儲器,并把讀出的數(shù)據(jù)打人流水線寄存器D。ALU指令在本級所做的事情就和移位寄存器一樣,簡單地把R的內(nèi)容打人C。圖68 流水線第四級存儲器訪問級 5WB級 寫回級(圖69)把指令結(jié)果寫回到寄存器堆。目的寄存器由從ID級一直傳遞過來的目的寄存器號指定。要寫入的數(shù)據(jù)來源有兩個(gè),一個(gè)是流水線寄存器D中的內(nèi)容,即存儲器數(shù)據(jù);另一個(gè)是流水線寄存器C的內(nèi)容,即ALU指令的計(jì)算結(jié)果。圖69 流水線第五級寫回級圖610 ALU指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑我們把ALU運(yùn)算類型的指令、1。ad和store指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑分別在圖610、

24、圖611和圖612中給出。圖6.11 load指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑圖6.12 store指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑63 流水線處理機(jī)的控制通過閱讀第5章,我們已經(jīng)學(xué)會了如何設(shè)計(jì)非流水線處理機(jī)的控制部件。為非流水線多周期處理機(jī)設(shè)計(jì)控制部件時(shí),有兩種方法可供我們選擇使用,一種是有限狀態(tài)機(jī)的硬布線方法,另一種是微程序控制方法。雖然流水線處理機(jī)也是多周期處理機(jī),但是,由于多條指令的重疊執(zhí)行,使得我們很難描述某個(gè)時(shí)鐘周期處理機(jī)到底處在何種狀態(tài),因?yàn)橛刑嗟牟煌噶铋g的組合情況。微程序控制方法也會遇到類似的問題,因?yàn)樗K究是按一條條指令順序執(zhí)行的思路來設(shè)計(jì)的。631 算術(shù)操作和存儲器訪問控制

25、 實(shí)際上,我們可以借鑒非流水線單處理機(jī)控制部件的設(shè)計(jì)方法。首先,讓我們通過下面程序的例子,研究流水線處理機(jī)多條指令重疊操作的過程,然后依此設(shè)計(jì)出它的控制部件。 addi rl, r2, 4 ;r1r1十4 load r2, 100(r3) ;r2memoryr3+100 sub r4, r5, r6;r4r5一r6 , add r7, r5, r6;r7r5+r6 store r8, 200(r9) ;memoryr9+200r8 subi r10,r10,1 ;r10r10一1以上的例子比較簡單,指令之間沒有任何數(shù)據(jù)相關(guān)。注意,在注釋一列,我們采用了簡單的表達(dá)方式。例如,第一條指令addir

26、l,r2,4完成的操作是讀取寄存器r2的內(nèi)容,把它加上4,結(jié)果寫回寄存器r1。比較合適的表達(dá)方法應(yīng)該是rl一(r1)+4。其它的也是一樣,如loadr2,100(r3),應(yīng)寫成r2一memory(r3)+100的形式,即寄存器r3的內(nèi)容加100,得到存儲器的有效地址,用它訪問存儲器,從地址指定的單元讀出數(shù)據(jù),再把數(shù)據(jù)寫人寄存器r2。store指令完成的操作與load相反,這時(shí)的r8不是目的寄存器,而應(yīng)看作是源寄存器。它的內(nèi)容要被存放到存儲器中,其地址由寄存器r9的內(nèi)容加200得到。 程序的執(zhí)行時(shí)序圖用圖613(a)的圖形方式畫出。橫坐標(biāo)表示時(shí)間,縱坐標(biāo)從上到下表示指令的執(zhí)行次序。這里還有另外一

27、種圖形表示方法,如圖613(b)所示。橫坐標(biāo)依然是時(shí)間,但縱坐標(biāo)是流水線的級,從上至下為IF,ID,EXE,MEM和WB。一條指令執(zhí)行的5級按從左上至右下標(biāo)出,即時(shí)鐘周期增1(向右),流水線前進(jìn)一級(向下)。這種表示方法雖然不太直觀,但它的好處是只要5行就夠了,不像圖613(a)那樣,無限制的向右下方向延伸過去。以下我們按順序描述每個(gè)周期流水線數(shù)據(jù)路徑的操作以及所需的控制信號。注意,前4個(gè)周期,指令還沒有充滿流水線。從第五個(gè)周期開始,指令充滿流水線。但由于例子中總共只有6條指令,從第七個(gè)周期開始,不再有新的指令被取采。隨著指令不斷地完成執(zhí)行,流水線將在第11個(gè)周期完全變空。在實(shí)際的計(jì)算機(jī)系統(tǒng)中

28、,處理機(jī)總是能取到指令來執(zhí)行。當(dāng)沒有用戶程序時(shí),處理機(jī)轉(zhuǎn)去執(zhí)行操作系統(tǒng)程序。1第一個(gè)時(shí)鐘周期(圖614)圖614 程序例子執(zhí)行時(shí)的第一+gl期 假設(shè)第一條指令的地址為0。如果我們采用字節(jié)編址的話,則后續(xù)指令的字節(jié)地址依次為4,8,12,16,20。圖中左上角的1是字偏移量,它相當(dāng)于字節(jié)偏移量的4。為了敘述的方便,這里我們使用字地址。例中的6條指令地址分別為0,l,2,3,4,5。第一個(gè)時(shí)鐘周期是第一條指令的IP級。PC輸出0,從存儲器取出第一條指令addirl,r2,4。同時(shí),地址加法器前面的多路器選擇1,與當(dāng)前PC值相加,得到字地址l,即下一條指令的地址。在該周期結(jié)束時(shí),時(shí)鐘的上升沿把取出的

29、指令五條件地寫人指令寄存器IR。同時(shí)也把1寫入PC。我們定義多路器的選擇信號為BTAKEN(branchtaken),其意義為轉(zhuǎn)移發(fā)生。當(dāng)它為1時(shí),多路器選擇經(jīng)符號擴(kuò)展的偏移量,與當(dāng)前PC值相加,加法器輸出轉(zhuǎn)移地址。由于本例中沒有轉(zhuǎn)移指令,因此轉(zhuǎn)移總也不發(fā)生,即BTAKEN0。 第一個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第二個(gè)周期時(shí),PC輸出1;IR輸出第一條指令addi rl, r2, 4。 2第二個(gè)時(shí)鐘周期(圖615)這時(shí)第一條指令進(jìn)入ID級,第二條指令進(jìn)入IF級。兩條指令的操作在各自的級同時(shí)進(jìn)行:圖615 程序例子執(zhí)行時(shí)的第二個(gè)周期 (1)處在ID級的第條指令addirl,r2,4完成譯碼操作,并根

30、據(jù)指令格式中各字段的值,對立即數(shù)部分做符號擴(kuò)展,從寄存器堆中讀出兩個(gè)寄存器¨和r4的內(nèi)容。在本周期結(jié)束時(shí),把上述3個(gè)數(shù)分別寫入流水線寄存器I,A和B中。實(shí)際上,寄存器r4的內(nèi)容不被使用。這個(gè)4來自于立即數(shù)中的4,因?yàn)樗鼈冊谥噶罡袷街刑幵谙嗤奈恢?。也就是說,把寄存器r4的內(nèi)容打入B中做的是無用功。但這沒關(guān)系,因?yàn)橄聜€(gè)周期不使用它。這樣做的原因是為了簡化控制電路,即流水線寄存器不要求配置寫使能端了(以下,如果數(shù)據(jù)不被使用,我們不再描述它)。目的寄存器號也被打人流水線寄存器d,以備在WR級用它來指定目的寄存器,向其中寫入操作結(jié)果。寄存器地址A2輸入端前面的多路器選擇指令格式中的rs2字段

31、或者rd字段。選擇端的名字定義為SST(selectstore)。當(dāng)指令譯碼時(shí)發(fā)現(xiàn)是store指令,SST1,選擇rd,否則SST0,選擇rs2。本例中不使用第二個(gè)寄存器操作數(shù)i因此SST是什么都沒關(guān)系。 (2)與此同時(shí),與前面描述的·樣,從存儲器取出第二條指令loadr2,100(r3),在周期結(jié)束時(shí)打人IR。BTAKEN0,把2(PC+1)打人PC。 第二個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第三個(gè)周期時(shí),PC輸出2;IR輸出第二條指令loadr2,100(r3);I輸出32位的4,A輸出寄存器r1的內(nèi)容,d輸出l(目的寄存器是r1)。 3第三個(gè)時(shí)鐘周期(圖616) 這時(shí)第一條指令進(jìn)入EXE

32、級,第二條指令進(jìn)入ID級,第三條指令進(jìn)入IF級。3條指令的操作在各自的級同時(shí)進(jìn)行: (1)處在EXE級的第,條指令add rl,r1,4由ALU完成加法操作。多路器的選擇信號SIMM(select immediate)為1,意為選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來自流水線寄存器A和I。ALU右端的流水線寄存器d,R,S被五條件地打人數(shù)據(jù),而只有當(dāng)指令為ALU運(yùn)算類型時(shí),寫使能信號WZ1,才把ALU的ZERO輸出打人一位流水線寄存器Z。這是因?yàn)椴⒉皇撬械闹噶疃夹薷腪標(biāo)志寄存器。(2)處在ID級的第二條指令loadr3,100(r2)完成譯碼、立即數(shù)符號擴(kuò)展以及讀寄存圖616 程序例子執(zhí)行時(shí)的

33、第三個(gè)周期器操作。SST0,選擇rs2。在本周期結(jié)束時(shí),把32位的100和r2的內(nèi)容分別寫人流水線寄存器I和A。目的寄存器號3也被打人流水線寄存器d,以備在WR級用它來指定目的寄存器r3,向其中寫入從存儲器取來的數(shù)據(jù)。 (3)PC輸出2,從存儲器取出第三條指令sub r4,r5,r6,在周期結(jié)束時(shí)打人IR。BTAKEN二0,周期結(jié)束時(shí)把3打人PC。 第三個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第四個(gè)周期時(shí),PC輸出3,指向第四條指令;IR輸出第三條指令subr4,r5,r6;I輸出32位的100,A輸出寄存器r3的內(nèi)容(第二條指令);R輸出第一條指令的加法結(jié)果。4第四個(gè)時(shí)鐘周期(圖617)圖617 程序例子

34、執(zhí)行時(shí)的第四個(gè)周期這時(shí)第一條指令進(jìn)入MEM級,第二條指令進(jìn)入EXE級,第三條指令進(jìn)入ID級,鮮四條指令進(jìn)入IF級。4條指令的操作在各自的級同時(shí)進(jìn)行:(1)R的內(nèi)容直接傳遞到C。(2)處在EXE級的第二條指令loadr3,100(r2)由ALU計(jì)算存儲器地址。多路器的選擇信號SIMM1,選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來自流水線寄存器A和I。WZ0,不打人流水線寄存器Z。(3)處在級的第三條指令subr4,r5,r6完成譯碼、立即數(shù)符號擴(kuò)展以及讀寄存器操作。SST0,選擇rs2。在本周期結(jié)束時(shí),寄存器r5和r6的內(nèi)容分別寫入流水線寄存器A和B。目的寄存器號4也被打人流水線寄存器d,以備在WR

35、級用它來指定目的寄存器r4,向其中寫入減法操作的結(jié)果。(4)PC輸出3,從存儲器取出第四條指令add r?,r5,r6,在周期結(jié)束時(shí)打人IR。BTAKEN0,周期結(jié)束時(shí)把4打入PC。第四個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第五個(gè)周期時(shí),PC輸出4,指向第五條指令;IR輸出第四條指令addr7,r5,r6;A和B分別輸出寄存器r5和r6的內(nèi)容<第三條指令);R輸出存儲器地址(第二條指令);C輸出第一條指令的加法結(jié)果。5第五個(gè)時(shí)鐘周期(圖618)圖618 程序例子執(zhí)行時(shí)的第五個(gè)周期這時(shí)指令充滿流水線。第一條指令進(jìn)入WB級,第二條指令進(jìn)入MEM級,第三條指令進(jìn)入EXE級,第四條指令進(jìn)入ID級,第五條指令

36、進(jìn)入IF級。5條指令的操作在各自的級同時(shí)進(jìn)行:(1)第一條指令處在WB級。這時(shí),d輸出1(接到寄存器堆的AD端)。寄存器寫使能信號WREG(writeregmterfile)為1。多路器的選擇信號SLD(selectload)為0,選擇C輸出,即把加法結(jié)果寫入寄存器堆的r1寄存器。至此,第一條指令完成了它的執(zhí)行,退出流水線。(2)處在MEM級的第二條loadr2,100(r3)訪問存儲器。周期結(jié)束時(shí)把取來的存儲器數(shù)據(jù)寫入D。(3)處在EXE級的第三條指令sub r4,r5,r6由ALU做減法。多路器的選擇信號 SIMM0,選擇寄存器操作數(shù)。ALU的兩個(gè)源操作數(shù)分別來自流水線寄存器A和B。WZ1

37、,把ALU的ZERO輸出打人流水線寄存器Z。(4)處在ID級的第四條指令addr?,r5,r6完成譯碼及讀寄存器操作。SST0,選擇r6。在本周期結(jié)束時(shí),寄存器r5和r6的內(nèi)容分別寫入流水線寄存器A和B。目的寄存器號7也被打人流水線寄存器d,以備在WR級用它來指定目的寄存器r4,向其中寫入加法操作的結(jié)果。(5)PC輸出4,從存儲器取出第五條指令store r8,200(r9),在周期結(jié)束時(shí)打人IR。BTAKEN二0,周期結(jié)束時(shí)把5打入PC。第五個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第六個(gè)周期時(shí),PC輸出5,指向第六條指令;IR輸出第五條指令store r8,200(r9);A和B分別輸出寄存器r5和r6的

38、內(nèi)容(第四條指令);R減法結(jié)果(第三條指令);D輸出第二條指令從存儲器取來的數(shù)據(jù)。6第六個(gè)時(shí)鐘周期(圖619)圖619 程序例子執(zhí)行時(shí)的第六個(gè)周期這時(shí)指令仍充滿流水線。第二條指令進(jìn)入WB級,第三條指令進(jìn)入MEM級,第四條指令進(jìn)入EXE級,第五條指令進(jìn)入ID級,第六條指令進(jìn)人IF級。5條指令的操作在各自的流水線級同時(shí)進(jìn)行:(1)第二條指令處在WB級。這時(shí),d輸出2。寄存器寫使能信號WREG1。SLD1,選擇D的輸出,即把存儲器數(shù)據(jù)寫入寄存器堆的r2寄存器。至此,第二條指令也完成了它的執(zhí)行,退出流水線。(2)處在MEM級的第三條addr7,r5,r6把R的輸出直接傳遞到C。(3)處在EXE級的第四

39、條指令add r?,r5,r6由ALU做加法。多路器的選擇信號SIMM0,選擇寄存器操作數(shù)。ALU的兩個(gè)源操作數(shù)分別來自流水線寄存器A和B。WZ;1,把ALU的ZERO輸出打人流水線寄存器Z。(4)處在ID級的第五條指令storer8,200(r9)完成譯碼、立即數(shù)符號擴(kuò)展以及讀寄存器操作。注意,這時(shí)SST1,選擇18。在本周期結(jié)束時(shí),擴(kuò)展的立即數(shù)200、寄存器r9和r8的內(nèi)容分別寫入流水線寄存器I,A和B。(5)PC輸出5,從存儲器取出第六條指令subi ri0,ri0,1,在周期結(jié)束時(shí)打人IR。BTAKEN0,周期結(jié)束時(shí)把6打人PC。第六個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第七個(gè)周期時(shí),PC輸出6,

40、指向第七條指令;IR輸出第六條指令subiri0,ri0,1;A和B分別輸出寄存器r9和r8的內(nèi)容,I送出32位的200(第五條指令);R輸出加法結(jié)果(第四條指令);C輸出第三條指令減法操作的結(jié)果。7第七個(gè)時(shí)鐘周期(圖6。20)圖620 程序例子執(zhí)行時(shí)的第七個(gè)周期本例中只有6條指令,實(shí)際上處理機(jī)繼續(xù)執(zhí)行其它指令,我們不再演示這些指令。第三條指令進(jìn)入WB級,第四條指令進(jìn)入MEM級,第五條指令進(jìn)入EXE級,第六條指令進(jìn)入ID級。這4條指令的操作在各自的級同時(shí)進(jìn)行:(1)第三條指令subr4,r5,r6處在WB級。這時(shí),d輸出4。寄存器寫使能信號WREG=1。SLD0,選擇C的輸出,即把減法結(jié)果寫入

41、寄存器堆的r4寄存器。至此,第三條指令也完成了它的執(zhí)行,退出流水線。(2)處在MEM級的第四條addr7,r5,r6把R的輸出直接傳遞到C。(3)處在EXE級的第五條指令storer8,200(r9)由ALU計(jì)算存儲器地址。多路器的選擇信號SIMMl,選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來自流水線寄存器A和I。WZ0,不改變流水線寄存器Z。B的內(nèi)容直接傳遞到S。(4)處在ID級的第六條指令subi rlO,f10,1完成譯碼、立即數(shù)符號擴(kuò)展以及讀寄存器操作。這時(shí)SST任意。在本周期結(jié)束時(shí),擴(kuò)展的立即數(shù)1和寄存器rlo的內(nèi)容分別寫入流水線寄存器1和A。第七個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第八個(gè)周期時(shí),

42、A和1分別輸出寄存器r10的內(nèi)容和立即數(shù)1(第六條指令);R輸出存儲器地址,S輸出存儲器數(shù)據(jù)(第五條指令);C輸出第四條指令加法操作的結(jié)果。8第八個(gè)時(shí)鐘周期(圖621)圖621 程序例子執(zhí)行時(shí)的第八個(gè)周期 本周期中,第四條指令進(jìn)入WB級,第五條指令進(jìn)入MEM級,第六條指令進(jìn)入EXE級。這3條指令的操作在各自的級同時(shí)進(jìn)行: (1)第四條指令add r7,r5,r6處在WB級。這時(shí),d輸出?。寄存器寫使能信號WREG1。SLD0,選擇C的輸出,即把加法結(jié)果寫入寄存器堆的r7寄存器。至此,第四條指令也完成了它的執(zhí)行,退出流水線。 (2)處在MEM級的第五條store r8,200(r9)把S的輸出寫

43、入由R指定的存儲器單元。 (3)處在EXE級的第六條指令subiri0,r10,1由ALU做減法。多路器的選擇信號SIMM:1,選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來自流水線寄存器A和I。WZ1,改變流水線寄存器Z。 第八個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第九個(gè)周期時(shí),只有R輸出減法結(jié)果,其它的均沒有用。 9第九個(gè)時(shí)鐘周期(圖6,22) 本周期中,第五條指令進(jìn)入WB級,第六條指令進(jìn)人MEM級。這兩條指令的操作在各自的級同時(shí)進(jìn)行: (1)第五條指令store處在WB級。這時(shí)它什么也不做。實(shí)際上store指令在前一個(gè)周期已完成執(zhí)行。 (2)處在MEM級的第六條指令subiri0,ri0,1把R的輸出傳遞到

44、C。 第九個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第十個(gè)周期時(shí),只用C中的減法結(jié)果,其它的均沒有用。 10第十個(gè)時(shí)鐘周期(圖623)第六條指令subirl0,r10,1處在WB級。這時(shí),d輸出10。寄存器寫使能信號WREG1。SLD0,選擇C的輸出。即把減法結(jié)果寫入寄存器堆的ri0寄存器。至此,第六條指令也完成了它的執(zhí)行,退出流水線。第十個(gè)時(shí)鐘周期結(jié)束后,所有的6條指令的執(zhí)行均已完成。632 流水線轉(zhuǎn)移指令控制到目前為止,我們討論了ALU類型指令和存儲器訪問指令的流水線執(zhí)行的情況。以下我們將討論控制相關(guān)(contr01dependence)和轉(zhuǎn)移指令在流水線處理機(jī)中的執(zhí)行情況。轉(zhuǎn)移指令改變程序的順序執(zhí)行次序,轉(zhuǎn)向其它地址(稱作轉(zhuǎn)移目標(biāo)地址,brallch target addTess)去取指令執(zhí)行。轉(zhuǎn)移指令包括條件轉(zhuǎn)移和五條件轉(zhuǎn)移兩類指令。在我們定義的指令系統(tǒng)中,轉(zhuǎn)移指令有bne disp 非0時(shí)轉(zhuǎn)移(branch on not equal to zero) if,PC=PC+disp圖622 程序例子執(zhí)行時(shí)的第九個(gè)周期圖623 程序例子執(zhí)行時(shí)的第十個(gè)周期 beq disp 為0時(shí)轉(zhuǎn)移(branch on equal to zero) if Z,PCPC+disp branch disp 為條件轉(zhuǎn)移(uncondit

溫馨提示

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

評論

0/150

提交評論