<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 適用于RISC CPU的轉移指令的原理及仿真

適用于RISC CPU的轉移指令的原理及仿真

作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò ) 收藏
1 引言

在RISC CPU的設計當中,轉移指令的處理對處理器的性能的影響非常關(guān)鍵。轉移指令決定著(zhù)程序的執行順序,在程序中的使用頻率很高。RISC CPU中程序是以流水線(xiàn)的方式執行的,當程序順序執行時(shí),下一條指令的地址與前一條指令的內容無(wú)關(guān) ;而在執行轉移指令時(shí)要根據轉移指令的執行結果來(lái)確定下一條指令的地址,也就是說(shuō)下一條指令的地址在轉移指令執行之前是未知的,造成流水線(xiàn)的不連貫,影響了CPU的效率。

轉移指令處理的方法很多,可分為預測法和非預測法,預測法又包含靜態(tài)預測和動(dòng)態(tài)預測,靜態(tài)預測如總預測跳轉、正向不跳轉反向跳轉,動(dòng)態(tài)預測如2比特計數器(2BC) 、BTC;非預測法如延時(shí)跳轉等[1]。這些基本方法合理組合之后可以得到很好的效果。

本文介紹的RISC CPU對轉移指令的處理方法,為5級流水線(xiàn)作業(yè),分別是取指、譯碼、執行、訪(fǎng)存、回寫(xiě),對轉移指令的處理在取指級和譯碼級完成;譯碼級給出轉移指令所包含的詳細信息,取指級包含有地址計算單元,轉移目標Cache (BTC),跳轉判斷單元等。對轉移指令的處理使用了延時(shí)跳轉、2BC以及BTC方法。

2 轉移指令的原理

該RISC CPU的指令集中包含有條件轉移指令和非條件轉移指令。所有的轉移指令均使用延時(shí)轉移,每條轉移指令后面跟隨一條延時(shí)槽指令;采用2BC預測條件轉移是否跳轉,而B(niǎo)TC則保存轉移目標為固定地址的轉移指令執行后的信息。以下分別介紹在該RISC CPU設計中轉移指令的設計以及延時(shí)轉移、BTC、2BC的具體實(shí)現方法。

2.1 轉移指令類(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位的寄存器地址。

本文引用地址:http://dyxdggzs.com/article/201612/324824.htm

2.2 延時(shí)轉移

在該RISC CPU中,由于轉移指令只有在譯碼級才被識別,跳轉與否在譯碼級才能決定,因此在取下一條指令之前必須等待一個(gè)時(shí)鐘周期。為了減少流水線(xiàn)中的氣泡,緊跟轉移指令后面插一條與跳轉不相關(guān)的指令,即延時(shí)槽指令,不管跳轉是否發(fā)生,該指令都執行。延時(shí)槽指令的插入由編譯器完成,當編譯器找不出這樣的指令時(shí),就插一條NOP指令??紤]到減輕編譯器的難度,我們也采用了帶 A參數的轉移:當指令帶有A參數時(shí),延時(shí)槽指令從轉移目標程序中取出,因此轉移發(fā)生時(shí),延時(shí)槽指令執行,而轉移不發(fā)生時(shí),則禁止延時(shí)槽指令進(jìn)入譯碼級。因一般而言非條件轉移指令出現的頻率遠低于條件轉移指令出現的頻率,非條件轉移指令的延時(shí)槽指令相對來(lái)說(shuō)容易找到,所以非條件轉移指令不采用A參數選項,而條件轉移指令采用A參數選項。

2.3 2BC與BTC的設計

2BC與BTC對提高轉移指令的執行效率起重要的作用。在RISC CPU中,轉移指令執行一次后,有很大的概率會(huì )執行更多次。對于轉移目標為固定地址的轉移指令(BCC和CALL),在其第一次執行時(shí)使用BTC存儲相關(guān)的信息,當再次執行時(shí),直接讀出這些信息,控制程序的執行順序,而不需要轉移指令本身進(jìn)流水線(xiàn)。這可大大提高效率,但對于轉移目標不確定的間接轉移指令(如RET),BTC是無(wú)效的。另外,條件轉移指令(BCC)是否跳轉也是不確定的,本設計中采用2BC進(jìn)行預測。

BTC為全相聯(lián)Cache,總共有16個(gè)單元,每個(gè)單元包含的信息有:TAG存儲執行過(guò)的轉移指令的地址、DI存儲延時(shí)槽指令、CC存儲條件碼、TP 存儲轉移指令類(lèi)型、AN存儲A參數攜帶標志,HI存儲轉移執行情況的歷史記錄,即2BC,VI指示行數據是否有效。BTC包含BTC存儲、BTC命中以及BTC檢查三種工作任務(wù)。以下分別介紹2BC以及每種任務(wù)下BTC的工作情況?!?br />
2.3.1 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ā)生。

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: RISCCPU轉移指

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>