- 片上系統(tǒng)設(shè)計(jì)思想與源代碼分析
- 陳曦 黃毅
- 14629字
- 2018-12-27 17:52:44
第2章 開源嵌入式處理器
本章主要內(nèi)容
嵌入式處理器種類繁多,但是使用最廣泛的是哈佛架構(gòu)的RISC處理器。OpenRISC 1000是開放源代碼RISC處理器簇,OR1200是它的一個(gè)32位實(shí)現(xiàn),指令集是CPU硬件與軟件的接口。在DemoSoC中,使用了OR1200作為處理器。官方給出的OR1200的性能在同頻率的ARM7和ARM9之間。據(jù)作者所知,OR1200是目前唯一一個(gè)可以免費(fèi)商用的開源處理器。本章將講述OpenRISC 1000處理器簇的指令格式、處理器的結(jié)構(gòu)組成,還將闡述OR1200處理器對(duì)OpenRISC 1000構(gòu)架的具體實(shí)現(xiàn)、結(jié)構(gòu)組成部分、硬件配置等。不打算更多地了解OR1200 CPU的讀者可以略過本章。
2.1 開源嵌入式處理器介紹
2.1.1 OpenRISC 1000構(gòu)架的主要特點(diǎn)
OpenRISC 1000是開放源代碼的RISC處理器簇,提供各種價(jià)格/性能的應(yīng)用。它是32/64bit位裝載(Load)和存儲(chǔ)(Store)RISC構(gòu)架,強(qiáng)調(diào)執(zhí)行效率、簡單、低功耗、可測量性和多樣性。目標(biāo)是中高執(zhí)行效率的網(wǎng)絡(luò)、嵌入便攜高計(jì)算機(jī)環(huán)境。
OpenRISC 1000執(zhí)行特征包括全32/64bit構(gòu)架、向量、DSP和浮點(diǎn)指令、虛擬內(nèi)存支持、一致的高速緩存、SMP和SMT支持、支持快速上下文切換。它較突出的特征是有幾個(gè)指令擴(kuò)展、提供可配置的通用寄存器、提供可配置的高速緩存和TLB尺寸、支持動(dòng)態(tài)電源管理、有用戶提供指令的空間。
應(yīng)用OpenRISC 1000構(gòu)架的RISC的源代碼在http://www.opencores.org可用,并且被GNU軟件開發(fā)工具和行為仿真器支持。它們能與http://www.opencores.org上的其他開放源代碼的IP核進(jìn)行接口。Opencores.org鼓勵(lì)第三方設(shè)計(jì)和在商業(yè)上使用OpenRISC 1000構(gòu)架的RISC。
OpenRISC 1000構(gòu)架的主要特征如下:
(1)完全自由和開放的構(gòu)架。
(2)用特定的物理地址空間提供線性的、32bit或64bit邏輯地址空間。
(3)簡單的和長度一致的指令格式,不同的指令集擴(kuò)展,包括如下指令集。
● 具有32bit寬度指令的OpenRISC基本指令集(ORBIS32/64 OpenRISC Basic Instruction)。它在內(nèi)存的32bit邊界對(duì)齊,并且在32bit和64bit數(shù)據(jù)上進(jìn)行操作。
● OpenRISC向量/DSP擴(kuò)展(ORVDX64 OpenRISC Vector/DSP eXtension),它有32bit位寬指令,可操作8、16、32和64bit數(shù)據(jù)。
● OpenRISC浮點(diǎn)擴(kuò)展(ORFPX32/64 OpenRISC Floating-Point eXtension),它有32bit位寬指令,操作32和64bit數(shù)據(jù)。
(4)兩種簡單內(nèi)存地址模式,內(nèi)存地址計(jì)算方法如下:
● 寄存器操作數(shù)加上一個(gè)有符號(hào)16bit立即數(shù)得到有效地址。
● 寄存器操作數(shù)和有符號(hào)16bit立即數(shù)相加,這個(gè)16位立即數(shù)被存有計(jì)算過的有效地址的寄存器操作數(shù)更新。
(5)大多數(shù)指令的兩個(gè)寄存器操作數(shù)(或一個(gè)寄存器和一個(gè)常量)執(zhí)行結(jié)構(gòu)放在第三個(gè)寄存器中。
(6)單個(gè)32條目或窄16條目通用寄存器文件。
(7)保持盡可能全流水線運(yùn)行的分枝延遲槽。
(8)支持分開的指令和數(shù)據(jù)高速緩存/MMU(Harvard構(gòu)架)或統(tǒng)一的指令和數(shù)據(jù)高速緩存/MMU(標(biāo)準(zhǔn)構(gòu)架)。
(9)允許某一功能被執(zhí)行的彈性構(gòu)架定義。
(10)不同的、分開的例外簡化了例外模型。
(11)在寄存器集、高速緩存和MMU中支持快速上下文切換。
OpenRISC 1000命名規(guī)則是:第一個(gè)數(shù)字“1”表示是OpenRISC 1000構(gòu)架序列,第二個(gè)數(shù)字“0”表示具體應(yīng)用的構(gòu)架。后兩位數(shù)字表示實(shí)際應(yīng)用中的具體配置。
2.1.2 尋址模式
當(dāng)執(zhí)行一個(gè)內(nèi)存訪問指令或分支指令或當(dāng)支取隨后的一個(gè)指令時(shí),處理需要計(jì)算一個(gè)有效地址。如果有效地址和操作數(shù)長度的和超過了邏輯地址空間的最大有效地址,內(nèi)存操作數(shù)從最大有效地址循環(huán)回到有效地址0。OpenRISC 1000尋址模式有寄存器間接尋址和PC相對(duì)尋址。
1.寄存器間接尋址
Load/Store指令使用這種尋址模式將一個(gè)有符號(hào)的16bit立即數(shù)值加到指令指定的通用寄存器所存儲(chǔ)的值上,得到一個(gè)有效地址。如圖2-1所示為當(dāng)使用寄存器間接尋址模式時(shí),一個(gè)有效地址是如何計(jì)算得到的。

圖2-1 寄存器間接尋址
2.PC(程序計(jì)數(shù))相對(duì)尋址
分支指令使用這種尋址模式,它存有一個(gè)有符號(hào)擴(kuò)展的26bit立即數(shù),并把它加到一個(gè)程序計(jì)數(shù)寄存器存儲(chǔ)的數(shù)據(jù)上,得到有效地址。在目的地PC執(zhí)行之前,延遲槽里的指令被執(zhí)行。如圖2-2所示為當(dāng)使用PC相對(duì)尋址模式時(shí),一個(gè)有效地址如何計(jì)算得到的。

圖2-2 PC相對(duì)尋址
2.1.3 bit位和byte字節(jié)次序
字節(jié)次序定義了組成半個(gè)字、單個(gè)字和雙字的字節(jié)流在內(nèi)存中如何排序。為了簡化OpenRISC的使用,構(gòu)架默認(rèn)時(shí)使用了MSB(Most Significant Byte)字節(jié)次序或稱為大端字節(jié)序(Big Endian Byte)。但如果構(gòu)架使用了字節(jié)重排序硬件,它也支持LSB(Least Significant Byte)字節(jié)次序或稱為小端字節(jié)序。重排序使用bit位SR[LEE]激活。
表2-1列出了雙字在大端字節(jié)序時(shí)字節(jié)及bit位在內(nèi)存中的排序。單個(gè)字和半個(gè)字的字節(jié)及bit位排序使用類似的機(jī)制。
表2-1 雙字的字節(jié)及bit位次序

對(duì)齊和非對(duì)齊的訪問方式如下:
如果操作數(shù)的地址是操作數(shù)長度的整數(shù)倍,那么,內(nèi)存中的操作數(shù)是地址對(duì)齊的。構(gòu)架支持非對(duì)齊的訪問,但默認(rèn)的行為是對(duì)非對(duì)齊操作數(shù)的訪問將導(dǎo)致一個(gè)對(duì)齊例外。OR32指定是4個(gè)字節(jié)和字對(duì)齊的。內(nèi)存操作數(shù)對(duì)齊時(shí)地址低位的特征如表2-2所示。
表2-2 內(nèi)存操作數(shù)對(duì)齊時(shí)地址低位的特征

