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