適用于RISC CPU的轉(zhuǎn)移指令的原理及仿真
在RISC CPU的設(shè)計當中,轉(zhuǎn)移指令的處理對處理器的性能的影響非常關(guān)鍵。轉(zhuǎn)移指令決定著程序的執(zhí)行順序,在程序中的使用頻率很高。RISC CPU中程序是以流水線的方式執(zhí)行的,當程序順序執(zhí)行時,下一條指令的地址與前一條指令的內(nèi)容無關(guān) ;而在執(zhí)行轉(zhuǎn)移指令時要根據(jù)轉(zhuǎn)移指令的執(zhí)行結(jié)果來確定下一條指令的地址,也就是說下一條指令的地址在轉(zhuǎn)移指令執(zhí)行之前是未知的,造成流水線的不連貫,影響了CPU的效率。
轉(zhuǎn)移指令處理的方法很多,可分為預(yù)測法和非預(yù)測法,預(yù)測法又包含靜態(tài)預(yù)測和動態(tài)預(yù)測,靜態(tài)預(yù)測如總預(yù)測跳轉(zhuǎn)、正向不跳轉(zhuǎn)反向跳轉(zhuǎn),動態(tài)預(yù)測如2比特計數(shù)器(2BC) 、BTC;非預(yù)測法如延時跳轉(zhuǎn)等[1]。這些基本方法合理組合之后可以得到很好的效果。
本文介紹的RISC CPU對轉(zhuǎn)移指令的處理方法,為5級流水線作業(yè),分別是取指、譯碼、執(zhí)行、訪存、回寫,對轉(zhuǎn)移指令的處理在取指級和譯碼級完成;譯碼級給出轉(zhuǎn)移指令所包含的詳細信息,取指級包含有地址計算單元,轉(zhuǎn)移目標Cache (BTC),跳轉(zhuǎn)判斷單元等。對轉(zhuǎn)移指令的處理使用了延時跳轉(zhuǎn)、2BC以及BTC方法。
2 轉(zhuǎn)移指令的原理
該RISC CPU的指令集中包含有條件轉(zhuǎn)移指令和非條件轉(zhuǎn)移指令。所有的轉(zhuǎn)移指令均使用延時轉(zhuǎn)移,每條轉(zhuǎn)移指令后面跟隨一條延時槽指令;采用2BC預(yù)測條件轉(zhuǎn)移是否跳轉(zhuǎn),而BTC則保存轉(zhuǎn)移目標為固定地址的轉(zhuǎn)移指令執(zhí)行后的信息。以下分別介紹在該RISC CPU設(shè)計中轉(zhuǎn)移指令的設(shè)計以及延時轉(zhuǎn)移、BTC、2BC的具體實現(xiàn)方法。
2.1 轉(zhuǎn)移指令類型及格式
該RISC CPU的指令集中包含條件轉(zhuǎn)移指令(BCC)和非條件轉(zhuǎn)移指令(CALL和RET),其編碼格式為圖1所示。CALL指令包含2位的操作碼和30位的絕對地址。BCC指令包含8位操作碼, 4位條件碼(Condition Code),19位偏移量以及1位用來區(qū)分指令是否帶A參數(shù)(即ANNUL操作)。所有的BCC指令使用相同的操作碼,不同的BCC指令用條件碼來區(qū)分,共有16類BCC指令;偏移量為帶符號數(shù),在低位用00擴展后可以對±220的相對地址尋址。RET指令包含8位的操作碼和兩個5位的寄存器地址。
本文引用地址:http://www.ex-cimer.com/article/201612/324824.htm |
2.2 延時轉(zhuǎn)移
在該RISC CPU中,由于轉(zhuǎn)移指令只有在譯碼級才被識別,跳轉(zhuǎn)與否在譯碼級才能決定,因此在取下一條指令之前必須等待一個時鐘周期。為了減少流水線中的氣泡,緊跟轉(zhuǎn)移指令后面插一條與跳轉(zhuǎn)不相關(guān)的指令,即延時槽指令,不管跳轉(zhuǎn)是否發(fā)生,該指令都執(zhí)行。延時槽指令的插入由編譯器完成,當編譯器找不出這樣的指令時,就插一條NOP指令??紤]到減輕編譯器的難度,我們也采用了帶 A參數(shù)的轉(zhuǎn)移:當指令帶有A參數(shù)時,延時槽指令從轉(zhuǎn)移目標程序中取出,因此轉(zhuǎn)移發(fā)生時,延時槽指令執(zhí)行,而轉(zhuǎn)移不發(fā)生時,則禁止延時槽指令進入譯碼級。因一般而言非條件轉(zhuǎn)移指令出現(xiàn)的頻率遠低于條件轉(zhuǎn)移指令出現(xiàn)的頻率,非條件轉(zhuǎn)移指令的延時槽指令相對來說容易找到,所以非條件轉(zhuǎn)移指令不采用A參數(shù)選項,而條件轉(zhuǎn)移指令采用A參數(shù)選項。
2.3 2BC與BTC的設(shè)計
2BC與BTC對提高轉(zhuǎn)移指令的執(zhí)行效率起重要的作用。在RISC CPU中,轉(zhuǎn)移指令執(zhí)行一次后,有很大的概率會執(zhí)行更多次。對于轉(zhuǎn)移目標為固定地址的轉(zhuǎn)移指令(BCC和CALL),在其第一次執(zhí)行時使用BTC存儲相關(guān)的信息,當再次執(zhí)行時,直接讀出這些信息,控制程序的執(zhí)行順序,而不需要轉(zhuǎn)移指令本身進流水線。這可大大提高效率,但對于轉(zhuǎn)移目標不確定的間接轉(zhuǎn)移指令(如RET),BTC是無效的。另外,條件轉(zhuǎn)移指令(BCC)是否跳轉(zhuǎn)也是不確定的,本設(shè)計中采用2BC進行預(yù)測。
BTC為全相聯(lián)Cache,總共有16個單元,每個單元包含的信息有:TAG存儲執(zhí)行過的轉(zhuǎn)移指令的地址、DI存儲延時槽指令、CC存儲條件碼、TP 存儲轉(zhuǎn)移指令類型、AN存儲A參數(shù)攜帶標志,HI存儲轉(zhuǎn)移執(zhí)行情況的歷史記錄,即2BC,VI指示行數(shù)據(jù)是否有效。BTC包含BTC存儲、BTC命中以及BTC檢查三種工作任務(wù)。以下分別介紹2BC以及每種任務(wù)下BTC的工作情況?!?br />
2.3.1 2BC的作用及工作原理
因為轉(zhuǎn)移指令執(zhí)行一次之后,轉(zhuǎn)移目標地址、延時槽指令都保存在BTC中了,當該指令再次執(zhí)行時,這些信息就直接從Cache讀出,因此在取指級就可以得到跳轉(zhuǎn)目標地址和延時槽指令。對于非條件轉(zhuǎn)移指令,跳轉(zhuǎn)總是執(zhí)行,因此BTC命中時就可以直接決定下一條指令的地址為轉(zhuǎn)移目標地址,而當前周期DI被送到指令總線上;但對于條件轉(zhuǎn)移指令,跳轉(zhuǎn)與否是根據(jù)條件碼和ALU的標志位來決定的。如果轉(zhuǎn)移指令前面一條指令的執(zhí)行結(jié)果改變標志位,而當BTC命中時該指令還在譯碼級,則跳轉(zhuǎn)與否需要等待一個時鐘周期才能決定。為了避免因為等待而造成流水線的停頓,采用2BC當前的狀態(tài)預(yù)測跳轉(zhuǎn)是否執(zhí)行,在接下來的時鐘周期,標志位有效之后,再檢查預(yù)測是否正確,如果不正確,就進行更正。當預(yù)測準確時,采用2BC 與BTC可以使轉(zhuǎn)移指令的執(zhí)行時間縮短一個周期。即使預(yù)測不準確,與不采用預(yù)測相比也不會有損失。2BC的工作原理如圖2所示,初始值為Nx(第一次不跳轉(zhuǎn)執(zhí)行)或Tx(第一次跳轉(zhuǎn)執(zhí)行),t表示跳轉(zhuǎn)執(zhí)行,n表示跳轉(zhuǎn)不執(zhí)行。當HI為N或Nx時,預(yù)測跳轉(zhuǎn)不發(fā)生;當HI為T或Tx時,預(yù)測跳轉(zhuǎn)發(fā)生。
評論