2.1.4 寄存器集
OpenRISC 1000構(gòu)架的處理器包括幾種類型寄存器,分別為用戶級(jí)通用寄存器和特殊寄存器、超級(jí)監(jiān)管者級(jí)特殊寄存器和依賴于硬件單元的寄存器。寄存器的詳細(xì)說明可參閱《OpenRISC 1000 Architecture Manual》。
用戶級(jí)通用和特殊寄存器在用戶模式(user)和超級(jí)監(jiān)管者模式(supervisor)下都可被訪問。超級(jí)監(jiān)管者寄存器僅在超級(jí)監(jiān)管者模式下操作(即SR[SM]=1)時(shí)才可被訪問。
依賴于硬件單元的寄存器通常僅在超級(jí)監(jiān)管者模式下可被訪問,但有個(gè)別的除外。
1.特殊寄存器
所有單元的特殊寄存器被分成32組,每組中的寄存器使用不同的寄存器地址(編號(hào))區(qū)分。一個(gè)組中可以放有幾個(gè)不同單元或處理器的寄存器。在寄存器地址解碼中,由于一些寄存器僅在超級(jí)監(jiān)管者模式下可被訪問,因此,SR[SM]位也被使用。指令l.mtspr和l.mfspr被用來讀寫特殊寄存器。特殊寄存器的分組說明如表2-3所示。
表2-3 特殊寄存器(SPR Special Purpose Register)的分組

OpenRISC 1000構(gòu)架處理器需要至少使用第0組特殊寄存器。其他的特殊寄存器是可選的,并且只有單元存在時(shí),單元相應(yīng)的特殊寄存器組才存在。
16bit的SPR地址由5bit組序號(hào)(15~11bit位)和11bit寄存器序號(hào)(10~0bit位)組成。表2-4列出了第0組特殊寄存器的說明。其中,帶有R*的SPR表示如果SR[SUMRA]被設(shè)置,用戶模式下對(duì)SPR的訪問是可讀的。
表2-4 第0組特殊寄存器說明

2.通用寄存器(GPR)
32個(gè)通用寄存器被標(biāo)識(shí)為R0~R31,并且在32bit處理器中是32bit位寬,在64bit處理器是64bit位寬。它們存儲(chǔ)浮點(diǎn)數(shù)據(jù)、向量或內(nèi)存指針。GPR可被ORBIS、ORVDX和ORFPX指令作為源和目的地寄存器進(jìn)行訪問。
R0被用作常量0,R0是否實(shí)際上硬件連線到0依賴于構(gòu)架的應(yīng)用。R0永遠(yuǎn)不應(yīng)該被用做目的地寄存器。
一個(gè)構(gòu)架的應(yīng)用可能有幾套GPR組,并把它們用做映像(shadow)寄存器,無論何時(shí),一個(gè)新的例外發(fā)生時(shí),它們之間發(fā)生切換。當(dāng)前使用的一套通過SR[CID]值被鑒別。CID為進(jìn)程上下文的序號(hào),值為0~15,即可能有16套通用寄存器組,共512個(gè)寄存器(32×16=512)。
構(gòu)架的應(yīng)用RISC在復(fù)位期間不需要初始化GPR到0,必要時(shí)復(fù)位例外處理句柄負(fù)責(zé)初始化GPR到0。
3.支持定制GPR數(shù)量
程序可能被編譯使用少于32個(gè)寄存器,編譯代碼時(shí)不用的寄存器被禁止(設(shè)置作為固定寄存器)。這些代碼在正常的構(gòu)架應(yīng)用RISC中也可執(zhí)行。如果配置寄存器被使用,CPUCFGR[CGF]指出構(gòu)架應(yīng)用RISC是否有完全的32個(gè)通用寄存器或少于32個(gè)寄存器。
4.超級(jí)監(jiān)管者寄存器
超級(jí)監(jiān)管者寄存器(Supervision Register,SR)是32位特殊寄存器,僅能在超級(jí)監(jiān)管模式下使用l.mtspr/l.mfspr指令訪問。SR值定義了處理器的狀態(tài)。
5.例外程序計(jì)數(shù)寄存器
例外程序計(jì)數(shù)寄存器(Exception Program Counter Registers)有EPCR0~EPCR15,它們是超級(jí)監(jiān)管者級(jí)別的特殊寄存器,使用l.mtspr/l.mfspr指令在超級(jí)監(jiān)管模式下訪問。如果PCMRx[SUMRA]被激活,用戶模式下是可讀的。在一個(gè)例外產(chǎn)生后,EPCR被設(shè)置到被例外中斷的指令的程序計(jì)數(shù)器(PC)地址。如果僅一個(gè)EPCR出現(xiàn)在構(gòu)架應(yīng)用RISC中,在例外識(shí)別再次在SR中被激活之前,它必須被例外處理例程存儲(chǔ)。
6.例外有效地址寄存器
例外有效地址寄存器(Exception Effective Address Registers)有EEAR0~EEAR15,它們是的特殊的超級(jí)監(jiān)管者級(jí)別的寄存器,使用l.mtspr/l.mfspr指令在超級(jí)監(jiān)管模式下訪問。如果SR[SUMRA]被激活,用戶模式下是可讀的。
在一個(gè)例外產(chǎn)生后,EEAR被設(shè)置到被例外指令產(chǎn)生的有效地址(EA effective address)。如果僅一個(gè)EEAR出現(xiàn)在構(gòu)架應(yīng)用RISC中,在例外識(shí)別再次在SR中被激活之前,它必須被例外處理例程存儲(chǔ)。
7.例外超級(jí)監(jiān)管者寄存器
例外超級(jí)監(jiān)管者寄存器(Exception Supervision Registers)有ESR0~ESR15,它們是的特殊的超級(jí)監(jiān)管者級(jí)別的寄存器,使用l.mtspr/l.mfspr指令在超級(jí)監(jiān)管模式下訪問。
在一個(gè)例外產(chǎn)生后,超級(jí)監(jiān)管者寄存器(SR)被復(fù)制到ESR。如果僅一個(gè)ESR出現(xiàn)在構(gòu)架應(yīng)用RISC中,在例外識(shí)別再次在SR中被激活之前,它必須被例外處理例程存儲(chǔ)。
8.下一個(gè)和前一個(gè)程序計(jì)數(shù)寄存器
下一個(gè)和前一個(gè)程序計(jì)數(shù)寄存器(Next and Previous Program Counter)是NPC和PPC。它們代表剛執(zhí)行完的指令地址或?qū)⒈粓?zhí)行指令的地址。
這兩個(gè)寄存器和GPR寄存器僅被一個(gè)外部的調(diào)試器因調(diào)試目的而映射到SPR空間。應(yīng)用程序應(yīng)該使用l.jal指令獲得當(dāng)前程序計(jì)數(shù)和使用算術(shù)指令獲得GPR寄存器的值。
9.浮點(diǎn)控制狀態(tài)寄存器
浮點(diǎn)控制狀態(tài)寄存器(FPCSR,F(xiàn)loating Point Control Status Register)是一個(gè)32位特殊寄存器,使用l.mtspr/l.mfspr指令在超級(jí)監(jiān)管者模式下進(jìn)行訪問,如果SR[SUMRA]被激活,用戶模式下是可讀的。
FPCSR控制浮點(diǎn)環(huán)形模式、可選地控制浮點(diǎn)例外的產(chǎn)生并提供浮點(diǎn)狀態(tài)標(biāo)識(shí)。在每次浮點(diǎn)指令被完成,狀態(tài)標(biāo)識(shí)被更新,并且能用來判斷引起浮點(diǎn)例外的原因。
如果浮點(diǎn)例外被激活,那么FPCSR狀態(tài)標(biāo)識(shí)必須在浮點(diǎn)例外處理例程中被清除。狀態(tài)標(biāo)識(shí)通過寫0到所有的狀態(tài)位來被清除。
2.1.5 指令集及指令格式
OpenRISC 1000指令集的主要特征是有簡單和統(tǒng)一長度的指令格式,5個(gè)指令子集(即ORBIS32、ORBIS64、ORFPX32、ORFPX64、ORVDX64)。OpenRISC基本指令集ORBIS32/64使用對(duì)齊的32bit位寬指令,操作32位和64位數(shù)據(jù)。OpenRISC向量/DSP擴(kuò)展ORVDX64使用對(duì)齊的32bit位寬指令,操作8位、16位、32位和64位數(shù)據(jù)。OpenRISC浮點(diǎn)擴(kuò)展ORFPX32/64使用對(duì)齊的32bit位寬指令,操作32位和64位數(shù)據(jù)。還有保留的操作代碼給定制指令。
每個(gè)子集的指令按照重要性還被分成兩個(gè)指令類Class I和Class II,分類說明如表2-5所示。
表2-5 OpenRISC 1000指令分類

