專利名稱:雙棧返回地址預(yù)測器中返回地址棧的恢復(fù)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及微處理器設(shè)計中雙棧返回地址預(yù)測器中返回地址棧RAS_PRED的恢復(fù)方法,尤其是在對返回地址棧RAS_EXE進(jìn)行修改的同一個時鐘周期恢復(fù)返回地址棧RAS_PRED的方法。
背景技術(shù):
在采用雙棧返回地址預(yù)測器的微處理器中,發(fā)生分支誤預(yù)測時,使用RAS_EXE恢復(fù)RAS_PRED,即把RAS_EXE中各項的數(shù)據(jù)寫到RAS_PRED的相應(yīng)項中,對返回指令目標(biāo)地址的預(yù)測精度非常高,硬件實現(xiàn)也很簡單。但是恢復(fù)過程可能存在這樣的問題,即發(fā)生分支誤預(yù)測的指令是跳轉(zhuǎn)的調(diào)用指令或跳轉(zhuǎn)的返回指令,這時既要修改RAS_EXE,又要恢復(fù)RAS_PRED。為了能夠使用RAS_EXE中的最新數(shù)據(jù)恢復(fù)RAS_PRED,普遍的做法是在修改RAS_EXE的下一個時鐘周期發(fā)出信號提示需要恢復(fù)RAS_PRED。這種做法雖然可以保證RAS_PRED獲得RAS_EXE中的最新數(shù)據(jù),實現(xiàn)正確的返回地址棧恢復(fù),但是RAS_PRED要遲一個時鐘周期才能獲得RAS_EXE中的最新數(shù)據(jù),使得數(shù)據(jù)的恢復(fù)不及時;此外還必須在修改RAS_EXE的下一個時鐘周期發(fā)出信號提示恢復(fù)RAS_PRED,從而增加了實現(xiàn)的復(fù)雜度。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是在修改RAS_EXE的同一個時鐘周期實現(xiàn)對RAS_PRED的恢復(fù),保證RAS_PRED及時獲得最新數(shù)據(jù),進(jìn)行恢復(fù)操作時不需要信號提示,降低實現(xiàn)的復(fù)雜度。
本發(fā)明的技術(shù)方案是本發(fā)明的主要邏輯結(jié)構(gòu)是對RAS_PRED進(jìn)行寫操作的寫模塊。為了便于區(qū)分,本發(fā)明把對RAS_PRED進(jìn)行寫操作的寫模塊叫做寫模塊2,把對RAS_EXE進(jìn)行寫操作的寫模塊叫做寫模塊1。由于使用RAS_EXE恢復(fù)RAS_PRED就是把RAS_EXE中各項的數(shù)據(jù)寫到RAS_PRED的相應(yīng)項中,因此對RAS_PRED的寫操作包括使用RAS_EXE恢復(fù)RAS_PRED。
本發(fā)明涉及到如下信號TOS_PREDRAS_PRED的棧頂指針。如果TOS_PRED為i,表明RAS_PRED的當(dāng)前棧頂是它的第i+1項。
TOS_EXERAS_EXE的棧頂指針。如果TOS_EXE為i,表明RAS_EXE的當(dāng)前棧頂是它的第i+1項。
分支預(yù)測信息包括分支類型以及預(yù)測得到的分支方向。
實際執(zhí)行信息包括分支類型以及實際得到的分支方向。
返回地址2處在分支預(yù)測階段的調(diào)用指令的返回地址,即處在分支預(yù)測階段的調(diào)用指令的下一條指令地址。
返回地址1處在分支執(zhí)行階段的調(diào)用指令的返回地址,即處在分支執(zhí)行階段的調(diào)用指令的下一條指令地址。
本發(fā)明的總體邏輯結(jié)構(gòu)包括RAS_PRED、RAS_EXE、寫模塊1和寫模塊2。RAS_PRED和RAS_EXE是兩個返回地址棧,各包含n個入口項,設(shè)計時可以根據(jù)需要調(diào)整n的大小。寫模塊1完成RAS_EXE的寫操作,寫模塊2完成RAS_PRED的寫操作。用于修改RAS_EXE的信號包括TOS_EXE、返回地址1和實際執(zhí)行信息,它們既連到寫模塊1上,也連到寫模塊2上;TOS_PRED、返回地址2和分支預(yù)測信息只連到寫模塊2上。
如果未發(fā)生分支誤預(yù)測,寫模塊2根據(jù)TOS_PRED和分支預(yù)測信息修改RAS_PRED,寫模塊1根據(jù)TOS_EXE和實際執(zhí)行信息修改RAS_EXE;如果發(fā)生了分支誤預(yù)測,且是跳轉(zhuǎn)的調(diào)用指令發(fā)生了分支誤預(yù)測,這時既要修改RAS_EXE又要恢復(fù)RAS_PRED,由于用于修改RAS_EXE的數(shù)據(jù)既送給了寫模塊1也送給了寫模塊2,所以寫模塊1根據(jù)TOS_EXE和實際執(zhí)行信息修改RAS_EXE,寫模塊2根據(jù)TOS_EXE和實際執(zhí)行信息對RAS_PRED進(jìn)行恢復(fù)。這樣,在同一個時鐘周期既修改了RAS_EXE,又使用最新的數(shù)據(jù)恢復(fù)了RAS_PRED。
本發(fā)明由寫模塊2完成RAS_PRED的寫操作。為了描述清楚,這里只給出對RAS_PRED中一項的寫操作,對其他項的寫操作都是相同的。假定對RAS_PRED中的i+1項進(jìn)行寫操作,因此來自RAS_PRED的數(shù)據(jù)是RAS_PRED第i+1項中的數(shù)據(jù),且連到2選1開關(guān)1的A端,來自RAS_EXE的數(shù)據(jù)是RAS_EXE第i+1項中的數(shù)據(jù),且連到2選1開關(guān)2的C端。開關(guān)1的B端接的是返回地址2,輸出連到2選1開關(guān)開關(guān)3的E端。開關(guān)2的D端接的是返回地址1,輸出連到開關(guān)3的F端。
如果TOS_PRED為i,同時分支預(yù)測信息提示檢測到調(diào)用指令并且預(yù)測其發(fā)生跳轉(zhuǎn),那么開關(guān)1把B端的數(shù)據(jù)作為輸出,否則輸出A端的數(shù)據(jù)。
如果TOS_EXE為i并且實際執(zhí)行信息提示檢測到發(fā)生跳轉(zhuǎn)的調(diào)用指令,那么開關(guān)2把D端的數(shù)據(jù)作為輸出,否則輸出C端的數(shù)據(jù)。
如果發(fā)生了分支誤預(yù)測,開關(guān)3把F端的數(shù)據(jù)作為輸出,否則輸出E端的數(shù)據(jù)。開關(guān)3的輸出是新的將要被寫入RAS_PRED第i+1項中的數(shù)據(jù)。
本發(fā)明由寫模塊1完成RAS_EXE的寫操作,為了描述清楚,這時同樣只給出對RAS_EXE中一項的寫操作,對其他項的寫操作都是相同的。假定對RAS_EXE中的第i+1項進(jìn)行寫操作,因此來自RAS_EXE的數(shù)據(jù)是RAS_EXE第i+1項中的數(shù)據(jù),且連到2選1開關(guān)4的G端。返回地址1連到開關(guān)4的H端。如果TOS_EXE為i,且實際執(zhí)行信息指示檢測到發(fā)生跳轉(zhuǎn)的調(diào)用指令,那么開關(guān)4把H端的數(shù)據(jù)作為輸出,否則輸出G端的數(shù)據(jù)。開關(guān)4的輸出是新的將要被寫入RAS_EXE第i+1項中的數(shù)據(jù)。
若用n代表RAS_PRED和RAS_EXE所擁有的入口項數(shù),RAS_PRED[i]表示RAS_PRED第i+1項中的數(shù)據(jù),本發(fā)明用寫模塊2恢復(fù)RAS_PRED的流程是如果發(fā)生了分支誤預(yù)測,則查看實際執(zhí)行信息,如果檢測到發(fā)生誤預(yù)測的分支指令是跳轉(zhuǎn)的調(diào)用指令,則把返回地址1寫入RAS_PRED的第TOS_EXE+1項中,RAS_PRED的其他入口中的數(shù)據(jù)由RAS_EXE中相應(yīng)項的數(shù)據(jù)恢復(fù);如果發(fā)生了分支誤預(yù)測,但發(fā)生誤預(yù)測的分支指令不是跳轉(zhuǎn)的調(diào)用指令,則RAS_PRED所有入口中的數(shù)據(jù)都由RAS_EXE中相應(yīng)項的數(shù)據(jù)恢復(fù);如果沒有發(fā)生分支誤預(yù)測,則查看分支預(yù)測信息,如果檢測到調(diào)用指令并且預(yù)測其發(fā)生跳轉(zhuǎn),則把返回地址2寫入RAS_PRED的第TOS_PRED+1項中,RAS_PRED的其他入口中的數(shù)據(jù)保持不變;如果沒有發(fā)生分支誤預(yù)測,并且分支預(yù)測信息指示檢測到的不是調(diào)用指令或者檢測到調(diào)用指令但預(yù)測其不發(fā)生跳轉(zhuǎn),則RAS_PRED所有入口中的數(shù)據(jù)都保持不變。
采用本發(fā)明可以達(dá)到以下技術(shù)效果1)及時、準(zhǔn)確恢復(fù)RAS_PRED。由于用于修改RAS_EXE的數(shù)據(jù)送給寫模塊1的同時也送給了寫模塊2,所以可以在同一個時鐘周期完成RAS_EXE的修改和RAS_PRED的恢復(fù),且RAS_PRED中的數(shù)據(jù)和RAS_EXE中的數(shù)據(jù)是完全相同的。
2)RAS_PRED的恢復(fù)和RAS_EXE的修改在同一個時鐘周期內(nèi)進(jìn)行,不需要在下一個時鐘周期發(fā)出提示信號,降低了實現(xiàn)的復(fù)雜度。
圖1本發(fā)明總體邏輯結(jié)構(gòu)圖。
圖2本發(fā)明寫模塊2的內(nèi)部實現(xiàn)圖。
圖3本發(fā)明寫模塊1的內(nèi)部實現(xiàn)圖。
圖4本發(fā)明用寫模塊2恢復(fù)RAS_PRED的流程圖。
具體實施例方式如圖1,本發(fā)明的總體邏輯結(jié)構(gòu)包括RAS_PRED、RAS_EXE、寫模塊1和寫模塊2。RAS_PRED和RAS_EXE是兩個返回地址棧,分別由n個寄存器組成,n是RAS_PRED和RAS_EXE的入口項數(shù),設(shè)計時可以根據(jù)需要調(diào)整n的大小。在國防科技大學(xué)研制的YHFT64高性能通用CPU芯片設(shè)計中,n等于8。寫模塊1完成RAS_EXE的寫操作,寫模塊2完成RAS_PRED的寫操作。TOS_EXE、返回地址1和實際執(zhí)行信息既連到寫模塊1上,也連到寫模塊2上;TOS_PRED、返回地址2和分支預(yù)測信息只連到寫模塊2上。
如果未發(fā)生分支誤預(yù)測,寫模塊2根據(jù)TOS_PRED和分支預(yù)測信息修改RAS_PRED,寫模塊1根據(jù)TOS_EXE和實際執(zhí)行信息修改RAS_EXE;如果發(fā)生了分支誤預(yù)測,寫模塊2根據(jù)TOS_EXE和實際執(zhí)行信息恢復(fù)RAS_PRED,寫模塊1根據(jù)TOS_EXE和實際執(zhí)行信息修改RAS_EXE。
圖2是寫模塊2的內(nèi)部實現(xiàn)圖。寫模塊2完成RAS_PRED的寫操作。為了描述清楚,圖2只給出了對其中一項的寫操作,對其他項的寫操作都是相同的。假定對RAS_PRED中的i+1項進(jìn)行寫操作,因此圖2中的來自RAS_PRED的數(shù)據(jù)是RAS_PRED第i+1項中的數(shù)據(jù),且連到2選1開關(guān)1的A端,來自RAS_EXE的數(shù)據(jù)是RAS_EXE第i+1項中的數(shù)據(jù),且連到2選1開關(guān)2的C端。開關(guān)1的B端接的是返回地址2,輸出連到開關(guān)3的E端。開關(guān)2的D端接的是返回地址1,輸出連到開關(guān)3的F端。
如果TOS_PRED為i,同時分支預(yù)測信息提示檢測到調(diào)用指令并且預(yù)測其發(fā)生跳轉(zhuǎn),那么開關(guān)1把B端的數(shù)據(jù)作為輸出,否則輸出A端的數(shù)據(jù)。
如果TOS_EXE為i并且實際執(zhí)行信息提示檢測到發(fā)生跳轉(zhuǎn)的調(diào)用指令,那么開關(guān)2把D端的數(shù)據(jù)作為輸出,否則輸出C端的數(shù)據(jù)的數(shù)據(jù)。
如果發(fā)生了分支誤預(yù)測,開關(guān)3把F端的數(shù)據(jù)作為輸出,否則輸出E端的數(shù)據(jù)。開關(guān)3的輸出是新的將要被寫入RAS_PRED第i+1項中的數(shù)據(jù)。
圖3是寫模塊1的內(nèi)部實現(xiàn)圖。寫模塊1完成RAS_EXE的寫操作,為了描述清楚,圖3同樣也只給出了對其中一項的寫操作。仍然假定對RAS_EXE中的第i+1項進(jìn)行寫操作,因此圖3中的來自RAS_EXE的數(shù)據(jù)是RAS_EXE第i+1項中的數(shù)據(jù),且連到2選1開關(guān)4的G端。返回地址1連到開關(guān)4的H端。如果TOS_EXE為i,且實際執(zhí)行信息指示檢測到發(fā)生跳轉(zhuǎn)的調(diào)用指令,那么開關(guān)4把H端的數(shù)據(jù)作為輸出,否則輸出G端的數(shù)據(jù)。開關(guān)4的輸出是新的將要被寫入RAS_EXE第i+1項中的數(shù)據(jù)。
圖4是本發(fā)明用寫模塊2恢復(fù)RAS_PRED的流程圖。其中n代表RAS_PRED和RAS_EXE所擁有的入口項數(shù)。RAS_PRED[i]表示RAS_PRED第i+1項中的數(shù)據(jù)。如果發(fā)生了分支誤預(yù)測,那么接下來查看實際執(zhí)行信息,如果檢測到發(fā)生誤預(yù)測的分支指令是是跳轉(zhuǎn)的調(diào)用指令,那么把返回地址1寫入RAS_PRED的第TOS_EXE+1項中,RAS_PRED的其他入口中的數(shù)據(jù)由RAS_EXE中相應(yīng)項的數(shù)據(jù)恢復(fù);如果發(fā)生了分支誤預(yù)測,但發(fā)生誤預(yù)測的分支指令不是跳轉(zhuǎn)的調(diào)用指令,那么RAS_PRED所有入口中的數(shù)據(jù)都由RAS_EXE中相應(yīng)項的數(shù)據(jù)恢復(fù)。如果沒有發(fā)生分支誤預(yù)測,那么查看分支預(yù)測信息,如果檢測到調(diào)用指令并且預(yù)測其發(fā)生跳轉(zhuǎn),則把返回地址2寫入RAS_PRED的第TOS_PRED+1項中,RAS_PRED的其他入口中的數(shù)據(jù)保持不變;如果沒有發(fā)生分支誤預(yù)測,并且分支預(yù)測信息指示檢測到的不是調(diào)用指令或者檢測到調(diào)用指令但預(yù)測其不發(fā)生跳轉(zhuǎn),則RAS_PRED所有入口中的數(shù)據(jù)都保持不變。
權(quán)利要求
1.一種雙棧返回地址預(yù)測器中返回地址棧的恢復(fù)方法,使用RAS_EXE恢復(fù)RAS_PRED,即把RAS_EXE中各項的數(shù)據(jù)寫到RAS_PRED的相應(yīng)項中,其總體邏輯結(jié)構(gòu)包括RAS_PRED、RAS_EXE和寫模塊1,寫模塊1完成RAS_EXE的寫操作;采用的信號有TOS_PRED、TOS_EXE、分支預(yù)測信息、實際執(zhí)行信息、返回地址2即處在分支預(yù)測階段的調(diào)用指令的返回地址和返回地址1即處在分支執(zhí)行階段的調(diào)用指令的返回地址;其特征在于它的總體邏輯結(jié)構(gòu)還包括寫模塊2,寫模塊2完成RAS_PRED的寫操作;用于修改RAS_EXE的信號包括TOS_EXE、返回地址1和實際執(zhí)行信息,它們既連到寫模塊1上,也連到寫模塊2上;TOS_PRED、返回地址2和分支預(yù)測信息只連到寫模塊2上;在寫模塊1修改RAS_EXE的同一個時鐘周期寫模塊2完成對RAS_PRED的恢復(fù)操作,保證RAS_PRED及時獲得最新數(shù)據(jù);用寫模塊2恢復(fù)RAS_PRED的流程是如果發(fā)生了分支誤預(yù)測,則查看實際執(zhí)行信息,如果檢測到發(fā)生誤預(yù)測的分支指令是跳轉(zhuǎn)的調(diào)用指令,則把返回地址1寫入RAS_PRED的第TOS_EXE+1項中,RAS_PRED的其他入口中的數(shù)據(jù)由RAS_EXE中相應(yīng)項的數(shù)據(jù)恢復(fù);如果發(fā)生了分支誤預(yù)測,但發(fā)生誤預(yù)測的分支指令不是跳轉(zhuǎn)的調(diào)用指令,則RAS_PRED所有入口中的數(shù)據(jù)都由RAS_EXE中相應(yīng)項的數(shù)據(jù)恢復(fù);如果沒有發(fā)生分支誤預(yù)測,則查看分支預(yù)測信息,如果檢測到調(diào)用指令并且預(yù)測其發(fā)生跳轉(zhuǎn),則把返回地址2寫入RAS_PRED的第TOS_PRED+1項中,RAS_PRED的其他入口中的數(shù)據(jù)保持不變;如果沒有發(fā)生分支誤預(yù)測,并且分支預(yù)測信息指示檢測到的不是調(diào)用指令或者檢測到調(diào)用指令但預(yù)測其不發(fā)生跳轉(zhuǎn),則RAS_PRED所有入口中的數(shù)據(jù)都保持不變。
2.如權(quán)利要求1所述的雙棧返回地址預(yù)測器中返回地址棧的恢復(fù)方法,其特征在于所述寫模塊2對RAS_PRED中第i+1項進(jìn)行寫操作時,來自RAS_PRED的數(shù)據(jù)是RAS_PRED第i+1項中的數(shù)據(jù),且連到2選1開關(guān)(1)的A端,來自RAS_EXE的數(shù)據(jù)是RAS_EXE第i+1項中的數(shù)據(jù),且連到2選1開關(guān)(2)的C端;開關(guān)(1)的B端接的是返回地址2,輸出連到開關(guān)(3)的E端;開關(guān)(2)的D端接的是返回地址1,輸出連到開關(guān)(3)的F端;如果TOS_PRED為i,同時分支預(yù)測信息提示檢測到調(diào)用指令并且預(yù)測其發(fā)生跳轉(zhuǎn),則開關(guān)(1)把B端的數(shù)據(jù)作為輸出,否則輸出A端的數(shù)據(jù);如果TOS_EXE為i并且實際執(zhí)行信息提示檢測到發(fā)生跳轉(zhuǎn)的調(diào)用指令,則開關(guān)(2)把D端的數(shù)據(jù)作為輸出,否則輸出C端的數(shù)據(jù)的數(shù)據(jù);如果發(fā)生了分支誤預(yù)測,開關(guān)(3)把F端的數(shù)據(jù)作為輸出,否則輸出E端的數(shù)據(jù);開關(guān)(3)的輸出是新的將要被寫入RAS_PRED第i+1項中的數(shù)據(jù)。
全文摘要
本發(fā)明公開了一種雙棧返回地址預(yù)測器中返回地址棧的恢復(fù)方法,要解決的技術(shù)問題是在修改RAS_EXE的同一個時鐘周期實現(xiàn)對RAS_PRED的恢復(fù),保證RAS_PRED及時獲得最新數(shù)據(jù)。本發(fā)明的總體邏輯結(jié)構(gòu)包括RAS_PRED、RAS_EXE、寫模塊1和寫模塊2。RAS_PRED和RAS_EXE是兩個返回地址棧,由寫模塊1完成RAS_EXE的寫操作,寫模塊2完成RAS_PRED的寫操作。采用本發(fā)明能及時、準(zhǔn)確地恢復(fù)RAS_PRED,且RAS_PRED的恢復(fù)和RAS_EXE的修改在同一個時鐘周期內(nèi)進(jìn)行,不需要在下一個時鐘周期發(fā)出提示信號,降低了實現(xiàn)的復(fù)雜度。
文檔編號G06F9/38GK1560735SQ20041002296
公開日2005年1月5日 申請日期2004年3月9日 優(yōu)先權(quán)日2004年3月9日
發(fā)明者邢座程, 孫彩霞, 張民選, 蔣江, 李勇, 曾獻(xiàn)君, 鄧讓鈺, 馬卓, 張 杰, 歐國東, 張承義, 馬馳遠(yuǎn), 李晉文, 陳海燕, 陽柳 申請人:中國人民解放軍國防科學(xué)技術(shù)大學(xué)