適用于RISC CPU的轉移指令的原理及仿真研究
本文介紹的RISC CPU對轉移指令的處理方法,為5級流水線(xiàn)作業(yè),分別是取指、譯碼、執行、訪(fǎng)存、回寫(xiě),對轉移指令的處理在取指級和譯碼級完成;譯碼級給出轉移指令所包含的詳細信息,取指級包含有地址計算單元,轉移目標Cache (BTC),跳轉判斷單元等。對轉移指令的處理使用了延時(shí)跳轉、2BC以及BTC方法。
本文引用地址:http://dyxdggzs.com/article/201612/328600.htm1 轉移指令的原理
該RISC CPU的指令集中包含有條件轉移指令和非條件轉移指令。所有的轉移指令均使用延時(shí)轉移,每條轉移指令后面跟隨一條延時(shí)槽指令;采用2BC預測條件轉移是否跳轉,而B(niǎo)TC則保存轉移目標為固定地址的轉移指令執行后的信息。以下分別介紹在該RISC CPU設計中轉移指令的設計以及延時(shí)轉移、BTC、2BC的具體實(shí)現方法。
2 轉移指令類(lèi)型及格式
該RISC CPU的指令集中包含條件轉移指令(BCC)和非條件轉移指令(CALL和RET),其編碼格式為圖1所示。CALL指令包含2位的操作碼和30位的絕對地址。BCC指令包含8位操作碼, 4位條件碼(Condition Code),19位偏移量以及1位用來(lái)區分指令是否帶A參數(即ANNUL操作)。所有的BCC指令使用相同的操作碼,不同的BCC指令用條件碼來(lái)區分,共有16類(lèi)BCC指令;偏移量為帶符號數,在低位用00擴展后可以對±220的相對地址尋址。RET指令包含8位的操作碼和兩個(gè)5位的寄存器地址。
3 2BC的作用及工作原理
因為轉移指令執行一次之后,轉移目標地址、延時(shí)槽指令都保存在BTC中了,當該指令再次執行時(shí),這些信息就直接從Cache讀出,因此在取指級就可以得到跳轉目標地址和延時(shí)槽指令。對于非條件轉移指令,跳轉總是執行,因此BTC命中時(shí)就可以直接決定下一條指令的地址為轉移目標地址,而當前周期DI被送到指令總線(xiàn)上;但對于條件轉移指令,跳轉與否是根據條件碼和ALU的標志位來(lái)決定的。如果轉移指令前面一條指令的執行結果改變標志位,而當BTC命中時(shí)該指令還在譯碼級,則跳轉與否需要等待一個(gè)時(shí)鐘周期才能決定。為了避免因為等待而造成流水線(xiàn)的停頓,采用2BC當前的狀態(tài)預測跳轉是否執行,在接下來(lái)的時(shí)鐘周期,標志位有效之后,再檢查預測是否正確,如果不正確,就進(jìn)行更正。當預測準確時(shí),采用2BC 與BTC可以使轉移指令的執行時(shí)間縮短一個(gè)周期。即使預測不準確,與不采用預測相比也不會(huì )有損失。2BC的工作原理如圖2所示,初始值為Nx(第一次不跳轉執行)或Tx(第一次跳轉執行),t表示跳轉執行,n表示跳轉不執行。當HI為N或Nx時(shí),預測跳轉不發(fā)生;當HI為T(mén)或Tx時(shí),預測跳轉發(fā)生。
4 BTC命中
在取指周期開(kāi)始時(shí)如果發(fā)現當前取指地址包含在BTC的TAG中,并且對應行的VI也有效,則認為BTC命中,從而啟動(dòng)命中任務(wù):讀出命中行的數據,把DI送到指令總線(xiàn),如果是CALL指令,轉移目標地址作為下一條指令的地址;如果是BCC指令則需要判斷跳轉是否發(fā)生:當標志位有效時(shí),根據條件碼與標志位判斷,否則根據HI進(jìn)行預測,然后確定下一條指令的地址:跳轉時(shí)為轉移目標地址,不跳轉為PC+2。對于帶A參數的BCC指令,在跳轉不執行時(shí),要禁止DI在下一時(shí)鐘進(jìn)入譯碼級。BTC命中的流程如圖3。
5 BTC檢查
如果前一周期BTC命中,則在當前周期開(kāi)始時(shí)啟動(dòng)BTC檢查任務(wù);如果前一周期BTC是根據HI預測BCC的跳轉,那么在當前時(shí)鐘標志位有效后,要重新判斷跳轉決定是否正確,如果不正確就要進(jìn)行更正,給出正確的取指地址,請求在下一時(shí)鐘禁止譯碼級或執行級。同時(shí)還要根據最終的跳轉情況和HI的更新算法更新HI。BTC檢查的流程圖如圖4。
6 結論
整個(gè)RISC CPU用Verilog HDL語(yǔ)言進(jìn)行了描述,并針對標準程序進(jìn)行了仿真,仿真結果表明,采用上述方法處理轉移指令可以明顯提高流水線(xiàn)的吞吐率。由于在轉移指令后面插入了延時(shí)槽指令,轉移指令的執行與程序順序執行時(shí)完全相同;BTC的使用雖然在硬件上增加了一些開(kāi)銷(xiāo),但使轉移指令再次執行時(shí)基本不占用流水線(xiàn)資源,大大提高了CPU的效率。
評論