指令被分成指令類,僅基本的指令類在OpenRISC 1000構(gòu)架的RISC中是要求的。5個(gè)指令子集說明如下:
(1)ORBIS32包括32位整數(shù)指令、基本的DSP指令、32位的Load/Store指令、程序流指令和特殊指令;
(2)ORBIS64包括64位整數(shù)指令、64位Load/Store指令;
(3)ORFPX32包括單精度浮點(diǎn)指令;
(4)ORFPX64包括雙精度的浮點(diǎn)指令、64位Load/Store指令;
(5)ORVDX64包括向量指令、DSP指令。
指令按寄存器的使用分為R類型指令、I類型指令和J類型指令,分別說明如下:
1.R類型指令
R類型指令使用寄存器rA和寄存器rB作為源數(shù)據(jù)寄存器,rD作為目的寄存器,在ALU中rA與rB的數(shù)據(jù)經(jīng)運(yùn)算后放入rD。因此存在著寄存器堆與ALU模塊的A、B、D引腳的連接。
2.I類型指令
I類型指令包括運(yùn)算指令、Load指令、Store指令、分支指令等的帶操作數(shù)的指令。
3.J類型指令
J類型指令指跳轉(zhuǎn)指令。在跳轉(zhuǎn)指令的處理過程中,需要把程序計(jì)數(shù)器PC加4后的高4位和指令字中的跳轉(zhuǎn)地址合并;然后,把合并的結(jié)果作為下一個(gè)PC的值,輸出到程序計(jì)數(shù)器PC中。
CPU的指令按用途可分為Load/Store指令、跳轉(zhuǎn)指令、ALU和特殊指令幾大類,絕大部分指令在31~26bit定義。
Load/Store指令從存儲(chǔ)器(如數(shù)據(jù)高速緩存)裝載數(shù)據(jù)到寄存器堆或從寄存器堆存儲(chǔ)數(shù)據(jù)到存儲(chǔ)器。
跳轉(zhuǎn)指令通過改變程序計(jì)數(shù)器來改變程序執(zhí)行的順序,在跳轉(zhuǎn)指令之后緊跟著延遲槽,在延遲槽中的指令為延遲指令。延遲指令在程序流跳轉(zhuǎn)之前被執(zhí)行。這種延遲轉(zhuǎn)移功能是為流水線而設(shè)計(jì)的。
ALU指令包括算術(shù)運(yùn)算和邏輯運(yùn)算指令。特殊指令指同步類指令、空操作指令等。
OpenRISC 1000指令尋址方式有寄存器尋址、立即數(shù)尋址、基址偏移量尋址、PC相對(duì)尋址、偽直接尋址。寄存器尋址是把操作數(shù)放在寄存器堆中;立即數(shù)尋址是指操作數(shù)為一個(gè)常數(shù),包含在指令中;基址偏移量尋址指操作數(shù)放在寄存器中,存儲(chǔ)器地址由一個(gè)寄存器的內(nèi)容加上指令中的常數(shù)得到;PC相對(duì)尋址是指轉(zhuǎn)移指令計(jì)算轉(zhuǎn)移地址,PC的相對(duì)值是指令中的一個(gè)常數(shù);偽直接尋址指跳轉(zhuǎn)指令形成轉(zhuǎn)移地址,指令中的26位目標(biāo)地址值與PC的高4位拼接而成,形成30位的寄存器“字地址”。
CPU的指令格式與硬件邏輯電路直接相關(guān),簡單較少的格式對(duì)應(yīng)簡單高效的邏輯電路。OpenRISC 1000指令集指令長度為32位,指令的格式只有簡單的幾種,常用指令使用31~26bit進(jìn)行大類劃分,并將常用的寄存器操作指令類別定義為0x38。另外將比較設(shè)置標(biāo)識(shí)指令放在31~21bit位。具體格式說明如下:
1.31~26bit為0x38的指令
31~26bit為0x38的指令都是寄存器之間整數(shù)邏輯運(yùn)算指令,指令字符中含有“l(fā)”字符,下面以l.add為例說明這類指令的格式。
指令書寫格式為:l.add rD,rA,rB
指令運(yùn)算方法如下:
rD[31:0] < - rA[31:0] + rB[31:0] SR[CY] < - carry SR[OV] < - overflow
指令的格式如表2-6所示。D、A、B表示的是通用寄存器編號(hào)地址。9~8bit將指令分成小類,每小類由3~0bit組成16條指令。
表2-6 l.add指令格式表

9~8bit將指令分成小類,每小類的指令分別說明如下:
0x38 0x0類指令是常見的加、減、邏輯運(yùn)算(或、異或等)運(yùn)算指令,如l.addc、l.and、l.cmov、l.exths、l.extws、l.ff1、l.or、l.sll、l.sub、l.xor等。
0x38 0x01類指令是字節(jié)擴(kuò)展、查找第一次出現(xiàn)“1”的位數(shù)等指令,如l.extbs、l.extwz、l.fl1、l.srl等。
0x38 0x02類指令是右移算術(shù)指令l.sra。
0x38 0x3類指令主要是乘法與除法指令,如l.div、l.divu、l.extbz、l.mul、l.mulu、l.ror。
2.31~26bit為0x31的指令
31~26bit為0x31的指令有l(wèi).mac和l.msb,它們是乘法累加與乘法減,下面以l.mac為例說明指令格式。
指令書寫格式為:l.mac rA,rB
指令的運(yùn)算方法如下:
temp[31:0] < - rA[31:0]*rB[31:0] MACHI[31:0]MACLO[31:0] < - temp[31:0] +MACHI[31:0]MACLO[31:0]
指令l.mac的運(yùn)算是將rA×rB的結(jié)果裁剪到32bit,并加到特殊寄存器CHI[31:0]MACLO[31:0]上。所有的操作數(shù)當(dāng)做符號(hào)整數(shù)看待。指令l.mac格式如表2-7所示。
表2-7 指令l.mac格式表

3.31~26bit為0x32的指令
31~26bit為0x32的指令是浮點(diǎn)運(yùn)算指令,由7~0bit區(qū)分具體的命令。浮點(diǎn)運(yùn)算指令包括加、減、乘、除、大小比較、浮點(diǎn)與整數(shù)的轉(zhuǎn)換等運(yùn)算。浮點(diǎn)指令又分為單精度和雙精度指令。它們由CPU中的專門浮點(diǎn)運(yùn)算單元來執(zhí)行的。在OR1200中沒有浮點(diǎn)運(yùn)算單元,因些不支持浮點(diǎn)指令。
浮點(diǎn)運(yùn)算指令用格式“l(fā)f.*.d”或“l(fā)f.*.s”表示,其中,“l(fā)f”表示浮點(diǎn)運(yùn)算,“d”表示雙精度,“s”表示單精度。下面以lf.add.d為例說明浮點(diǎn)運(yùn)算指令的格式。
指令書寫格式為:lf.add.d rD,rA,rB
指令的運(yùn)算方法如下:
rD[63:0] < - rA[63:0] + rB[63:0]
指令lf.add.d是浮點(diǎn)雙精度加法,它的格式如表2-8所示。
表2-8 指令lf.add.d格式表

浮點(diǎn)雙精度指令還有l(wèi)f.div.d、lf.ftoi.d、lf.itof.d、lf.madd.d、lf.mul.d、lf.rem.d、lf.sfeq.d、lf.sfge.d、lf.sub.d。
浮點(diǎn)單精度指令還有l(wèi)f.add.s、lf.div.s、lf.ftoi.s、lf.itof.s、lf.madd.s、lf.mul.s、lf.rem.s、lf.sfeq.s、lf.sfge.s、lf.sub.s。
4.31~26bit為0xa的指令
31~26bit為0xa的指令是向量運(yùn)算指令,7~0bit區(qū)分具體的命令。向量運(yùn)算指令是由向量運(yùn)算單元完成,是64bit運(yùn)算的指令。OR1200沒有向量運(yùn)算單元。向量運(yùn)算指令的書寫格式是“l(fā)v.*.b”或“l(fā)v.*.h”,其中,“l(fā)v”表示是向量運(yùn)算指令,“b”表示是字節(jié)元素,“h”表示是半字元素。
下面以指令lv.add.b為例說明向量運(yùn)算指令格式。指令lv.add.b是向量半字元素有符號(hào)的加法。
指令書寫格式為:lv.add.b rD,rA,rB
指令的運(yùn)算方法如下:
rD[7:0] < - rA[7:0] + rB[7:0] rD[15:8] < - rA[15:8] + rB[15:8] rD[23:16] < - rA[23:16] + rB[23:16] rD[31:24] < - rA[31:24] + rB[31:24] rD[39:32] < - rA[39:32] + rB[39:32] rD[47:40] < - rA[47:40] + rB[47:40] rD[55:48] < - rA[55:48] + rB[55:48] rD[63:56] < - rA[63:56] + rB[63:56]
指令lv.add.b格式如表2-9所示。
表2-9 指令lv.add.b格式

