專利名稱:采用雙指令集的32位嵌入式微處理器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種32位嵌入式微處理器,它支持本地RISC指令和Java卡虛擬機(jī)兩套指令集。
信息家電飛速發(fā)展,同時(shí),家庭網(wǎng)絡(luò)也迅速崛起。Java處理芯片將在這兩方面扮演重要角色。一方面Sun公司正致力于與消費(fèi)電子設(shè)備制造商攜手合作,推出基于Java技術(shù)的新型信息家電產(chǎn)品;另一方面,由于Java語言的跨平臺(tái)和網(wǎng)絡(luò)特性,絕大多數(shù)信息家電廠商正努力增強(qiáng)對(duì)Java的支持。直接將Java技術(shù)利用硬件實(shí)現(xiàn),作為信息家電設(shè)備的核心將是大勢所趨。Java智能卡技術(shù)是Java技術(shù)在智能卡領(lǐng)域的擴(kuò)展,給傳統(tǒng)的智能卡技術(shù)和應(yīng)用領(lǐng)域帶來變革,提高了發(fā)卡商或服務(wù)提供商選擇智能卡的自主性,能動(dòng)態(tài)的調(diào)整卡的應(yīng)用程序,在具有靈活性的同時(shí)也保證了安全性。Java智能卡產(chǎn)品已經(jīng)在全世界范圍得到了廣泛的應(yīng)用,領(lǐng)域包括無線通信、醫(yī)療保健、金融銀行、軍隊(duì)、身份認(rèn)證、電子商務(wù)等方面。
一般的32位嵌入式微處理器只支持一套指令集,即本地RISC指令系統(tǒng);而Java處理器則只支持Java虛擬機(jī)JVM(Java Card Virtual Machine)或Java卡虛擬機(jī)JCVM(Java Card VirtualMachine),不支持傳統(tǒng)的RISC指令。如果要在嵌入式微處理器的基礎(chǔ)上增加Java處理功能,需要額外利用軟件編寫的解釋器或編譯器。
傳統(tǒng)的32位嵌入式微處理器設(shè)計(jì)技術(shù)比較成熟,但對(duì)Java功能的支持較弱。當(dāng)前的Java實(shí)現(xiàn)方案中,主要有三種方法解釋執(zhí)行(Interpreter),及時(shí)編譯JIT(Just In Time)和硬件直接執(zhí)行,即Java處理器(Java in Silicon)。解釋執(zhí)行的方式執(zhí)行速度慢;及時(shí)編譯JIT與解釋執(zhí)行相比,雖然能夠提高處理速度,但是占用的內(nèi)存資源會(huì)增加兩到三個(gè)數(shù)量級(jí),對(duì)于內(nèi)存資源有嚴(yán)格限制的嵌入式應(yīng)用來說,也是不現(xiàn)實(shí)的;硬件直接執(zhí)行有三種常用的方法(1)純粹的Java處理器完全為執(zhí)行Java bytecode而設(shè)計(jì)。如Sun公司提供的picoJava;(2)Java協(xié)處理器主處理器執(zhí)行其本地RISC指令,當(dāng)遇到待執(zhí)行的指令是java bytecode時(shí),激活協(xié)處理器,同時(shí)移交總線控制權(quán),當(dāng)Java協(xié)處理器執(zhí)行結(jié)束后,重新將控制權(quán)交還給主處理器。如Nazomi公司提供的JSTAR;(3)通用處理器帶Java擴(kuò)展功能,如ARM公司提供的Jazelle處理器。
本發(fā)明提出的32位嵌入式微處理,由指令存儲(chǔ)器1、取指單元2、指令cache3、指令譯碼電路4、指令折疊電路5、通用寄存器組6、數(shù)據(jù)運(yùn)算單元7、內(nèi)存單元8、前推電路9、異常處理單元10、程序計(jì)數(shù)器PC11、狀態(tài)寄存器PSR12、指令陷阱13、多路選擇器14經(jīng)電路連接構(gòu)成,其中,指令存儲(chǔ)器1、取指單元2、指令譯碼電路4、通用寄存器組6、數(shù)據(jù)運(yùn)算單元7依次電路連接,前推電路9和異常處理單元11分別與取指單元2、指令譯碼電路4、數(shù)據(jù)運(yùn)算單元7連接,狀態(tài)寄存器12與數(shù)據(jù)運(yùn)算單元7、內(nèi)存單元8、寄存器組6連接,組成支持本地RISC指令集的電路系統(tǒng),見圖8所示;指令存儲(chǔ)器1、指令cache、指令折疊電路5、指令譯碼電路4、堆棧cache6、數(shù)據(jù)運(yùn)算單元7、多路選擇器14、內(nèi)存單元8依次電路連接,指令陷阱單元13與指令折疊電路5和指令譯碼電路4連接,組成支持Java卡虛擬機(jī)指令集的電路系統(tǒng),見圖9所示;并通過設(shè)置跳轉(zhuǎn)指令,實(shí)現(xiàn)本地RISC狀態(tài)和Java狀態(tài)的無縫切換。
本發(fā)明中,微處理器采用哈佛結(jié)構(gòu),五/六級(jí)流水線切換,由指令存儲(chǔ)器1、指令譯碼電路4、通用寄存器組6、數(shù)據(jù)運(yùn)算單元7、內(nèi)存單元8和寫回電路構(gòu)成數(shù)據(jù)通路,指令cache3、指令折疊電路5、前推電路9和指令陷阱13用于提高執(zhí)行效率,分離總線和分離的算術(shù)邏輯運(yùn)算單元降低功耗。
本發(fā)明中,在RISC狀態(tài)下,有一條特殊的“跳轉(zhuǎn)到Java”指令,當(dāng)該指令執(zhí)行條件滿足時(shí),處理器切換到Java狀態(tài),同時(shí)對(duì)RISC狀態(tài)下通用寄存器組、程序計(jì)數(shù)器以及當(dāng)前程序狀態(tài)寄存器進(jìn)行備份;在Java狀態(tài)下,如果有異常或中斷,處理器切換回RISC狀態(tài),同時(shí)恢復(fù)備份的寄存器和計(jì)數(shù)器。
本發(fā)明中,整個(gè)微處理器在RISC狀態(tài)下,采用五級(jí)流水線結(jié)構(gòu);在Java狀態(tài)下,采用特殊的六級(jí)流水線結(jié)構(gòu)。具體來說,執(zhí)行本地指令時(shí),為五級(jí)流水線結(jié)構(gòu),依次是取指令(IF)、譯碼(ID)、執(zhí)行(EXE)、訪存(DM)、寫回(WB)五部分;在執(zhí)行Java卡虛擬機(jī)指令集時(shí),自動(dòng)切換為六級(jí)流水線結(jié)構(gòu),依次是取指令(IF)、折疊譯碼(ID)、取操作數(shù)(OF)、執(zhí)行(EXE)、訪存(DM)、寫回(WB)六部分。這是由于原有的五級(jí)流水線的指令譯碼(ID)階段在Java狀態(tài)下承擔(dān)了過多的任務(wù),如指令折疊、指令cache管理、堆棧cache管理、取操作數(shù),為了避免該級(jí)成為處理器設(shè)計(jì)的瓶頸,限制處理器性能的提高,本發(fā)明中將它劃分成獨(dú)立的兩級(jí)折疊譯碼(ID)和取操作數(shù)(OF)。流水線之間的連接通過各級(jí)鎖存器實(shí)現(xiàn)。
本發(fā)明中,根據(jù)程序計(jì)數(shù)器PC的值取指令。在RISC狀態(tài)下,所有指令都為定長的32位字,而在Java狀態(tài)下,為非定長指令,指令長度從一個(gè)字節(jié)(8位)到數(shù)個(gè)字節(jié)不等。因此,本發(fā)明中,RISC狀態(tài)下用一個(gè)32位的指令控制器控制指令的正常讀??;Java狀態(tài)下用一個(gè)12字節(jié)(96位)的指令cache控制指令流動(dòng)。指令控制器和指令cache均位于流水線取指令(IF)和譯碼(ID)兩個(gè)階段之間。
本發(fā)明中,寄存器組6采用32×32的寄存器組織形式,在執(zhí)行本地指令時(shí),為通用寄存器組;在執(zhí)行Java卡虛擬機(jī)指令集時(shí),映射為操作數(shù)堆棧cache。這是由于,微處理器在RISC狀態(tài)下是面向寄存器組的組織形式,指令的絕大部分操作數(shù)處于寄存器中。32個(gè)32位的寄存器構(gòu)成一個(gè)大的通用寄存器組;在Java狀態(tài)下,則是面向堆棧的組織形式,指令的操作數(shù)大部分都隱藏在堆棧中。而傳統(tǒng)的Java堆棧建于處理器內(nèi)存中,因此使取操作數(shù)和寫回運(yùn)算結(jié)果成為運(yùn)行時(shí)的瓶頸。所以,本發(fā)明在處理器中內(nèi)建堆棧的cache來提高運(yùn)行速度??紤]到Java狀態(tài)下,原RISC狀態(tài)下的32個(gè)通用寄存器組完全空閑,因此將這32個(gè)寄存器連成環(huán)形作為堆棧cache,即通用寄存器組和堆棧cache是物理上完全相同的單元,但在處理器的不同模式下有不同的功能。原來處理器RISC狀態(tài)下5級(jí)流水中的DM階段進(jìn)行內(nèi)存訪問,Java狀態(tài)下則可以在該階段空閑(無流水線沖突)時(shí)候?qū)π陆ǖ亩褩ache進(jìn)行溢出(spill)和填充(fill)操作。由于堆棧cache由原來的通用寄存器組實(shí)現(xiàn),可以進(jìn)行三讀兩寫操作,即在Java狀態(tài)下取兩個(gè)操作數(shù)時(shí)還剩余一讀一寫口以便進(jìn)行填充和溢出。而且使用堆棧cache后也能進(jìn)一步實(shí)現(xiàn)指令折疊以提高運(yùn)行速度。操作數(shù)從通用寄存器組/堆棧cache取出后進(jìn)行流水線沖突判斷。
本發(fā)明中,執(zhí)行Java卡虛擬機(jī)指令集時(shí),采用了指令折疊技術(shù),將多條指令合并折疊為一條指令執(zhí)行。使用指令折疊技術(shù)可加速Java指令的執(zhí)行效率。指令折疊模塊位于指令譯碼單元前,用于對(duì)Java bytecode長度截取和折疊操作,折疊后的指令送譯碼模塊譯碼。
本發(fā)明采用了前推(forwarding)技術(shù)來解決流水沖突情況,前推電路與數(shù)據(jù)通路相連,構(gòu)成數(shù)據(jù)的快速通道,將操作結(jié)果從產(chǎn)生的單元直接移到實(shí)際需要它的地方,不用等到流水線的最后一個(gè)周期WB寫回,那么絕大多數(shù)的數(shù)據(jù)沖突都可以避免,提高了流水線的效率。
本發(fā)明中,采用分離的內(nèi)部總線結(jié)構(gòu)和分離的算術(shù)邏輯運(yùn)算單元,以降低處理器功耗。具體來說,本發(fā)明的數(shù)據(jù)處理單元主要由桶式移位器、算術(shù)/邏輯單元ALU和乘加單元組成,操作數(shù)來源于執(zhí)行階段的操作數(shù)鎖存器,計(jì)算完成的結(jié)果送訪存階段鎖存器存儲(chǔ)。采用分離式內(nèi)部總線,即數(shù)據(jù)處理單元中各部分的輸入數(shù)據(jù)用兩組帶使能的觸發(fā)器分別鎖存,從而構(gòu)成兩組獨(dú)立的內(nèi)部總線,可以根據(jù)具體指令的需要來更新相關(guān)總線上的數(shù)據(jù),同時(shí)保持其他總線上的數(shù)據(jù)不變,有效的降低了功耗。而且,整個(gè)ALU分成兩部分,一部分算術(shù)運(yùn)算單元AU(arithmetic unit)完成算術(shù)操作,一部分邏輯運(yùn)算單元LU(logic unit)完成邏輯操作,最后輸出結(jié)果為這兩部分的并集。這樣在算術(shù)操作時(shí)只有AU單元進(jìn)行運(yùn)算,LU單元關(guān)閉;邏輯操作時(shí)LU單元進(jìn)行運(yùn)算,AU單元關(guān)閉。通過將這兩部分隔離,可以大大減少ALU不必要的動(dòng)作,從而降低功耗。
本發(fā)明將Java卡虛擬機(jī)指令集分為三類,簡單指令、復(fù)雜指令和未定義指令。簡單指令全部用硬件實(shí)現(xiàn),其中的絕大部分能夠在一個(gè)到兩個(gè)時(shí)鐘周期內(nèi)完成;復(fù)雜指令使用指令模擬陷阱,根據(jù)引發(fā)陷阱的字節(jié)碼,陷阱處理調(diào)用位于固件中相應(yīng)的陷阱處理程序來完成這部分功能;未定義指令置起未定義指令異常,同時(shí)從Java狀態(tài)切換回RISC狀態(tài)以對(duì)異常進(jìn)行處理。
本發(fā)明采用了內(nèi)嵌的方式支持Java卡虛擬機(jī)指令集,在Java狀態(tài)時(shí)可以利用很多RISC狀態(tài)下的硬件資源,同時(shí),對(duì)虛擬機(jī)指令進(jìn)行劃分,對(duì)于復(fù)雜的、不適合在嵌入式處理器上直接實(shí)現(xiàn)的指令采用硬件陷阱的方法,因此相對(duì)于單一指令集的RISC處理器,面積增加了不到20%,而且還利用了指令折疊、堆棧cache等一系列硬件加速技術(shù)加快Java指令執(zhí)行效率,分離總線技術(shù)降低功耗,五/六級(jí)流水線、前推技術(shù)提高整個(gè)處理器的性能。
圖2顯示本發(fā)明流水線結(jié)構(gòu)。
圖3為Java狀態(tài)下指令cache工作流程圖。
圖4顯示Java狀態(tài)下堆棧cache。
圖5為基于通用寄存器組和基于堆棧處理器執(zhí)行相同一條加法指令的比較。
圖6顯示Java狀態(tài)下采用堆棧cache和指令折疊后一條加法指令的執(zhí)行。
圖7為本發(fā)明中前推電路的原理。
圖8為本發(fā)明中RISC狀態(tài)下電路框圖。
圖9為本發(fā)明中Java狀態(tài)下主要電路部分框圖。
圖10顯示RISC和Java狀態(tài)的切換。
圖中標(biāo)號(hào)1為指令存儲(chǔ)器,2為取指單元,3為指令cache,4為指令譯碼電路,5為指令折疊電路,6為通用寄存器組,7為數(shù)據(jù)運(yùn)算單元,8為內(nèi)存單元,9為前推電路,10為異常處理單元,11為程序計(jì)數(shù)器PC,12為狀態(tài)寄存器PSR,13為指令陷阱,14為多路選擇器。
RISC狀態(tài)的五級(jí)流水線結(jié)構(gòu)和Java狀態(tài)的六級(jí)流水結(jié)構(gòu)見圖1和圖2所示。其中IF(取指令),將指令從指令存儲(chǔ)器中取出后鎖存在IF/ID階段的鎖存器中,RISC狀態(tài)與Java狀態(tài)該級(jí)功能相同;ID(指令譯碼),在RISC狀態(tài)下,將IF/ID階段鎖存的指令取出進(jìn)行譯碼,產(chǎn)生后續(xù)階段的控制信號(hào),所有的控制信號(hào)鎖存在ID/EXE階段的鎖存器中,從寄存器堆中讀取操作數(shù);在Java狀態(tài)下,進(jìn)行指令長度截取、指令折疊以及指令譯碼,產(chǎn)生后續(xù)階段的控制信號(hào),所有的控制信號(hào)鎖存在ID/OF階段的鎖存器中,同時(shí)還要進(jìn)行指令cache管理;OF(取操作數(shù)),僅Java狀態(tài)有該流水級(jí),根據(jù)控制信號(hào),從堆棧cache或內(nèi)存中取操作數(shù),取出的數(shù)據(jù)鎖存在OF/EXE階段的鎖存器中。
EXE(執(zhí)行)ALU或MAC執(zhí)行相應(yīng)的指令,執(zhí)行結(jié)果鎖存在EXE/DM階段的鎖存器中,RISC狀態(tài)與Java狀態(tài)相同;DM(內(nèi)存訪問)在RISC狀態(tài)下,只有l(wèi)oad/store類型的指令需要這一級(jí)的實(shí)際操作,將上級(jí)結(jié)果寫入內(nèi)存或從內(nèi)存中取出數(shù)據(jù),鎖存在DM/WB階段的鎖存器中;在Java狀態(tài)下,除訪問內(nèi)存單元外,還執(zhí)行堆棧cache填充和溢出操作,以保證堆棧cache和內(nèi)存中主cache的數(shù)據(jù)一致;WB(寄存器寫回)RISC狀態(tài)下將DM/WB鎖存的值寫回通用寄存器組中,Java狀態(tài)下則是寫回堆棧cache中。
Java狀態(tài)下的指令cache(icache)的工作過程見圖3所示。icache中存放從只讀指令存儲(chǔ)器中取出待譯的指令,每個(gè)譯碼階段從中取出8byte的數(shù)據(jù)到指令折疊單元,根據(jù)指令折疊單元返回的值判斷該次折疊譯碼消耗了多少字節(jié)的數(shù)據(jù)(因?yàn)椴⒉皇撬械闹噶罱M合都能夠折疊,而且,即使能夠折疊,也不一定正好用8個(gè)字節(jié)),從而進(jìn)一步判斷是否需要重新從指令存儲(chǔ)器中取新指令進(jìn)行填充。在本發(fā)明中,如果icache中的有效數(shù)據(jù)小于等于8byte,就需要指令填充。
RISC狀態(tài)下的通用寄存器組映射成Java狀態(tài)下的堆棧cache結(jié)構(gòu),見圖4所示。數(shù)據(jù)處理單元(Integer Execution Unit)與堆棧cache有三個(gè)接口兩個(gè)讀口和一個(gè)寫口,完全能夠滿足正常指令取兩個(gè)操作數(shù)執(zhí)行完成后寫回一個(gè)操作結(jié)果的需要。堆棧cache的另外一讀一寫口用于和內(nèi)存中的主棧交換數(shù)據(jù)。堆棧內(nèi)除了高水位線和低水位線這兩個(gè)指針外,還有兩個(gè)指針棧底指針,始終指向動(dòng)態(tài)的棧底,位置“0”處;棧頂指針,始終指向動(dòng)態(tài)的棧頂。當(dāng)棧頂指針的值大于高水位線時(shí),表示堆棧cache即將被填滿,為了防止數(shù)據(jù)丟失,需要將堆棧cache棧底的一部分值彈到內(nèi)存的主棧中去,即進(jìn)行溢出操作,每一個(gè)周期可以將一個(gè)棧底的數(shù)據(jù)寫到內(nèi)存中,同時(shí)棧底指針的值加一,即向縮小的方向移動(dòng)一格;當(dāng)棧頂指針的值小于低水位線的值時(shí),表示堆棧cache中數(shù)據(jù)即將不足,為了防止取到錯(cuò)誤的數(shù)據(jù),需要將位于內(nèi)存主棧棧頂?shù)囊徊糠謹(jǐn)?shù)據(jù)彈出到堆棧cache的棧底,進(jìn)行數(shù)據(jù)填充,即進(jìn)行填充操作,每一個(gè)周期可以將主棧中的一個(gè)數(shù)據(jù)壓入到堆棧cache的棧底,同時(shí)棧底指針的值減一,即向增加的方向移動(dòng)一格。
和一般的堆棧一樣,正常情況下從堆棧中彈出數(shù)據(jù)時(shí),棧頂指針的值減一,向堆棧中壓入數(shù)據(jù)時(shí),棧頂指針的值加一。
值得注意的是,高水位線(“24”)和低水位線(“8”)的位置都是相對(duì)于棧底指針(“0”)而言的,并不是一個(gè)絕對(duì)值。隨著棧底指針的變化,這兩個(gè)水位線指向的寄存器的物理地址也是變化的。
極端情況下,在棧頂指針大于高水位線時(shí),需要連續(xù)向堆棧cache壓入數(shù)據(jù),或者在棧頂指針小于低水位線時(shí),需要連續(xù)從堆棧中彈出數(shù)據(jù),使得溢出和填充操作來不及進(jìn)行,這時(shí),需要強(qiáng)制停止流水線的流動(dòng),以完成這兩種操作,保持堆棧cache和內(nèi)存中主堆棧數(shù)據(jù)的一致性。
圖5為兩種不同類型的微處理器比較,Java卡虛擬機(jī)指令集是面向堆棧的結(jié)構(gòu),因此對(duì)操作數(shù)棧的訪問僅限于棧頂,所有的數(shù)據(jù)處理類型指令以及跟堆棧操作有關(guān)的指令都必須依賴于上一條指令在流水線的最后一個(gè)周期寫回的數(shù)據(jù),不僅降低了指令執(zhí)行效率,而且嚴(yán)重限制了指令級(jí)的并行。一條普通的ADD指令,在傳統(tǒng)RISC處理器中只需要一個(gè)時(shí)鐘周期,但在堆棧處理器中,需要四個(gè)周期。本發(fā)明中采用了一種新的指令折疊操作模式。主要的思想是利用堆棧cache可以隨機(jī)、多入口、單周期訪問的特性,如果一條將局部變量(LocalVariable)的值壓入棧頂?shù)闹噶詈竺婢o接一條對(duì)該數(shù)據(jù)的處理指令,當(dāng)指令譯碼器檢測到這種情況時(shí),將這兩條指令“折疊”在一起,即合并為同一條指令執(zhí)行,把操作數(shù)當(dāng)作已經(jīng)位于棧頂?shù)那闆r處理,如框圖6所示。
根據(jù)流水線的特點(diǎn),在理想情況下,流水線各級(jí)的所有操作單元在同一時(shí)刻都在工作。在五級(jí)流水線中,由于對(duì)寄存器組的寫回在最后一級(jí)流水線中完成,因此,完全有可能后面的一兩條指令的操作數(shù)在需要的時(shí)候還來不及寫回,即造成流水線的數(shù)據(jù)沖突。如果不采取其他額外的措施,那么只能通過流水線停頓來解決這類問題,引起流水線的不連貫,大大降低了流水線的效率。在本發(fā)明中,通過前推(forwarding)電路來解決這種情況。
前推技術(shù)的核心在于絕大多數(shù)發(fā)生沖突的情況下,后一條指令需要數(shù)據(jù)時(shí),上一條指令并不是真正來不及產(chǎn)生操作結(jié)果。如果我們將操作結(jié)果從產(chǎn)生的單元直接移到實(shí)際需要它的地方,不用等到流水線的最后一個(gè)周期寫回,那么絕大多數(shù)的數(shù)據(jù)沖突都可以避免。比如,我們將ALU或乘加單元的輸出結(jié)果直接前置到ALU或乘加單元的操作數(shù)輸入級(jí),就可以提前獲得操作數(shù),不用停頓流水線。
前推電路由地址cache和比較電路兩部分組成。地址cache是一個(gè)兩級(jí)的8比特寄存器,內(nèi)部鎖存了流水線在EXE階段和DM階段需要寫回的寄存器組地址。在每個(gè)ID階段,由譯碼器產(chǎn)生該條指令讀/寫寄存器的地址,并將其逐級(jí)鎖存為EXE和DM階段的地址。在比較電路中,把讀地址與上兩條指令在EXE和DM階段的值分別進(jìn)行比較。首先比較該條指令的讀地址與EXE階段的寫地址,如果相同,表示上條指令需要寫回的寄存器與該條指令要讀的寄存器相同,通過數(shù)據(jù)源判斷,將上條指令產(chǎn)生的操作結(jié)果直接通過前推電路送到本條指令需要該寄存器值的地方,如果不同,繼續(xù)比較讀地址與DM階段的地址;如果相同,將前面第二條指令的結(jié)果送到本條指令需要的地方。如果兩次比較沒有相同的地方,表示不需要前推處理。操作數(shù)的數(shù)據(jù)來源用缺省值,即從寄存器組中讀出。通過上述的前推電路,能夠不用停頓流水線解決大部分的數(shù)據(jù)沖突。
圖8為整個(gè)處理器在RISC狀態(tài)下的體系結(jié)構(gòu),圖9為處理器在Java狀態(tài)下的體系結(jié)構(gòu)。
在本地RISC指令集中,本發(fā)明新增加了一條跳轉(zhuǎn)指令,用于處理器從RISC狀態(tài)切換到Java狀態(tài)。與一般的本地指令一樣,指令執(zhí)行時(shí)首先進(jìn)行條件判斷,如果條件不滿足,則相當(dāng)于一條空操作指令;如果條件滿足,則首先保存當(dāng)前狀態(tài)的PC值,備份RISC狀態(tài)下的通用寄存器組,其次PC跳轉(zhuǎn)到特定的指令存儲(chǔ)器單元,開始執(zhí)行Java狀態(tài)的Java卡虛擬機(jī)指令。
在Java狀態(tài)下,如果遇到復(fù)雜指令,需要使用指令模擬陷阱來實(shí)現(xiàn),處理器調(diào)用固件中相應(yīng)微碼來執(zhí)行。完成之后回到陷阱入口,繼續(xù)下一條指令的執(zhí)行。同時(shí),若在Java狀態(tài)下有任何異?;蛑袛喈a(chǎn)生,需要切換回RISC狀態(tài),在完成異常處理程序后,視異常種類以決定是否返回Java狀態(tài)。實(shí)際上對(duì)于操作系統(tǒng)來說,Java狀態(tài)可以看作一個(gè)特殊的異常來處理。狀態(tài)切換如圖10所示。
根據(jù)Java卡虛擬機(jī)指令規(guī)范,本發(fā)明定義了七類可以折疊的指令如表1,根據(jù)它們?cè)谥噶钫郫B中的作用又分為三大類如表2。由于折疊的方式相當(dāng)多,完全實(shí)現(xiàn)是不現(xiàn)實(shí)的。通過仔細(xì)分析,本發(fā)明中選擇了出現(xiàn)頻率最高的幾種折疊方式,分別可以對(duì)二、三、四條指令進(jìn)行折疊,如表3所示。
在折疊邏輯中,首先進(jìn)行四條指令的折疊判斷,如果滿足,則采用四指令折疊,折疊好后送譯碼單元譯碼;若不滿足,進(jìn)行三指令折疊判斷,如果滿足,采用三指令折疊,折疊好后送譯碼單元譯碼;若不滿足,進(jìn)行兩指令折疊判斷,如果滿足,采用兩指令折疊,折疊好后送譯碼單元譯碼;若不滿足,表示該組指令不可折疊,只取第一條指令送譯碼單元譯碼。通過這種方式,可以最大限度的利用指令折疊提高指令執(zhí)行速度。
表四為本發(fā)明與商用RISC-ARM7TDMI的比較,在0.6um的工藝條件下可以達(dá)到0.35um工藝的速度,而且衡量處理器功能的兩個(gè)重要指標(biāo)CPI和MIPS有大幅度的提高。
表五為本發(fā)明與成熟的商用Java處理器比較,可以看出采用了較多的硬件加速手段,大大提高Java卡虛擬機(jī)指令執(zhí)行速度。與軟件方式相比,速度提高5~10倍,采用了硬件加速后,又在原有基礎(chǔ)上提高了30%,但處理器規(guī)模增加不到20%。
表1顯示Java卡虛擬機(jī)指令集動(dòng)態(tài)執(zhí)行時(shí)各類型指令所占的比例。
表2顯示Java狀態(tài)下指令折疊的分類。
表3顯示Java狀態(tài)下指令折疊的三種方式。
表4顯示本發(fā)明在RISC狀態(tài)下與市場上成熟的RISC比較。
表5顯示本發(fā)明在Java狀態(tài)下與市場上成熟的Java處理器的比較。
表1
表2
表3
表4
表權(quán)利要求
1.一種32位嵌入式微處理器,由指令存儲(chǔ)器(1)、取指單元(2)、指令cache(3)、指令譯碼電路(4)、指令折疊電路(5)、通用寄存器組(6)、數(shù)據(jù)運(yùn)算單元(7)、內(nèi)存單元(8)、前推電路(9)、異常處理單元(10)、程序計(jì)數(shù)器PC(11)、狀態(tài)寄存器PSR(12)、指令陷阱(13)、多路選擇器(14)經(jīng)電路連接構(gòu)成,其特征在于指令存儲(chǔ)器(1)、取指單元(2)、指令譯碼電路(4)、通用寄存器組(6)、數(shù)據(jù)運(yùn)算單元(7)依次電路連接,前推電路(9)和異常處理單元(11)分別與取指單元(2)、指令譯碼電路(4)、數(shù)據(jù)運(yùn)算單元(7)連接,狀態(tài)寄存器(12)與數(shù)據(jù)運(yùn)算單元(7)、內(nèi)存單元(8)、寄存器組(6)連接,組成支持本地RISC指令集的電路系統(tǒng);指令存儲(chǔ)器(1)、指令cache、指令折疊電路(5)、指令譯碼電路(4)、堆棧cache(6)、數(shù)據(jù)運(yùn)算單元(7)、多路選擇器(14)、內(nèi)存單元(8)依次電路連接,指令陷阱單元(13)與指令折疊電路(5)和指令譯碼電路(4)連接,組成支持Java卡虛擬機(jī)指令集的電路系統(tǒng);并通過設(shè)置跳轉(zhuǎn)指令,實(shí)現(xiàn)本地RISC狀態(tài)和Java狀態(tài)的無縫切換。
2.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于執(zhí)行本地指令時(shí),為五級(jí)流水線結(jié)構(gòu),依次是取指令、譯碼、執(zhí)行、訪存、寫回五部分;執(zhí)行Java卡虛擬機(jī)指令集時(shí),自動(dòng)切換為六級(jí)流水線結(jié)構(gòu),依次是取指令、折疊譯碼、取操作數(shù)、執(zhí)行、訪存、寫回六部分。
3.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于執(zhí)行Java卡虛擬機(jī)指令集時(shí),采用指令折疊技術(shù),將多條指令合并折疊為一條指令執(zhí)行。
4.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于采用一個(gè)32×32的寄存器組,在執(zhí)行本地指令時(shí),為通用寄存器組;在執(zhí)行Java卡虛擬機(jī)指令集時(shí),映射為操作數(shù)堆棧cache。
5.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于執(zhí)行Java卡虛擬機(jī)指令集時(shí),采用了12字節(jié)的指令cache,用于彌補(bǔ)由于指令折疊引起的指令急劇消耗以及Java卡虛擬機(jī)指令的不規(guī)則長度。
6.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于執(zhí)行Java卡虛擬機(jī)指令集時(shí),如果遇到復(fù)雜指令,則進(jìn)入硬件陷阱,調(diào)用固件中的微代碼實(shí)現(xiàn),執(zhí)行完成后,返回陷阱入口,繼續(xù)下一條指令的執(zhí)行。
7.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于采用前推電路來解決流水線的數(shù)據(jù)沖突,前推電路與數(shù)據(jù)通路相連,構(gòu)成數(shù)據(jù)的快速通道,將操作結(jié)果從產(chǎn)生的單元直接移到實(shí)際需要它的地方。
8.根據(jù)權(quán)利要求1所述的32位嵌入式微處理器,其特征在于采用分離的內(nèi)部總線結(jié)構(gòu)和分離的算術(shù)邏輯運(yùn)算單元,以降低處理器功耗。
全文摘要
本發(fā)明為一種采用新體系結(jié)構(gòu)的32位嵌入式微處理器,能夠處理本地RISC指令和Java卡虛擬機(jī)兩套指令集。它由取指單元、指令cache、指令譯碼電路、指令折疊電路、通用寄存器組、數(shù)據(jù)運(yùn)算單元、內(nèi)存單元、前推電路、異常處理單元等部分構(gòu)成。其中,指令cache和指令折疊電路僅在執(zhí)行Java卡虛擬機(jī)指令時(shí)有效,與此同時(shí),通用寄存器組映射為堆棧cache。本發(fā)明中的微處理器可以同時(shí)支持兩套指令集,并且之間能夠方便的進(jìn)行無縫切換,而電路面積與傳統(tǒng)不支持Java卡虛擬機(jī)的處理器相比,增加不到20%。
文檔編號(hào)G06F9/38GK1450450SQ0311691
公開日2003年10月22日 申請(qǐng)日期2003年5月15日 優(yōu)先權(quán)日2003年5月15日
發(fā)明者徐科, 王文婷, 忻凌, 閔昊, 周曉方, 顧滄海 申請(qǐng)人:復(fù)旦大學(xué)