專利名稱::基于操作隊(duì)列復(fù)用的指令流水線系統(tǒng)和方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及微處理器體系結(jié)構(gòu),特別涉及一種微處理器的流水線系統(tǒng)。為了提高處理器中指令執(zhí)行的并行度,現(xiàn)代微處理器大都采用動(dòng)態(tài)調(diào)度技術(shù),即允許處理器改變指令的發(fā)送和執(zhí)行的次序,以克服相關(guān)性,增加并行性。為了實(shí)現(xiàn)指令的動(dòng)態(tài)調(diào)度,通常還需要寄存器重命名和操作隊(duì)列等技術(shù)支持。寄存器重命名技術(shù)的基本思想是允許處理器動(dòng)態(tài)地分配寄存器,用于解決由于指令亂序執(zhí)行而產(chǎn)生的寄存器沖突,操作隊(duì)列一般多用于緩沖準(zhǔn)備好用于亂序執(zhí)行的指令。在今天的計(jì)算機(jī)微處理器設(shè)計(jì)中,隨著對(duì)機(jī)器性能要求的不斷提高,對(duì)流水線效率的要求也越來(lái)越高,流水線的設(shè)計(jì)也越來(lái)越復(fù)雜。SGI/MIPS的MIPS系列微處理器是與本發(fā)明最為接近的。其代表產(chǎn)品是R4000和R10000。下面以它們的流水線為例,分析其優(yōu)劣,進(jìn)而闡明本發(fā)明的優(yōu)點(diǎn)所在。MIPSR4000采用的是靜態(tài)流水方式,共分為8個(gè)階段,分別是取指1(IF),取指2(IS),取寄存器(RF),執(zhí)行(EX),取數(shù)1(DF),取數(shù)2(DS),標(biāo)記檢查(TC),寫回(WB)(參見參考文獻(xiàn)2)。由于靜態(tài)流水的局限性,造成了該微處理器不能實(shí)現(xiàn)指令亂序執(zhí)行,因而流水線效率比較低。同時(shí)由于數(shù)據(jù)通路不夠,對(duì)指令順序還提出了一些很苛刻的要求。MIPSR10000的流水線分為大致6級(jí)(定點(diǎn)5級(jí),訪存6級(jí),浮點(diǎn)7級(jí)),1~3級(jí)是取指階段,在第1級(jí),取出指令及其下面比鄰的四條指令,在第2級(jí),進(jìn)行譯碼和寄存器重命名,并為轉(zhuǎn)移指令計(jì)算地址。在第3級(jí),將寄存器重命名后的指令送入相應(yīng)操作隊(duì)列,并做相關(guān)處理。在第3階段的后半段,處理器從寄存器堆中讀出操作數(shù),并在第4階段開始執(zhí)行(其中定點(diǎn)執(zhí)行需1級(jí),訪存指令需2級(jí),浮點(diǎn)指令執(zhí)行需3級(jí)),在執(zhí)行完成后的下一級(jí)前半寫回結(jié)果。在流水線技術(shù)方面,運(yùn)用了指令預(yù)取,亂序執(zhí)行,轉(zhuǎn)移猜測(cè),精確中斷等先進(jìn)技術(shù),并保持了順序一致性。該處理器每個(gè)時(shí)鐘周期可以進(jìn)行四條指令的取指和譯碼,利用轉(zhuǎn)移棧實(shí)現(xiàn)了轉(zhuǎn)移猜測(cè),利用映射表實(shí)現(xiàn)寄存器重命名,進(jìn)而實(shí)現(xiàn)亂序執(zhí)行。在MIPSR10000中是通過(guò)使用寄存器映射的方法實(shí)現(xiàn)動(dòng)態(tài)調(diào)度的,具體做法是,在指令被送到操作隊(duì)列之前,將邏輯寄存器號(hào)映射為空閑的物理寄存器號(hào),然后將重命名好的指令放入操作隊(duì)列,然后執(zhí)行。執(zhí)行結(jié)束后,先將結(jié)果寫回到該物理寄存器對(duì)應(yīng)的臨時(shí)結(jié)果寄存器中,直到該指令可以寫回時(shí),再寫回到該物理寄存器。這種方法,要求真正的物理寄存器要比邏輯寄存器多一倍左右。因此在R10000中,共有33個(gè)定點(diǎn)邏輯寄存器(包括特殊的HI和LO寄存器),64個(gè)定點(diǎn)物理寄存器,32個(gè)浮點(diǎn)邏輯,64個(gè)浮點(diǎn)物理寄存器。為了實(shí)現(xiàn)寄存器重命名,R10000采用了如下結(jié)構(gòu)寄存器映射表(registermaptables),空閑表(freetables),活躍表(activetables),以及忙位表(busy-bittables)。其中,寄存器映射表將邏輯寄存器映射為物理寄存器,空閑表記錄空閑中的物理寄存器,活躍表記錄所有的活躍指令,以便于精確中斷。忙位表記錄每一個(gè)物理寄存器中當(dāng)前的值是否有效。同時(shí),在R10000中共有3個(gè)操作隊(duì)列,定點(diǎn),浮點(diǎn)和訪存分別各有一個(gè)。經(jīng)過(guò)寄存器重命名的指令通過(guò)分類后分別打入各操作隊(duì)列,在操作隊(duì)列中可亂序執(zhí)行,但寫回仍然按序?qū)懟氐郊拇嫫髦?,不過(guò)對(duì)于程序員而言,好像指令序列仍然一直按順序執(zhí)行一般。當(dāng)寄存器中的值可用后才可以再繼續(xù)發(fā)射相關(guān)指令。這種動(dòng)態(tài)亂序執(zhí)行性能上比靜態(tài)流水有了很大提高,但是仍然有一些不足之處。比如,重命名的代價(jià)過(guò)大,控制過(guò)于復(fù)雜(要引入4個(gè)記錄表,物理寄存器要遠(yuǎn)多于邏輯寄存器),沒(méi)有保留棧,要把結(jié)果直接寫回到寄存器中,使得相關(guān)指令發(fā)射要有一拍左右的延遲等等,見KennethC.Yeager,TheMipsR10000SuperscalarMicroprocessor,IEEEMicro,Vol.16,No.2,1996pp.28-39。為實(shí)現(xiàn)上述目的,一種基于操作隊(duì)列復(fù)用的指令流水線系統(tǒng),包括取指部件,用于取出指令;譯碼部件,對(duì)取出的指令進(jìn)行譯碼,并按指令在程序中出現(xiàn)的先后次序把譯碼后的指令(稱為操作)送到操作隊(duì)列;操作隊(duì)列,按次序根據(jù)操作的類型把操作發(fā)射到相應(yīng)的保留站,并按次序結(jié)束(Commit)運(yùn)算結(jié)果已經(jīng)寫回的指令;保留站,對(duì)發(fā)射來(lái)的操作進(jìn)行運(yùn)算,把運(yùn)算結(jié)果送回到結(jié)果總線并寫回到操作隊(duì)列;寄存器,在結(jié)束指令時(shí),接收由操作隊(duì)列依照指令進(jìn)出操作隊(duì)列的次序。本發(fā)明通過(guò)操作隊(duì)列的復(fù)用實(shí)現(xiàn)指令的動(dòng)態(tài)調(diào)度,減少控制邏輯,從而提高流水線效率,進(jìn)而提高微處理器的性能。發(fā)明的實(shí)施方式本發(fā)明的流水線結(jié)構(gòu)是一種精簡(jiǎn)指令集計(jì)算機(jī)(ReduceInstructionSetComputer,簡(jiǎn)稱RISC)的指令流水線結(jié)構(gòu)。本發(fā)明的流水線結(jié)構(gòu)如圖1所示。該結(jié)構(gòu)由取指部件,譯碼部件,操作隊(duì)列,定點(diǎn)及浮點(diǎn)寄存器堆,及多個(gè)功能部件組成。在該結(jié)構(gòu)中,指令譯碼部件按指令在程序中出現(xiàn)的先后次序把譯碼后的指令(譯碼后的指令稱為操作)送到操作隊(duì)列,操作隊(duì)列按次序根據(jù)操作的類型把操作發(fā)射到相應(yīng)的保留站,并按次序結(jié)束運(yùn)算結(jié)果已經(jīng)寫回的指令。保留站中的操作經(jīng)運(yùn)算后,把結(jié)果送回到結(jié)果總線并寫回到操作隊(duì)列。指令進(jìn)出操作隊(duì)列(即發(fā)射和結(jié)束)都是有序的,但在操作隊(duì)列期間的執(zhí)行過(guò)程中是無(wú)序的。在上述結(jié)構(gòu)中,運(yùn)算結(jié)果不直接寫回到結(jié)果寄存器而是先寫回到操作隊(duì)列是為了實(shí)現(xiàn)精確例外處理。因?yàn)椴僮麝?duì)列中指令的執(zhí)行是無(wú)序的,一條指令的執(zhí)行結(jié)果必須等到它前面所有的指令都執(zhí)行完后才能寫回到寄存器。否則,在該指令的執(zhí)行結(jié)果寫回寄存器后它前面的一條指令發(fā)生了例外時(shí),例外現(xiàn)場(chǎng)就不正確了。如果一個(gè)操作發(fā)射時(shí)它所需的源操作數(shù)還沒(méi)有準(zhǔn)備好(該操作的源寄存器正成為其它未完成指令的目標(biāo)寄存器),該操作的發(fā)射不需要等待,而是通過(guò)操作隊(duì)列號(hào)建立操作間的數(shù)據(jù)依賴關(guān)系后把該操作發(fā)射到保留站,保留站自動(dòng)偵聽結(jié)果總線并接收所需要的值。具體過(guò)程如下(1).一個(gè)操作發(fā)射時(shí)要在相應(yīng)的目標(biāo)寄存器(如Ri)處記錄該操作在操作隊(duì)列中的位置(如第qid項(xiàng)),即該寄存器被重定向到最近一個(gè)寫它的操作在操作隊(duì)列的位置;并置該寄存器為無(wú)效,在該操作結(jié)束并把值寫回到寄存器之前,該寄存器的值不可用。(2).后面的操作發(fā)射時(shí)如果用到Ri寄存器,訪問(wèn)Ri寄存器時(shí)發(fā)現(xiàn)該寄存器正成為操作隊(duì)列中第qid項(xiàng)的目標(biāo)寄存器且結(jié)果未寫回到寄存器,則讀出Ri中記錄的qid號(hào)并根據(jù)該號(hào)訪問(wèn)操作隊(duì)列;如果第qid項(xiàng)的值已經(jīng)寫回到操作隊(duì)列則直接從操作隊(duì)列中讀出該值作為Ri的值,否則把qid送到保留站并在保留站中記錄該寄存器值未準(zhǔn)備好。(3).保留站偵聽結(jié)果總線,當(dāng)?shù)趒id項(xiàng)操作結(jié)束并把結(jié)果送到結(jié)果總線時(shí)直接接收結(jié)果總線的值作為Ri的值。(4).當(dāng)保留站中所有操作數(shù)都準(zhǔn)備好后開始運(yùn)算并把結(jié)果送到結(jié)果總線,結(jié)果總線連接到操作隊(duì)列以及保留站。圖2給出了操作隊(duì)列發(fā)射一個(gè)操作到保留站時(shí)操作數(shù)的形成過(guò)程,圖中沒(méi)有包括浮點(diǎn)部分。本發(fā)明的指令流水線分成取指、譯碼、發(fā)射、執(zhí)行并寫回、完成等階段。其中執(zhí)行階段可能需要多拍。●取指根據(jù)當(dāng)前PC的內(nèi)容取指令到指令寄存器IR。下一條指令的PC值由多個(gè)因素決定,如IR中的指令是否為轉(zhuǎn)移指令,例外,以及前面的轉(zhuǎn)移預(yù)測(cè)失敗等。在正常的情況下,下一條指令的PC值為當(dāng)前指令的PC+4。●譯碼根據(jù)IR中的當(dāng)前指令進(jìn)行譯碼形成統(tǒng)一的內(nèi)部格式并存入操作隊(duì)列。如果操作隊(duì)列已滿,則等待,流水線暫停?!癜l(fā)射從操作隊(duì)列中取出一個(gè)操作并發(fā)射到相應(yīng)的保留站。在這一階段需要判斷運(yùn)算所需的源寄存器值是否已經(jīng)可用。如果可用,直接讀源寄存器的值;如果未可用,需要告訴保留站最近一個(gè)寫該寄存器的操作,目標(biāo)寄存器被重定向?yàn)樵摬僮髟诓僮麝?duì)列中的位置編號(hào)。●執(zhí)行并寫回執(zhí)行部件從相應(yīng)的保留站中取出所有源操作數(shù)都已經(jīng)準(zhǔn)備好的操作,根據(jù)操作的類型進(jìn)行運(yùn)算,并把結(jié)果值以及該操作在操作隊(duì)列中的位置編號(hào)放在結(jié)果總線上。保留站和操作隊(duì)列偵聽結(jié)果總線的信息,并修改相應(yīng)的內(nèi)容和狀態(tài)。值得注意的是,為了實(shí)現(xiàn)精確例外,運(yùn)算結(jié)果并不直接寫回寄存器,而是寫到操作隊(duì)列的相應(yīng)項(xiàng)?!裢瓿扇绻僮麝?duì)列中的第一個(gè)操作已經(jīng)完成,則結(jié)束該操作。如果操作隊(duì)列中的第一個(gè)操作在操作過(guò)程中引起過(guò)例外,則進(jìn)行例外處理。當(dāng)一個(gè)操作從操作隊(duì)列中被清除掉時(shí),進(jìn)行寄存器的最終寫回,即把操作隊(duì)列中的結(jié)果寫回到該操作的目標(biāo)寄存器去。在上述過(guò)程中,當(dāng)一個(gè)操作把結(jié)果寫回到操作隊(duì)列時(shí),操作隊(duì)列并不需要專門的域來(lái)存放結(jié)果,而是把結(jié)果寫回到相應(yīng)操作的立即數(shù)域(操作隊(duì)列的每一項(xiàng)都有立即數(shù)域,用來(lái)保存指令中的立即數(shù)),因?yàn)樵诮Y(jié)果寫回階段,一個(gè)操作的立即數(shù)已經(jīng)沒(méi)用了。需要指出的是,在傳統(tǒng)的流水線中,執(zhí)行和寫回分成兩個(gè)不同的流水級(jí),在指令執(zhí)行階段算出的結(jié)果必須等到寫回階段才能送到結(jié)果總線上。這樣的化如果一條指令用到它的前一條指令的結(jié)果,至少需要等一拍(當(dāng)然可以用forward技術(shù)解決這個(gè)問(wèn)題)。實(shí)際上對(duì)于簡(jiǎn)單的運(yùn)算操作如定點(diǎn)加法,執(zhí)行并寫回在一拍內(nèi)完成在延遲上是沒(méi)問(wèn)題的(執(zhí)行并寫回的延遲包括三個(gè)部分從保留站中選擇一個(gè)源操作數(shù)都準(zhǔn)備好的操作的延遲+簡(jiǎn)單運(yùn)算如加法的延遲+偵聽邏輯的延遲或把結(jié)果寫回操作隊(duì)列的延遲)。在傳統(tǒng)流水線中把執(zhí)行和寫回分成兩個(gè)不同的流水級(jí)的主要是為了避免結(jié)果總線沖突。在傳統(tǒng)流水線中,訪存部件和定點(diǎn)運(yùn)算部件公用一條結(jié)果總線,而訪存部件需要在執(zhí)行階段計(jì)算地址并在寫回階段訪問(wèn)CACHE,因此把運(yùn)算指令也增加一拍以避免結(jié)果總線沖突。否則前一條訪存指令和后一條運(yùn)算指令會(huì)同時(shí)形成結(jié)果,引起結(jié)果總線沖突。在我們的設(shè)計(jì)中,有多條結(jié)果總線(至少為兩條),訪存部件和運(yùn)算部件可以通過(guò)不同的結(jié)果總線送回結(jié)果。因此對(duì)于普通運(yùn)算,可以把執(zhí)行和寫回合并成一拍,對(duì)于訪存運(yùn)算,相當(dāng)于執(zhí)行并寫回階段階段需要多拍(還有其它運(yùn)算如浮點(diǎn)運(yùn)算也有需要多拍的)。為了實(shí)現(xiàn)上述CPU的動(dòng)態(tài)流水線,本發(fā)明設(shè)置如下的寄存器每個(gè)運(yùn)算部件都需要設(shè)置一定數(shù)量(如1-4個(gè))的保留站,一個(gè)操作隊(duì)列,以及通用和浮點(diǎn)寄存器堆。操作隊(duì)列中的每一項(xiàng)包括如下內(nèi)容?!馩P操作類型,如加、減、移位、取數(shù)等?!馭rc1源寄存器號(hào)1。●Src2源寄存器號(hào)2?!馜est目標(biāo)寄存器號(hào)。●Imm/Res指令中的立即數(shù),同時(shí)在操作結(jié)束但未結(jié)束前用于臨時(shí)保存結(jié)果,如果發(fā)生訪存例外也可用于保存虛地址。●State操作隊(duì)列狀態(tài),2位,“0”表示空,“1”表示相應(yīng)的操作隊(duì)列項(xiàng)中有操作但未送到保留站,“2”表示相應(yīng)的操作已經(jīng)送到保留站,“3”表示相應(yīng)的操作已經(jīng)執(zhí)行完但未結(jié)束?!衿渌A粽局械拿恳豁?xiàng)包括如下內(nèi)容。●B忙位,“0”表示相應(yīng)的保留站項(xiàng)中無(wú)操作,“1”表示有操作?!馩P操作類型。●Qj源1寄存器號(hào),最高位為“1”表示數(shù)據(jù)已經(jīng)準(zhǔn)備好在Vj域中,其它位表示計(jì)算所需數(shù)據(jù)的操作在操作隊(duì)列中的位置,用于偵聽結(jié)果總線,等待計(jì)算結(jié)果?!馰j源1操作數(shù)的值,Qj的最高位為為“1”時(shí)有效。●Qk源2寄存器號(hào)?!馰k源2操作數(shù)的值?!馫id相應(yīng)操作在操作隊(duì)列中的位置,用于運(yùn)算結(jié)束時(shí)把結(jié)果寫回操作隊(duì)列以及偵聽總線的保留站接收運(yùn)算結(jié)果,發(fā)生例外時(shí)用于給操作隊(duì)列的例外原因等域賦值。值得指出的是,以上只是典型保留站的基本內(nèi)容。浮點(diǎn)運(yùn)算部件和訪存部件的保留站根據(jù)各自的需要(如浮點(diǎn)部件的操作數(shù)可能是32位的,訪存部件有三個(gè)操作數(shù))有不同的具體內(nèi)容,不過(guò)其原理是一樣的。寄存器堆中的每一個(gè)寄存器包括如下內(nèi)容●Value寄存器的值?!馰alid有效位,“1”表示寄存器的值有效,“0”表示該寄存器正成為某操作的結(jié)果寄存器沒(méi)有寫回?!馫id當(dāng)Valid位為“1”時(shí)該域不用,當(dāng)Valid位為“0”時(shí)記錄最近一個(gè)把該寄存器作為結(jié)果寄存器的操作在操作隊(duì)列中的位置。根據(jù)上述指令流水線的設(shè)計(jì)思想,本發(fā)明的指令流水線主要數(shù)據(jù)通路包括指令寄存器的指令譯碼后送到操作隊(duì)列的譯碼總線;操作隊(duì)列中的操作經(jīng)寄存器重命名及讀取操作數(shù)后被發(fā)射到相應(yīng)的保留站的發(fā)射總線;運(yùn)算結(jié)果由結(jié)果總線送到保留站以及操作隊(duì)列的結(jié)果總線,以及操作隊(duì)列中的操作被結(jié)束時(shí)把運(yùn)算結(jié)果送到通用寄存器及浮點(diǎn)寄存器的結(jié)束總線。譯碼總線是指令譯碼后到操作隊(duì)列的數(shù)據(jù)通路,主要包括如下內(nèi)容。●Valid有效位。●OP操作類型?!馭rc1源寄存器號(hào)1。●Src2源寄存器號(hào)2?!馜est目標(biāo)寄存器號(hào)?!馡mm指令中的立即數(shù)?!衿渌缦鄳?yīng)指令的PC值,以及指示取指及譯碼過(guò)程中是否發(fā)生例外的例外位等。發(fā)射總線指從操作隊(duì)列經(jīng)過(guò)訪問(wèn)寄存器發(fā)射操作到各個(gè)保留站的數(shù)據(jù)通路。指令的發(fā)射經(jīng)過(guò)從操作隊(duì)列到寄存器讀取操作數(shù),再把操作數(shù)送到功能部件的過(guò)程。如果被發(fā)射操作的源寄存器正在成為其它操作的目標(biāo),還有可能從操作隊(duì)列讀取已經(jīng)寫回但未結(jié)束的數(shù)據(jù)。因此,發(fā)射總線包括從操作隊(duì)列到寄存器和從寄存器到功能部件兩個(gè)層次。從操作隊(duì)列到寄存器的數(shù)據(jù)通路用于發(fā)出操作命令以及讀取已經(jīng)寫回操作隊(duì)列但未結(jié)束的結(jié)果值;從寄存器到各個(gè)功能部件的發(fā)射總線在操作隊(duì)列發(fā)射總線的基礎(chǔ)上讀取通用寄存器和浮點(diǎn)寄存器的操作數(shù)值后形成。從操作隊(duì)列到寄存器的發(fā)射總線包括如下內(nèi)容●Valid有效位?!馫id操作隊(duì)列號(hào)?!馩P操作類型?!馭rc1源寄存器號(hào)1。●Src2源寄存器號(hào)2?!馜est目標(biāo)寄存器號(hào)?!馡mm被發(fā)射指令的立即數(shù),移位指令的移位數(shù),浮點(diǎn)指令的fmt?!馬es1與Src1對(duì)應(yīng)的操作數(shù)低32位?!馱B1Res1的寫回位?!馬es2與Src2對(duì)應(yīng)的操作數(shù)低32位?!馱B2Res2的寫回位。從寄存器到保留站的發(fā)射總線包括如下內(nèi)容●Valid有效位,“1”有效。來(lái)自操作隊(duì)列?!馩P操作類型。來(lái)自操作隊(duì)列?!馫id操作隊(duì)列號(hào)。來(lái)自操作隊(duì)列。●Src1目前沒(méi)用。●Src2訪存保留站用Src2的前兩位確定所存的數(shù)是來(lái)自通用寄存器還是浮點(diǎn)寄存器?!馡mm在定點(diǎn)和訪存指令中表示立即數(shù)。來(lái)自操作隊(duì)列?!馫j源1重命名寄存器號(hào)。來(lái)自通用寄存器?!馰j源1操作數(shù)的值。來(lái)自通用寄存器?!馫k源2重命名寄存器號(hào)。來(lái)自通用寄存器。●Vk源2操作數(shù)的值。來(lái)自通用寄存器?!馞Qj浮點(diǎn)操作的源1重命名寄存器號(hào)。來(lái)自浮點(diǎn)寄存器?!馞Vj浮點(diǎn)操作的源1操作數(shù)的值。來(lái)自浮點(diǎn)寄存器?!馞Qk浮點(diǎn)操作的源2重命名寄存器號(hào)。來(lái)自浮點(diǎn)寄存器?!馞Vk浮點(diǎn)操作的源2操作數(shù)的值。來(lái)自浮點(diǎn)寄存器。上述信號(hào)的形成需要兩個(gè)階段。首先,操作隊(duì)列送出OP,src1,src2,dest,Imm等信號(hào),通用寄存器和浮點(diǎn)寄存器根據(jù)src1和src2讀出相應(yīng)寄存器的qid并送到操作隊(duì)列。操作隊(duì)列根據(jù)這些重命名寄存器號(hào)送出Res1,WB1,Res2,WB2等值。寄存器模塊再根據(jù)這些值和寄存器的內(nèi)容形成Qj,Vi,Qk,Vk,F(xiàn)Qj,Vj,F(xiàn)Qk,Vk。形成發(fā)射總線后,發(fā)射總線的內(nèi)容被送到各個(gè)功能部件。不同的功能部件(定點(diǎn),浮點(diǎn),訪存)根據(jù)自己的需要使用發(fā)射總線中的不同數(shù)據(jù)。結(jié)果總線從運(yùn)算部件到操作隊(duì)列及保留站。雖然目前一共有五個(gè)功能部件會(huì)產(chǎn)生結(jié)果,但我們只設(shè)置兩條結(jié)果總線,每個(gè)功能部件都可以把結(jié)果送到任何一條結(jié)果總線上。每條結(jié)果總線包含如下內(nèi)容●Valid有效位,“1”有效。●Qidi重命名結(jié)果寄存器號(hào)。●Value運(yùn)算或訪存結(jié)果?!衿渌绶从尺\(yùn)算及訪存過(guò)程中是否發(fā)生例外的例外位等。在結(jié)束階段,操作隊(duì)列通過(guò)結(jié)束總線向通用寄存器及浮點(diǎn)寄存器寫回結(jié)果。結(jié)束總線包括如下內(nèi)容●Valid有效位?!馩P操作碼?!馜est目標(biāo)寄存器號(hào)。●Qid操作隊(duì)列號(hào)?!馰alue寫回到寄存器的結(jié)果。由上可見,采用本發(fā)明所應(yīng)用的方法,可以大大簡(jiǎn)化寄存器重命名需要付出的物理代價(jià),降低控制的復(fù)雜度,從而達(dá)到提高整個(gè)流水線乃至機(jī)器性能的目的。下面通過(guò)一個(gè)例子描述操作隊(duì)列、保留站、以及寄存器的功能。圖3給出了三條相關(guān)指令執(zhí)行時(shí)操作隊(duì)列、保留站、寄存器的變化。如果運(yùn)算器流水線延遲為兩拍,即數(shù)據(jù)在保留站中準(zhǔn)備好開始運(yùn)算后的下一拍結(jié)果才出現(xiàn)在結(jié)果總線上,則這三條指令需要8拍才能完成。圖3(a)給出了初始狀態(tài),圖3(b)-(i)給出了此后的8個(gè)時(shí)鐘周期內(nèi)狀態(tài)的變化。1.第一拍,操作隊(duì)列向保留站發(fā)出ADC操作,該操作寫R1寄存器。由于所有的源操作數(shù)都已經(jīng)準(zhǔn)備好,保留站中的Qj,Qk域?yàn)?(最高位為1表示數(shù)據(jù)已經(jīng)準(zhǔn)備好),Vj,Vk域可用,Qid域?yàn)?,表示運(yùn)算結(jié)束后把結(jié)果寫回到操作隊(duì)列的第0項(xiàng)。修改操作隊(duì)列中第0項(xiàng)的狀態(tài)為操作已經(jīng)發(fā)出但結(jié)果未寫回。置R1寄存器的Valid域?yàn)?,Qid域?yàn)?,表示R1寄存器的值無(wú)效,最新值在操作隊(duì)列的第0項(xiàng)。2.第二拍,ADC操作被執(zhí)行,并把結(jié)果打入運(yùn)算器末端的運(yùn)算結(jié)果寄存器。SUB操作被發(fā)射到保留站。與第一拍類似,修改相應(yīng)狀態(tài)。所不同的是SUB操作的源操作數(shù)依賴于ADC操作的結(jié)果,因此保留站的Qj域置為0,表示等待操作隊(duì)列的第0項(xiàng)操作的結(jié)果。3.第三拍,運(yùn)算結(jié)果寄存器把ADC的結(jié)果及該操作的Qid送到結(jié)果總線上。操作隊(duì)列的第0項(xiàng)接收ADC操作的結(jié)果并保存在Imm域,同時(shí)置ADC操作的狀態(tài)為等待結(jié)束。保留站根據(jù)偵聽總線的結(jié)果,接收ADC操作的結(jié)果同時(shí)置SUB操作的Qj為4(最高位為1表示數(shù)據(jù)已經(jīng)準(zhǔn)備號(hào)),Vj的結(jié)果可用。同時(shí),ADD操作被發(fā)射到保留站中并修改相應(yīng)的狀態(tài)。4.第四拍,ADC操作結(jié)束,把操作隊(duì)列第0項(xiàng)中Imm域的值寫回到由Dest域指定的寄存器(即Rl),由于R1寄存器的Valid和Qid域指示R1的最新值是操作隊(duì)列的第2項(xiàng)的結(jié)果,因此R1的Valid和Qid域不變。釋放操作隊(duì)列的第0項(xiàng)。SUB操作被執(zhí)行,并把結(jié)果打入運(yùn)算器末端的運(yùn)算結(jié)果寄存器。5.第五拍,運(yùn)算結(jié)果寄存器把SUB的結(jié)果及該操作的Qid送到結(jié)果總線上。操作隊(duì)列的第1項(xiàng)接收SUB操作的結(jié)果并保存在Imm域,同時(shí)置SUB操作的狀態(tài)為等待結(jié)束。保留站根據(jù)偵聽總線的結(jié)果,接收SUB操作的結(jié)果同時(shí)置ADD操作的Qj為4(最高位為1表示數(shù)據(jù)已經(jīng)準(zhǔn)備號(hào)),Vj的結(jié)果可用。6.第六拍,SUB操作結(jié)束,把操作隊(duì)列第1項(xiàng)中Imm域的值寫回到由Dest域指定的寄存器(即Rl),由于R1寄存器的Valid和Qid域指示R1的最新值是操作隊(duì)列的第2項(xiàng)的結(jié)果,因此R1的Valid和Qid域不變。釋放操作隊(duì)列的第1項(xiàng)。ADD操作被執(zhí)行,并把結(jié)果打入運(yùn)算器末端的運(yùn)算結(jié)果寄存器。7.第七拍,運(yùn)算結(jié)果寄存器把ADD的結(jié)果及該操作的Qid送到結(jié)果總線上。操作隊(duì)列的第2項(xiàng)接收ADD操作的結(jié)果并保存在Imm域,同時(shí)置ADD操作的狀態(tài)為等待結(jié)束。8.第八拍,ADD操作結(jié)束,把操作隊(duì)列第2項(xiàng)中Imm域的值寫回到由Dest域指定的寄存器(即Rl),由于R1寄存器的Valid和Qid域指示R1的最新值是操作隊(duì)列的第2項(xiàng)的結(jié)果,因此置R1的Valid域?yàn)?,表示R1的值有效。釋放操作隊(duì)列的第2項(xiàng)。在上述過(guò)程中,由于運(yùn)算部件的延遲為2個(gè)時(shí)鐘周期,SUB和ADD操作都需要等待。如果運(yùn)算器流水線延遲為一拍,即數(shù)據(jù)在保留站中準(zhǔn)備好開始運(yùn)算后的同一拍結(jié)果就出現(xiàn)在結(jié)果總線上,則這三條指令只要5拍就能完成。圖4給出了執(zhí)行過(guò)程。1.第一拍,操作隊(duì)列向保留站發(fā)出ADC操作,該指令寫R1寄存器。由于所有的源操作數(shù)都已經(jīng)準(zhǔn)備好,保留站中的Qj,Qk域?yàn)?,Vj,Vk域可用,Qid域?yàn)?,表示運(yùn)算結(jié)束后把結(jié)果寫回到操作隊(duì)列的第0項(xiàng)。修改操作隊(duì)列中第0項(xiàng)的狀態(tài)為操作已經(jīng)發(fā)出但結(jié)果未寫回。置R1寄存器的Valid域?yàn)?,Qid域?yàn)?,表示R1寄存器的值無(wú)效,最新值在操作隊(duì)列的第0項(xiàng)。2.第二拍,ADC操作被執(zhí)行,并把結(jié)果以及該操作的Qid送到結(jié)果總線上。操作隊(duì)列的第0項(xiàng)接收ADC操作的結(jié)果并保存在Imm域,同時(shí)置ADC操作的狀態(tài)為等待結(jié)束。操作隊(duì)列向保留站發(fā)出SUB操作,與第一拍類似,修改相應(yīng)狀態(tài)。保留站接收操作隊(duì)列發(fā)出的SUB操作時(shí),同時(shí)偵聽結(jié)果總線,接收源操作數(shù)的值,因此SUB操作的源操作數(shù)也都是可用的。3.第三拍,ADC操作結(jié)束,把操作隊(duì)列第0項(xiàng)中Imm域的值寫回到由Dest域指定的寄存器(即R1),釋放操作隊(duì)列的第0項(xiàng)。SUB操作被執(zhí)行,并把結(jié)果以及該操作的Qid送到結(jié)果總線上,操作隊(duì)列的第1項(xiàng)接收SUB操作的結(jié)果并保存在Imm域,同時(shí)置SUB操作的狀態(tài)為等待結(jié)束。ADD操作被發(fā)射到保留站中并修改相應(yīng)的狀態(tài),保留站接收操作隊(duì)列發(fā)出的ADD操作時(shí),同時(shí)偵聽結(jié)果總線,接收源操作數(shù)的值,因此ADD操作的源操作數(shù)也都是可用的。在這一拍中,ADC操作寫R1寄存器與ADD操作讀R1寄存器同時(shí)進(jìn)行,Valid及Qid域的值由ADD操作確定。4.第四拍,SUB操作結(jié)束,把操作隊(duì)列第1項(xiàng)中Imm域的值寫回到由Dest域指定的寄存器(即R1),由于R1寄存器的Valid和Qid域指示R1的最新值是操作隊(duì)列的第2項(xiàng)的結(jié)果,因此R1的Valid和Qid域不變。釋放操作隊(duì)列的第1項(xiàng)。ADD操作被執(zhí)行,并把結(jié)果以及該操作的Qid送到結(jié)果總線上,操作隊(duì)列的第2項(xiàng)接收ADD操作的結(jié)果并保存在Imm域,同時(shí)置ADD操作的狀態(tài)為等待結(jié)束。5.第五拍,ADD操作結(jié)束,把操作隊(duì)列第2項(xiàng)中Imm域的值寫回到由Dest域指定的寄存器(即R1),由于R1寄存器的Valid和Qid域指示R1的最新值是操作隊(duì)列的第2項(xiàng)的結(jié)果,因此置R1的Valid域?yàn)?,表示R1的值有效。釋放操作隊(duì)列的第2項(xiàng)。在上述流水線中,SUB操作在發(fā)射到保留站時(shí),ADC計(jì)算的R1的值并未寫回到寄存器或操作隊(duì)列,但已經(jīng)送到結(jié)果總線上。因此在SUB被發(fā)射的同時(shí),偵聽結(jié)果總線并接收結(jié)果總線上的值。ADC操作發(fā)射時(shí)也有類似情況。這種情況相當(dāng)于靜態(tài)流水線中的forwarding技術(shù)。權(quán)利要求1.一種基于操作隊(duì)列復(fù)用的指令流水線系統(tǒng),包括取指部件,用于取出指令;譯碼部件,對(duì)取出的指令進(jìn)行譯碼,并按指令在程序中出現(xiàn)的先后次序把譯碼后的指令(稱為操作)送到操作隊(duì)列;操作隊(duì)列,按次序根據(jù)操作的類型把操作發(fā)射到相應(yīng)的保留站,并按次序結(jié)束運(yùn)算結(jié)果已經(jīng)寫回的指令;保留站,對(duì)發(fā)射來(lái)的操作進(jìn)行運(yùn)算,把運(yùn)算結(jié)果送回到結(jié)果總線并寫回到操作隊(duì)列;寄存器,在結(jié)束指令時(shí),接收由操作隊(duì)列依照指令進(jìn)出操作隊(duì)列的次序。2.按權(quán)利要求1所述的系統(tǒng),其特征在于所述結(jié)果總線至少為兩條。3.按權(quán)利要求1所述的系統(tǒng),其特征在于所述的寄存器為通用寄存器和浮點(diǎn)寄存器。4.按權(quán)利要求1所述的系統(tǒng),其特征在于每一保留站對(duì)應(yīng)一功能計(jì)算部件。5.按權(quán)利要求1所述的系統(tǒng),其特征在于指令流水線主要數(shù)據(jù)通路包括指令寄存器的指令譯碼后送到操作隊(duì)列的譯碼總線;操作隊(duì)列中的操作經(jīng)寄存器重命名及讀取操作數(shù)后被發(fā)射到相應(yīng)的保留站的發(fā)射總線;運(yùn)算結(jié)果由結(jié)果總線送到保留站以及操作隊(duì)列的結(jié)果總線;以及操作隊(duì)列中的操作被結(jié)束時(shí)把運(yùn)算結(jié)果送到通用寄存器及浮點(diǎn)寄存器的結(jié)束總線。6.一種基于操作隊(duì)列復(fù)用的指令流水線方法,包括步驟指令譯碼部件按指令在程序中出現(xiàn)的先后次序把譯碼后的指令(譯碼后的指令稱為操作)送到操作隊(duì)列;操作隊(duì)列根據(jù)操作的類型按次序把操作發(fā)射到與各功能部件相應(yīng)的保留站;并按次序結(jié)束運(yùn)算結(jié)果已經(jīng)寫回的指令;保留站中的操作經(jīng)運(yùn)算后,把結(jié)果送回到結(jié)果總線并寫回到操作隊(duì)列;并由操作隊(duì)列依照指令進(jìn)出操作隊(duì)列的次序在結(jié)束指令時(shí)送回到寄存器。7.按權(quán)利要求6所述的方法,其特征在于當(dāng)運(yùn)算部件把結(jié)果寫回到操作隊(duì)列時(shí),不用專門的寄存器域來(lái)保存寫回的結(jié)果,而是重用操作隊(duì)列中的有關(guān)域。8.按權(quán)利要求6所述的方法,其特征在于重用每個(gè)操作的立即數(shù)域。9.按權(quán)利要求6所述的方法,其特征在于基于操作隊(duì)列復(fù)用的指令流水線分成取指、譯碼、發(fā)射、執(zhí)行并寫回、完成等階段。10.按權(quán)利要求9所述的方法,其特征在于執(zhí)行階段需要多拍,執(zhí)行和寫回對(duì)普通運(yùn)算合并成為一拍。全文摘要一種基于操作隊(duì)列復(fù)用的指令流水線系統(tǒng),包括取指部件,用于取出指令;譯碼部件,對(duì)取出的指令進(jìn)行譯碼,并按指令在程序中出現(xiàn)的先后次序把譯碼后的指令(稱為操作)送到操作隊(duì)列;操作隊(duì)列,按次序根據(jù)操作的類型把操作發(fā)射到相應(yīng)的保留站,并按次序結(jié)束運(yùn)算結(jié)果已經(jīng)寫回的指令;保留站,對(duì)發(fā)射來(lái)的操作進(jìn)行運(yùn)算,把運(yùn)算結(jié)果送回到結(jié)果總線并寫回到操作隊(duì)列;寄存器,在結(jié)束指令時(shí),接收由操作隊(duì)列依照指令進(jìn)出操作隊(duì)列的次序。本發(fā)明通過(guò)操作隊(duì)列的復(fù)用實(shí)現(xiàn)指令的動(dòng)態(tài)調(diào)度,減少控制邏輯,從而提高流水線效率,進(jìn)而提高微處理器的性能。文檔編號(hào)G06F9/38GK1410885SQ0114149公開日2003年4月16日申請(qǐng)日期2001年9月27日優(yōu)先權(quán)日2001年9月27日發(fā)明者胡偉武,唐志敏,馮雷申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所