5.31~26bit為0x2e的指令
31~26bit為0x2e的指令是帶直接操作數(shù)位移動(dòng)指令,它用7~6bit位區(qū)別具體的指令,這4個(gè)帶直接操作數(shù)位移動(dòng)指,即l.rori、l.slli、l.srai、l.srli具有同一格式,它們是右旋轉(zhuǎn)、左移位、右算術(shù)移位、右邏輯移位指令。
下面以指令l.rori說明指令的格式。
指令l.rori的作用如下:
6bit立即數(shù)指定bit位置序號(hào),rA向右旋轉(zhuǎn)。結(jié)果放入rD。立即數(shù)5bit以上被忽略。
指令l.rori的書寫格式為:l.rori rD,rA,L
指令l.rori運(yùn)算方法如下:
rD[31-L:0] < - rA[31:L] rD[31:32-L] < - rA[L-1:0]
指令l.rori的格式如表2-10所示。
表2-10 指令l.rori的格式

6.31~26bit位的寄存器跳轉(zhuǎn)指令
l.jalr和l.jr指令都是無條件跳轉(zhuǎn)指令,跳轉(zhuǎn)的地址放在rB寄存器中。區(qū)別在于l.jalr把延遲槽后的地址被放在鏈接寄存器中。下面l.jalr為例說明指令格式。
指令l.jalr的作用如下:
通用寄存器rB存有跳轉(zhuǎn)的有效地址,程序在一個(gè)指令延遲后無條件跳轉(zhuǎn)到EA。在延遲槽后的地址被放在鏈接寄存器中。不允許指定鏈接寄存器為rB。
指令書寫格式為:l.jalr rB
指令的運(yùn)算方法如下:
PC <- rB LR <- DelayInsnAddr + 4
指令l.jalr的格式如表2-11所示。
表2-11 指令l.jalr的格式

7.其他的31~26bit位指令
其他的31~26bit位指令絕大多數(shù)是帶直接操作數(shù)的指令,由于直接操作數(shù)所占的位較多,因此,這些指令大多數(shù)因?yàn)橹苯硬僮鲾?shù)可能較大而沒有用位進(jìn)行指令分類,而是直接由31~26bit位區(qū)分具體的指令。
具體說明如下:
(1)帶直接操作數(shù)運(yùn)算、裝載指令
有同一格式帶直接操作數(shù)運(yùn)算、裝載指令有l(wèi).addic、l.andi、l.lbs、l.lbz、l.ld、l.lhs、l.lhz、l.lws、l.lwz、l.mfspr、l.muli、l.ori和l.xori,這些指令的格式一樣,指令中“l(fā)b”表示裝載字節(jié),“l(fā)d”表示裝載雙字,“l(fā)w”表示裝載字,“l(fā)h”表示裝載半字。結(jié)尾的“s”表示用符號(hào)進(jìn)行位擴(kuò)展,即32bit中用符號(hào)位填充高字節(jié)。結(jié)尾的“z”表示用“0”進(jìn)行位擴(kuò)展。
下面以指令l.addic為例說明指令模式。
指令書寫格式為:l.addi rD,rA,I
指令的運(yùn)算方法如下:
rD[31:0] <- rA[31:0] + exts (Immediate) SR[CY] <- carry SR[OV] <- overflow
指令l.addic的格式如表2-12所示。
表2-12 指令l.addic的格式

(2)帶直接操作數(shù)乘法、存儲(chǔ)指令
有同一格式帶直接操作數(shù)乘法、存儲(chǔ)指令有l(wèi).maci、l.mtspr(移到通用寄存器的值到特殊寄存器)、l.sb(存儲(chǔ)字節(jié))、l.sd(存儲(chǔ)雙字)、l.sh(存儲(chǔ)半字)、l.sw(存儲(chǔ)字)。
下面以指令l.maci為例說明指令格式。
指令l.maci的作用如下:
通用寄存器rA的值乘以立即數(shù),結(jié)果被裁剪到32bit后,加到特殊寄存器MACHI和MACLO上,所有的操作數(shù)被當(dāng)做有符號(hào)整數(shù)看待。
指令l.maci的書寫格式為:l.maci rA,I
指令l.maci的運(yùn)算方法如下:
temp[31:0] < - rA[31:0] * exts(Immediate) MACHI[31:0]MACLO[31:0] < - temp[31:0] +MACHI[31:0]MACLO[31:0]
指令l.maci的格式如表2-13所示。
表2-13 指令l.maci的格式

(3)帶直接操作數(shù)的跳轉(zhuǎn)指令
帶直接操作數(shù)的跳轉(zhuǎn)指令有l(wèi).bnf、l.cust1(8條用戶定義指令)、l.j、l.jal、l.rfe(從例外中返回)。
下面以指令l.bnf為例說明指令格式。
指令l.bnf的作用如下:
立即值被左移2bit,符號(hào)擴(kuò)展到程序計(jì)數(shù)器寬度,并接著加到分支指令的地址上,結(jié)果是分支的有效地址EA。如果flag被設(shè)置,程序分支到EA延遲一個(gè)指令周期。
指令l.bnf的書寫格式為:l.bf N
指令l.bnf的運(yùn)算方法如下:
EA < - exts(Immediate < < 2)+ BranchInsnAddr PC < - EA if SR[F] set
指令l.bnf的格式如表2-14所示。
表2-14 指令l.bnf的格式

(4)31~26bit位為0x6指令
31~26bit位為0x6指令有l(wèi).movhi和l.macrc,下面分別對(duì)這兩條指令進(jìn)行說明。
指令l.movhi說明如下:
指令l.movhi的作用如下:
16bit立即數(shù)被0擴(kuò)展,左移16bit,并被放入通用寄存器rD。
指令l.movhi的書寫格式為:l.movhi rD,K
指令l.movhi的運(yùn)算方法如下:
rD[31:0] < - extz(Immediate)< < 16
指令l.movhi的格式如表2-15所示。
表2-15 指令l.movhi的格式

指令l.macrc說明如下:
指令l.macrc的作用如下:
一旦在MAC流水線中所有指令被完成,MAC的內(nèi)容被放入通用寄存器rD,同時(shí),MAC累加器被清空。
指令l.macrc的書寫格式為:l.macrc rD
指令l.macrc的運(yùn)算方法如下:
synchronize-mac rD[31:0] <- MACLO[31:0] MACLO[31:0],MACHI[31:0] <-0
指令l.macrc的格式如表2-16所示。
表2-16 指令l.macrc的格式

8.31~21bit位寄存器比較設(shè)置標(biāo)識(shí)指令
31~21bit位寄存器比較設(shè)置標(biāo)識(shí)指令是比較寄存器rA和rB,并將比較結(jié)果設(shè)置寄存器SR的F位,即設(shè)置SR[F],用來表示比較等式是否成立。
31~21bit位寄存器比較設(shè)置標(biāo)識(shí)指令有l(wèi).sfges、l.sfgeu、l.sfgts、l.sfgtu、l.sfles、l.sfleu、l.sflts、l.sfltu、l.sfne。指令中字符的含義為“sf”表示Set Flag,“ge”表示Great and Equal(大于或等于),“gt”表示Great(等于),“l(fā)e”表示Little and Equal,“ne”表示Not Equal,“u”表示unsigned(無符號(hào)的),“s”表示Signed(有符號(hào)的)。
下面以指令l.sfeq為例說明指令格式。
指令l.sfeq的作用如下:
如果rA與rB相等,比較標(biāo)識(shí)被設(shè)置,否則被清除。
指令l.sfeq的書寫格式為:l.sfeq rA,rB
指令l.sfeq的運(yùn)算方法如下:
SR[F] < - rA[31:0] == rB[31:0]
指令l.sfeq的格式如表2-17所示。
表2-17 指令l.sfeq的格式

9.31~21bit位立即操作數(shù)比較設(shè)置標(biāo)識(shí)指令
31~21bit位立即操作數(shù)比較設(shè)置標(biāo)識(shí)指令是比較寄存器rA和立即操作數(shù),并將比較結(jié)果設(shè)置寄存器SR的F位,即設(shè)置SR[F],用來表示比較等式是否成立。
31~21bit位立即操作數(shù)比較設(shè)置標(biāo)識(shí)指令有l(wèi).sfgesi、l.sfgeui、l.sfgtsi、l.sfgtui、l.sflesi、l.sfleui、l.sfltsi、l.sfltui、l.sfnei。指令中的字符i表示立即操作數(shù)Immediate。
下面以指令l.sfeq為例說明指令格式。
指令l.sfeqi的作用如下:
如果相等,設(shè)置比較標(biāo)識(shí)。
指令l.sfeqi的書寫格式為:l.sfeqi rA,I
指令l.sfeqi的運(yùn)算方法如下:
SR[F] < - rA[31:0] == exts(Immediate)
指令l.sfeqi的格式如表2-18所示。
表2-18 指令l.sfeqi的格式

10.31~0bit位同步指令
31~0bit位同步指令是不需要參數(shù)的特殊指令,同步指令有l(wèi).csync、l.msync(內(nèi)存同步)、l.psync(流水線同步)。
下面以指令l.csync為例說明指令格式。
指令l.csync的作用如下:
上下文同步指令的執(zhí)行導(dǎo)致在處理器內(nèi)所有操作的完成和指令流水線的刷新。當(dāng)所有的操作完成時(shí),RISC核心假定有一個(gè)空的指令流水線,并刷新在所有單元(如MMU)的上下文。
指令l.csync的書寫格式為:l.csync
指令l.csync的運(yùn)算方法為:context syncronization()
指令l.csync的格式如表2-19所示。
表2-19 指令l.csync的格式

11.31~16bit位系統(tǒng)調(diào)用或陷阱指令
31~16bit位系統(tǒng)調(diào)用或陷阱指令有l(wèi).sys和l.trap(陷阱)。如果在SR寄存器中指定的位被設(shè)置時(shí),l.trap指令的執(zhí)行導(dǎo)致陷阱例外。陷阱例外是對(duì)操作系統(tǒng)的請(qǐng)求,或者請(qǐng)求調(diào)試設(shè)置執(zhí)行某一調(diào)試服務(wù)。立即數(shù)被用來選擇SR寄存器的哪個(gè)bit位被l.trap指令測試。
下面以指令l.sys為例說明指令格式。
指令l.sys的作用如下:
系統(tǒng)調(diào)用指令的執(zhí)行導(dǎo)致系統(tǒng)調(diào)用例外。系統(tǒng)調(diào)用例外是一個(gè)對(duì)操作系統(tǒng)提供系統(tǒng)服務(wù)的請(qǐng)求。立即值用來指定哪種服務(wù)被請(qǐng)求。可替代地,被ABI定義的GPR(通用寄存器)能被用來指令系統(tǒng)服務(wù)。
指令l.sys的書寫格式為:l.sys K。
指令l.sys的運(yùn)算方法如下:
system-call-exception(K)
指令l.sys的格式如表2-20所示。
表2-20 指令l.sys的格式

12.31~24bit位空操作指令
31~24bit位空操作指令l.nop說明如下:
指令l.nop的作用如下:
這條指令除了至少花費(fèi)一個(gè)時(shí)鐘周期外不做任何操作。它常被用來填充延遲槽間隙。立即數(shù)能被用做仿真目的。
指令l.nop的書寫格式為:l.nop K。
指令l.nop的運(yùn)算方法為:無。
指令l.nop的格式如表2-21所示。
表2-21 指令l.nop的格式

2.1.6 例外模型
例外(Exception)機(jī)制允許處理器由于在指令的執(zhí)行過程中外部信號(hào)、錯(cuò)誤或不常用條件的觸發(fā)導(dǎo)致切換到超級(jí)監(jiān)管者狀態(tài)。當(dāng)例外發(fā)生時(shí),有關(guān)處理器的狀態(tài)信息被存儲(chǔ)到某些寄存器,并且處理器開始在預(yù)定地址為每個(gè)例外運(yùn)行。例外的處理以超級(jí)監(jiān)管者模式開始。
OpenRISC 1000構(gòu)架對(duì)快速例外處理有特殊的支持,也稱快速上下文切換支持。這允許非常快速的中斷處理。這種快速通過通用寄存器和特殊寄存器的映像獲得。構(gòu)架要求所有例外按嚴(yán)格指令流相應(yīng)的次序被處理。當(dāng)一個(gè)指令引起的例外被識(shí)別到,任何出現(xiàn)在這個(gè)指令之前沒有執(zhí)行的指令被取消。
當(dāng)一個(gè)例外處理例程正在執(zhí)行時(shí)例外能發(fā)生,并且多個(gè)例外可能變成嵌套的。快速例外的支持允許例外的快速嵌套,直到所有的映像的寄存器被使用。如果上下文切換沒被使用,嵌套的例外應(yīng)該沒有發(fā)生。
1.例外分類
所有的例外能被描述成有精度的或沒有精度的,以及同步的或異步的。同步的例外由指令引起,異步的例外由外部對(duì)處理器的事件引起的。例外分類如表2-22所示。
表2-22 例外分類

無論何時(shí)一個(gè)例外發(fā)生,當(dāng)前PC被存到當(dāng)前的EPCR,并且新PC按照表2-23所示的向量地址被設(shè)置。
表2-23 例外類型和引起的條件

2.例外處理
當(dāng)一個(gè)例外發(fā)生時(shí),當(dāng)前/下一個(gè)PC被存儲(chǔ)到當(dāng)前的EPCR,除了如果當(dāng)前的指令在延遲槽中。如果PC指向延遲槽指令,PC-4被存儲(chǔ)到當(dāng)前的EPCR,并且SR[DSX]被設(shè)置。表2-24定義了當(dāng)前/下一個(gè)PC和有效的地址。
表2-24 在例外之后EPCR和EEAR的值。

SR被存儲(chǔ)到當(dāng)前的ESR。當(dāng)前的EPCR/ESR由SR[CID]鑒別。如果快速上下文切換沒有被使用,那么當(dāng)前的EPCR/ESR總是EPCR0/ESR0。
如果總線錯(cuò)誤、IMMU頁錯(cuò)誤、DMMU頁錯(cuò)誤、I-TLB失靶和D-TLB miss失靶這些例外之一發(fā)生時(shí),當(dāng)前的EEAR被用有效的地址設(shè)置。
如果使用了快速上下文切換,SR[CID]與新例外一起使用,這將導(dǎo)致使用一套新的映像寄存器。如果SR[CID]與當(dāng)前的例外一起溢出,range(范圍)例外被觸發(fā)。
然后,如果沒設(shè)置SR[CE],快速上下文切換將失效。這時(shí),必須首先存儲(chǔ)所有被例外處理例程修改的寄存器。所有的例外設(shè)置一個(gè)新SR,在這個(gè)新SR里,禁止了MMU(禁止了地址翻譯),打開了超級(jí)監(jiān)管者模式,并且禁止了Tick定時(shí)器例外和中斷。即SR[DME]=0,SR[IME]=0,SR[SM]=1,SR[IEE]=0和SR[TEE]=0。
當(dāng)例外處理例程存儲(chǔ)了足夠機(jī)器狀態(tài)信息時(shí),SR[TTE]和SR[IEE]再次激活,從而不阻塞Tick定時(shí)器和外部中斷。
當(dāng)l.rfe指令從一個(gè)例外處理例程返回時(shí),SR和PC被恢復(fù)。如果SR[CE]設(shè)置時(shí),CID將自動(dòng)遞減,并且恢復(fù)以前的機(jī)器狀態(tài)。另外,必須恢復(fù)以前被例外處理例程存儲(chǔ)的通用寄存器。
3.快速上下文切換(可選的)
快速上下文切換是在例外發(fā)生時(shí)降低寄存器存儲(chǔ)到堆棧的時(shí)間的一種技術(shù)。快速上下文切換僅能處理一種類型的例外,這樣它依賴于軟件指出引起例外的原因。使用軟件能快速處理中斷處理函數(shù)的調(diào)用和線程切換。硬件應(yīng)該有在一個(gè)時(shí)鐘周期內(nèi)切換上下文的能力。
上下文也能在一個(gè)例外期間切換,或者通過以超級(jí)監(jiān)管者模式使用寄存器CXR(上下文寄存器Context Register)。對(duì)所有上下文來說,CXR是一樣的。
(1)在超級(jí)監(jiān)管者模式改變上下文
讀/寫寄存器CXR由兩個(gè)部分組成,其中低16位代表當(dāng)前上下文寄存器集,高16位代表當(dāng)前的CID。不能在用戶模式訪問CCID;寫CCID將引起一個(gè)立即上下文改變;讀CCID將返回運(yùn)行(當(dāng)前的)上下文ID。在CID=0的上下文也稱為主上下文。上下文寄存器如表2-25所示。
表2-25 上下文寄存器(CXR)

CCRS有如下兩個(gè)功能。
■ 當(dāng)例外發(fā)生時(shí),它持有前一個(gè)CID;
■ 它被用來訪問其他上下文的寄存器。
(2)例外引起的上下文切換
當(dāng)一個(gè)例外發(fā)生并且激活了快速切換時(shí),CCID被復(fù)制到CCRS,并接著被設(shè)置到0,這樣切換到了主上下文。
主上下文的功能如下:
■ 在線程之間切換;
■ 處理例外;
■ 準(zhǔn)備、存儲(chǔ)CID到CID表或從CID表裝載、釋放CID。
CXR應(yīng)該盡可能快地存儲(chǔ)到一個(gè)通用寄存器,以便允許更多的例外嵌套。
表2-26顯示了一個(gè)樣例,說明怎樣使用CID表。通常,空閑的例外上下文不必相等的。
表2-26 多個(gè)上下文切換

表2-26中,裝載了4個(gè)線程上下文,并且軟件能以超級(jí)監(jiān)管者模式使用主上下文在它們之間自由切換。當(dāng)一個(gè)例發(fā)生時(shí),首先需要判斷引起例外的原因,并切換到下一個(gè)空閑例外上下文。因?yàn)槔饪赡鼙磺短祝虼诵枰懈嗟目臻e上下文。這樣為了切換一個(gè)新的例外,一些上下文需要被存儲(chǔ)到內(nèi)存。
在主上下文里處理上下文存儲(chǔ)/恢復(fù)和切換的算法應(yīng)盡可能簡單。它還應(yīng)該足夠的寄存器來存儲(chǔ)信息,這些信息包括當(dāng)前運(yùn)行的CID、下一個(gè)例外。線程周期信息、內(nèi)存中上下文表的指針、CXR的復(fù)制。
如果中斷號(hào)是重要的,可使用一些延遲中斷調(diào)用機(jī)制。主上下文算法應(yīng)該存儲(chǔ)中斷剛剛傳遞的I/O信息,以便后面運(yùn)行時(shí)使用,并且盡可能快地從主上下文返回。
(3)訪問其他上下文的寄存器
這種操作僅在超級(jí)監(jiān)管者模式下進(jìn)行。在基本指令集中,使用l.mtspr和l.mfspr指令訪問映像寄存器。
2.1.7 內(nèi)存管理
1.內(nèi)存模型
OpenRISC 1000使用弱次序內(nèi)存模型,以獲得較高的內(nèi)存效率,訪問次序由軟件來嚴(yán)格控制。頁設(shè)計(jì)為弱次序內(nèi)存(Weakly-Ordered-Memory)頁,能使用預(yù)取來亂序訪問指令和數(shù)據(jù)。內(nèi)存以字節(jié)單位用地址索引,以2字節(jié)邊界對(duì)齊、半字形式進(jìn)行訪問,單個(gè)字以4字節(jié)邊界對(duì)齊、雙字以8字節(jié)邊界對(duì)齊訪問。
內(nèi)存同步指令l.msync允許程序控制Load和Store操作執(zhí)行的次序,它確保程序發(fā)取的內(nèi)存訪問在下一個(gè)指令執(zhí)行前完成。
軟件信號(hào)量需要原子地訪問內(nèi)存,OpenRISC 1000構(gòu)架提供了兩個(gè)指令執(zhí)行讀-修改-寫操作,這兩個(gè)指令列出如下:
l.lwa rD,I(rA) l.swa I(rA),rB
指令l.lwa從內(nèi)存裝載單個(gè)字,并為一個(gè)后繼符合條件的存儲(chǔ)操作創(chuàng)建一個(gè)內(nèi)存位置的保留,一個(gè)編程不可見的特殊寄存器用來保存這個(gè)內(nèi)存位置的地址,用于原子地讀-修改-寫操作。
如果另外一個(gè)讀操作讀同一內(nèi)存位置,或者另一個(gè)l.lwa執(zhí)行或軟件清除保留寄存器,將取消為隨后的l.swa指令保留的內(nèi)存位置。
如果在相應(yīng)的l.swa執(zhí)行時(shí),內(nèi)存保留還有效,l.swa存儲(chǔ)通用寄存器rB到內(nèi)存,如果保留被取消,l.swa不執(zhí)行操作。
2.內(nèi)存管理
內(nèi)存管理涉及頁表結(jié)構(gòu)、MMU各種例外、MMU寄存器等,MMU組織和TLB大小等內(nèi)存硬件的設(shè)置不包括在體系結(jié)構(gòu)定義中,對(duì)OpenRISC 1000編程模型不可見。
OpenRISC 1000內(nèi)存管理單元(Memory Management Unit,MMU)主要特征有支持32位和64位有效地址、支持35位物理地址空間大小、三種不同的頁尺寸(32G、16M、8K字節(jié))、使用1~3級(jí)而表進(jìn)行地址翻譯、頁保護(hù)、支持并發(fā)多線程(simultaneous multi-threading,SMT)。
32GB的頁需要在64位地址下使用BD/I區(qū)域翻譯緩存(Area Translation Buffer,ATB)翻譯,16MB的頁需要使用D/I ATB翻譯,8KB頁需要使用D/I TLB(Translation Lookaside Buffer)。
MMU的主要功能是翻譯有效地址到物理地址,還提供基于頁的各種級(jí)別的訪問保護(hù)。OpenRISC 1000處理器需要取指令單元和數(shù)據(jù)訪問單元的地址翻譯,通常根據(jù)頁表將有效地址映射到物理地址。
TLB保存了最近使用的頁地址翻譯,ATB可以翻譯16MB和32GB的頁,如果TLB和ATB同時(shí)匹配同一個(gè)虛擬地址,將使用TLB。
32位有效地址(EA)的內(nèi)存分為Level 1和Level 2頁,基于二級(jí)頁表進(jìn)行翻譯。對(duì)于不需要最小8KB頁的虛擬內(nèi)存匹配可以使用一級(jí)頁表。32位有效地址的二級(jí)頁表映射如圖2-3所示。

圖2-3 內(nèi)存分為L1和L2頁
64位有效地址的內(nèi)存被分為Level 0、Level 1和Level 2頁,基于三級(jí)頁表進(jìn)行翻譯。64位有效地址的三級(jí)頁表映射如圖2-4所示。

圖2-4 內(nèi)存分成L0、L1和L2頁
TLB完成了有效地址到物理地址的翻譯,如果翻譯失敗將引發(fā)MMU例外。TLB失靶例外僅發(fā)生在用軟件進(jìn)行TLB重載的OpenRISC 1000處理器上。頁出錯(cuò)例外可能由頁表中的PTE或頁訪問保護(hù)引發(fā)。
MMU與例外處理機(jī)制一起給操作系統(tǒng)提供了使用以頁為單位的虛擬內(nèi)存環(huán)境。
2.1.8 高速緩存模型和高速緩存一致性
高速緩存管理寄存器的功能依賴于具體高速緩存的實(shí)現(xiàn)和內(nèi)存/高速緩存訪問屬性的設(shè)置。對(duì)于一個(gè)在OpenRISC 1000處理器應(yīng)用上運(yùn)行的程序來說,軟件應(yīng)該假定是Harvard高速緩存模型。在沒有高速緩存的處理器中,構(gòu)架應(yīng)保證對(duì)高速緩存寄存的寫不會(huì)停止軟件的執(zhí)行。例如,一個(gè)沒有高速緩存的處理器應(yīng)該簡單忽略對(duì)高速緩存管理寄存器的寫入。一個(gè)帶有Stanford高速緩存模型的處理器應(yīng)該簡單地忽略對(duì)指令高速緩存管理寄存器的寫入。
由高速緩存管理引起的內(nèi)存訪問不會(huì)留下記錄(不像Load/Store指令),并且不會(huì)引起例外。指令高速緩存不需要與內(nèi)存或其他處理器的高速緩存保持一致。軟件必須保證指令高速緩存中的指令與內(nèi)存中修改過的指令一致。典型方法有數(shù)據(jù)高速緩存阻塞回寫(內(nèi)存的更新)、使用l.csync指令等待更新完成、設(shè)置指令高速緩存塊無效(清除指令高速緩存阻塞)和刷新流水線。
1.?dāng)?shù)據(jù)高速緩存管理
(1)數(shù)據(jù)高速緩存塊預(yù)取(可選的)
數(shù)據(jù)高速緩存塊預(yù)支取寄存器(DCBPR)可以控制將內(nèi)存的數(shù)據(jù)塊預(yù)取到高速緩存,內(nèi)存訪問不被記錄(不像Load/Store指令),不能引起任何例外。數(shù)據(jù)高速緩存塊預(yù)取可提高執(zhí)行效率。
(2)數(shù)據(jù)高速緩存塊刷新
數(shù)據(jù)高速緩存塊刷新寄存器(DCBFR)可以控制數(shù)據(jù)高速緩存塊的刷新,對(duì)于有內(nèi)存一致性要求的處理方法如下:
■ 未被修改的數(shù)據(jù)高速緩存塊在所有的處理器無效。
■ 被修改的數(shù)據(jù)高速緩存塊被寫回到內(nèi)存,并且數(shù)據(jù)高速緩存塊在所有的處理器無效。
■ 在本地處理器上失靶的數(shù)據(jù)高速緩存塊,引起在其他處理器的被修改高速緩存數(shù)據(jù)塊寫回到內(nèi)存,并設(shè)置緩存塊為無效。如果其他處理器存在沒有修改的數(shù)據(jù)高速緩存塊,則緩存塊僅在所有的處理器被置為無效。
不要求內(nèi)存一致性的處理方法如下:
■ 未被修改的數(shù)據(jù)高速緩存塊在本地的處理器上被置為無效。
■ 修改過的數(shù)據(jù)高速緩存塊被寫回到內(nèi)存,并在本地的處理器上置為無效。
■ 在本地的處理器上失靶的高速緩存塊不引起任何動(dòng)作。
(3)數(shù)據(jù)高速緩存塊無效
數(shù)據(jù)高速緩存塊無效寄存器(DCBIR)用來控制數(shù)據(jù)高速緩存塊無效的處理方法,要求內(nèi)存一致性的處理方法如下:
■ 未被修改的數(shù)據(jù)高速緩存塊在所有的處理器無效。
■ 被修改的數(shù)據(jù)高速緩存塊在所有的處理器無效。
■ 在本地的處理器上失靶的數(shù)據(jù)高速緩存塊,引起其他處理器上的數(shù)據(jù)高速緩存塊失效。
不要求內(nèi)存一致性的處理方法如下:
■ 未被修改的數(shù)據(jù)高速緩存塊在所有的處理器無效。
■ 被修改的數(shù)據(jù)高速緩存塊無效。
■ 在本地的處理器上失靶的高速緩存塊不引起任何動(dòng)作。
(4)數(shù)據(jù)高速緩存塊回寫
數(shù)據(jù)高速緩存塊回寫寄存器(DCBWBR)控制數(shù)據(jù)高速緩存塊的回寫操作,如果要求內(nèi)存一致性,那么在任何處理器中修改過的數(shù)據(jù)高速緩存塊應(yīng)被寫回到內(nèi)存。如果不要求內(nèi)存一致性,那么本地處理器中修改過的數(shù)據(jù)高速緩存被寫回到內(nèi)存。
(5)數(shù)據(jù)高速緩存塊鎖存(可選的)
數(shù)據(jù)高速緩存塊鎖寄存器(DCBLR)是用來鎖住本地處理器上的數(shù)據(jù)高速緩存塊,如果所有的高速緩存通道上同一設(shè)置的所有塊被鎖住,那么,高速緩存重填充可以自動(dòng)解鎖最近最少使用的塊。
2.指令高速緩存管理
(1)指令高速緩存塊預(yù)取(可選的)
指令高速緩存塊預(yù)取寄存器(ICBPR)控制指令的預(yù)取操作,將內(nèi)存的指令塊預(yù)取到指令高速緩存,提高了CPU執(zhí)行效率。
(2)指令高速緩存塊無效
指令高速緩存塊無效寄存器(ICBIR)是控制指令高速緩存塊無效時(shí)的操作,如果要求內(nèi)存一致性,那么所有處理器中相應(yīng)的指令高速緩存塊被置為無效。如果不要求內(nèi)存一致性,那么本地處理器中相應(yīng)的指令高速緩存塊被置為無效。
(3)指令高速緩存塊鎖存(可選的)
指令高速緩存塊鎖寄存器(ICBLR)用來鎖住本地處理器上的相應(yīng)的指令高速緩存塊。如果所有的高速緩存通道上同一設(shè)置的塊被鎖住,那么,高速緩存重填充可以自動(dòng)解鎖最近最少使用的塊。本地處理器上高速緩存塊的失靶不引起任何動(dòng)作。
3.高速緩存/內(nèi)存一致性
高速緩存一致性系統(tǒng)的主要角色是與其他高速緩存及與內(nèi)存同步高速緩存,并提供同一內(nèi)存的映像給使用這個(gè)內(nèi)存的設(shè)備。
構(gòu)架提供了幾個(gè)特征使用高速緩存一致性。在不提供與PTE屬性(如沒有使用內(nèi)存管理單元)進(jìn)行高速緩存一致性的系統(tǒng)中,高速緩存一致性可通過外在明確的高速緩存管理來提供。
系統(tǒng)中通過PTE(Page Table Entry,頁表?xiàng)l目)的屬性設(shè)置在頁到頁基礎(chǔ)上提供高速緩存與虛擬內(nèi)存的一致性。這些屬性具體如下:
■ 是否高速緩存一致性(CC屬性位Cache Coherent Attribute)
■ 是否繼承的高速緩存(CI屬性位Caching-Inhibited Attribute)
■ 是否回寫高速緩存(WBC屬性位Write-Back Cache Attribute)
當(dāng)內(nèi)存/高速緩存屬性被改變,高速緩存應(yīng)該反映新的屬性設(shè)置,這通常意味著高速緩存塊應(yīng)該被刷新或置為無效的。
(1)指定作高速緩存一致性的頁
在硬件執(zhí)行高速緩存一致性相對(duì)慢的系統(tǒng)里,這個(gè)屬性可改進(jìn)系統(tǒng)的執(zhí)行性。不需要高速緩存一致性的頁設(shè)置CC=0,需要高速緩存一致性的頁設(shè)置CC=1。當(dāng)一個(gè)對(duì)共享資源的訪問發(fā)生時(shí),本地處理器將聲明一些高速緩存一致性信號(hào),并且如果其他處理器的高速緩存中有目標(biāo)位置的復(fù)制時(shí),它們將做出反應(yīng)。
為了改進(jìn)單處理器系統(tǒng)的執(zhí)行性能,內(nèi)存頁不應(yīng)該指定為CC=1。
(2)指定作為高速緩存繼承的頁
指定CI=1的內(nèi)存頁在內(nèi)存訪問時(shí)總是直接進(jìn)入主內(nèi)存,而忽略所有的高速緩存;指定CI=1的頁不裝進(jìn)高速緩存,并且目標(biāo)內(nèi)容在高速緩存中應(yīng)該永不可用。為了阻止在高速緩存中目標(biāo)位置的任何意外復(fù)制,無論何時(shí)操作系統(tǒng)設(shè)置一個(gè)內(nèi)存頁為高速緩存繼承,它應(yīng)該刷新相應(yīng)的高速緩存塊。
除了單個(gè)訪問被l.msync或l.csync或l.psync分開外,多個(gè)訪問可以被融合成聯(lián)合的訪問。
(3)指定作回寫高速緩存頁的頁
指定WBC=0的內(nèi)存頁在Store操作時(shí),Store操作在數(shù)據(jù)高速緩存和內(nèi)存中同時(shí)執(zhí)行。如果一個(gè)系統(tǒng)使用了多級(jí)高速緩存,Store操作必須至少在其他處理器或設(shè)備感知到的內(nèi)存體系中進(jìn)行。
除了單個(gè)Store操作被l.msync或l.csync或l.psync分開外,多個(gè)Store操作可以融合成聯(lián)合的Store操作。一個(gè)Store操作可能引起高速緩存塊任何部分寫回到主內(nèi)存。
指定WBC=1的內(nèi)存頁在Store訪問操作時(shí)僅對(duì)本地?cái)?shù)據(jù)高速緩存進(jìn)行。當(dāng)要求進(jìn)行復(fù)制回(copy-back)操作時(shí),來自本地的數(shù)據(jù)高速緩存的數(shù)據(jù)能被復(fù)制到其他的高速緩存和主存。WBC=1改進(jìn)了系統(tǒng)執(zhí)行性能,然而,它要求在數(shù)據(jù)高速緩存控制器中,高速緩存支持偵聽硬件,以保證高速緩存的一致性。
2.1.9 調(diào)試單元
調(diào)試單元協(xié)助軟件開發(fā)者調(diào)試他們的系統(tǒng)。它提供了Watchpoints、Breakpoints和程序流控制寄存器。Watchpoint和Breakpoint是程序或數(shù)據(jù)流匹配被編程在調(diào)試寄存器里的條件觸發(fā)的事件。
Watchpoints除了當(dāng)引起一個(gè)Breakpoint影響程序執(zhí)行外,不干預(yù)程序流的執(zhí)行。Watchpoints能被執(zhí)行計(jì)數(shù)單元(Performance Counters Unit)計(jì)數(shù)。
Breakpoint不像Watchpoint,它還掛起當(dāng)前程序流的執(zhí)行,并開始陷阱例外處理。Breakpoint是Watchpoints的可選結(jié)果。
OpenRISC 1000構(gòu)架定義了8套調(diào)試寄存器集。附加的調(diào)試寄存器集能被構(gòu)架應(yīng)用的RISC本身所定義。調(diào)試單元是可選的,并且調(diào)試單元的出現(xiàn)是由寄存器UPR[DUP]位來指明的。調(diào)試單元的特征列出如下:
● 可選的構(gòu)架應(yīng)用。
● 8個(gè)構(gòu)架定義的調(diào)試值/比較寄存器集。
● 在指令支取EA、Load/Store EA和Load/Store數(shù)據(jù)上匹配有符號(hào)/無符號(hào)的條件。
● 為復(fù)雜的Watchpoints組合匹配條件。
● Watchpoints能被執(zhí)行計(jì)數(shù)單元計(jì)數(shù)。
● Watchpoints能產(chǎn)生斷點(diǎn)(陷阱例外)。
● 給附加的Watchpoint產(chǎn)生計(jì)數(shù)Watchpoints。
DVR/DCR寄存器用來將支取或LoadStore EA和Load/Store數(shù)據(jù)指令與存儲(chǔ)在DVR中的值進(jìn)行比較。Watchpoints能作為Breakpoint計(jì)數(shù)和報(bào)告。
2.1.10 執(zhí)行計(jì)數(shù)單元
執(zhí)行計(jì)數(shù)器能被用來給諸如L1指令或數(shù)據(jù)高速緩存失靶、分支指令、流水線停止這樣的預(yù)定義事件計(jì)數(shù)。來自執(zhí)行計(jì)數(shù)器單元的數(shù)據(jù)能用做下面的目的。
● 通過開發(fā)較好的應(yīng)用程序級(jí)算法、優(yōu)化操作系統(tǒng)例程改進(jìn)執(zhí)行性能,并改進(jìn)這些系統(tǒng)的硬件結(jié)構(gòu)(如內(nèi)存子系統(tǒng))。
● 改進(jìn)將來OpenRISC 1000,并增加將來的增強(qiáng)到OpenRISC構(gòu)架。
● 幫助系統(tǒng)開發(fā)者調(diào)試和測試他們的系統(tǒng)。
OpenRISC 1000構(gòu)架定義了8個(gè)執(zhí)行計(jì)數(shù)器,還可定義補(bǔ)充的執(zhí)行計(jì)數(shù)器。
2.1.11 電源管理
OpenRISC 1000構(gòu)架定義5種特征減少電源消耗,列出如下:
● 減速(slow down)特征
● 小睡(doze)模式
● 睡眠(sleep)模式
● 掛起(suspend)模式
● 動(dòng)態(tài)時(shí)鐘調(diào)速(dynamic clock gating)特征
slow down特征在外部時(shí)鐘產(chǎn)生電路降低頻率,從而降低電源消耗。通常在操作系統(tǒng)空閑時(shí)設(shè)置。
當(dāng)軟件激活了doze模式,則軟件進(jìn)程被掛起,處理器內(nèi)部單元的時(shí)鐘被關(guān)閉,除了內(nèi)部的Tick定時(shí)器和可編程中斷外。然而,處理器以外的片上模塊繼續(xù)正常工作。當(dāng)一個(gè)中斷發(fā)生時(shí),處理器應(yīng)從doze模式進(jìn)入正常模式。
在睡眠狀態(tài),所有的處理器內(nèi)部單元被關(guān)閉,時(shí)鐘減速,還可降低處理器電壓。當(dāng)一個(gè)中斷發(fā)生時(shí),處理器從睡眠狀態(tài)進(jìn)入正常狀態(tài)。
在suspend模式,所有的處理器內(nèi)部單元被關(guān)閉,時(shí)鐘減速,還可降低處理器電壓。當(dāng)處理器復(fù)位時(shí),處理器從suspend狀態(tài)進(jìn)入正常狀態(tài)。軟件可使用復(fù)位例外處理函數(shù)更新系統(tǒng)內(nèi)存,并用suspend之前的狀態(tài)更新RISC。
如果激活了時(shí)鐘調(diào)速特征,則自動(dòng)關(guān)閉處理器內(nèi)部單元的時(shí)鐘子樹,如PU/VU、IC、DC、IMMU和DMMU單元。
2.1.12 可編程中斷控制器
OpenRISC 1000構(gòu)架定義了一個(gè)可支持32個(gè)中斷輸入的中斷控制器,它通過掩碼寄存器(PIC Mask Register,PICMR)和狀態(tài)寄存器(PIC Status Register,PICSR)來控制可掩碼的32個(gè)中斷輸入。如圖2-5所示為可編程中斷控制器的功能框圖,32位中斷輸出后,經(jīng)PICMR的掩碼操作,決定哪些中斷是可用的,并傳送到處理器觸發(fā)中斷例外,同時(shí),中斷的狀態(tài)保存在寄存器PICSR中。

圖2-5 可編程中斷控制器框圖
2.1.13 Tick定時(shí)器
Tick定時(shí)器用來作為調(diào)度操作系統(tǒng)和用戶任務(wù)的時(shí)間基或高精度時(shí)間參考,每個(gè)時(shí)鐘周期定時(shí)計(jì)數(shù)寄存器(Tick Timer Count Register,TTCR)加1,當(dāng)計(jì)數(shù)值達(dá)到模式寄存器(Tick Timer Mode Register,TTMR)設(shè)定值,觸發(fā)中斷。Tick定時(shí)器框圖如圖2-6所示。

圖2-6 Tick定時(shí)器框圖
Tick定時(shí)器最大定時(shí)為2^32個(gè)時(shí)鐘,中斷之間最大時(shí)間周期為2^28個(gè)時(shí)鐘,時(shí)鐘可以掩碼,可提供單個(gè)運(yùn)行、可重啟動(dòng)計(jì)數(shù)器或連接計(jì)數(shù)器。
- 演進(jìn)式架構(gòu)(原書第2版)
- Moodle Administration Essentials
- Manga Studio Ex 5 Cookbook
- 跟“龍哥”學(xué)C語言編程
- AngularJS深度剖析與最佳實(shí)踐
- C語言最佳實(shí)踐
- 深度學(xué)習(xí):算法入門與Keras編程實(shí)踐
- Hands-On Enterprise Automation with Python.
- Essential C++(中文版)
- Scratch趣味編程:陪孩子像搭積木一樣學(xué)編程
- Emgu CV Essentials
- 大學(xué)計(jì)算機(jī)基礎(chǔ)實(shí)驗(yàn)指導(dǎo)
- 玩轉(zhuǎn).NET Micro Framework移植:基于STM32F10x處理器
- Angular Design Patterns
- Oracle Database XE 11gR2 Jump Start Guide