1. 前言
RISC-V旨在支持廣泛的定制和專業(yè)化。RISC-V的ISA是由一個(gè)基本整型ISA和其它對(duì)基本ISA的可選擴(kuò)展組成。每個(gè)整型ISA可以使用一個(gè)或多個(gè)可選的ISA擴(kuò)展進(jìn)行擴(kuò)展。
基本整型ISA精選了最小的一組指令,這些指令足以為編譯器、匯編器、鏈接器和操作系統(tǒng)提供足夠的功能,它提供了一組便利的ISA和軟件工具鏈骨架,可以圍繞它構(gòu)建更多定制的處理器ISA?;菊虸SA與早期RISC處理器非常類似,除了沒(méi)有分支延遲槽(branch delay slot)和可選的變長(zhǎng)指令編碼(Variable-length instruction encoding)。
2. RISC-V基本整型ISA
雖然RISC-V ISA說(shuō)起來(lái)方便,但RISC-V實(shí)際上是一個(gè)ISA集合,目前確定的有四個(gè)基本ISA。每個(gè)基本整型ISA的特征是整型寄存器的寬度、相應(yīng)的地址空間的大小以及整型寄存器的數(shù)量。RV32I和RV64I是兩個(gè)主要的基本整型ISA變體,分別提供32-bit和64-bit地址空間,用術(shù)語(yǔ)XLEN來(lái)表示以bit為單位的整型寄存器的寬度,它的值為32或64。RV32E和RV64E分別是RV32I和RV64I基本ISA的子集變體,它們用于支持小型微控制器,并且具有一半數(shù)目的整型寄存器。另外還有一個(gè)未確定的基本ISA是RV128I(XLEN=128)。
RISC-V之所以分成4個(gè)基本整型ISA,而不是做成一個(gè)統(tǒng)一的ISA。主要的優(yōu)勢(shì)是,每個(gè)基本ISA都可以根據(jù)自己的需要進(jìn)行優(yōu)化,而不需要支持其它基本ISA所需的所有操作。例如,RV64I可以省略只用于處理RV32I中較窄的寄存器的指令和CSR。RV32I可以使用只保留給更寬地址空間變體所需的指令的編碼空間。主要缺點(diǎn)是,它使一個(gè)基本ISA在另一個(gè)基本ISA平臺(tái)上模擬所需的硬件復(fù)雜化,例如,在RV64I上模擬RV32I。
3. RISC-V ISA的可選擴(kuò)展
任何RISC-V處理器實(shí)現(xiàn)都必須支持基本整型ISA (RV32I、RV32E、RV64I、RV64E或RV128I)。此外,一個(gè)實(shí)現(xiàn)可以支持一個(gè)或多個(gè)擴(kuò)展。RISC-V ISA中,標(biāo)記為“Ratified”的模塊,表示此時(shí)已被批準(zhǔn);標(biāo)記為“Frozen”的模塊,表示在被批準(zhǔn)之前,預(yù)計(jì)也不會(huì)發(fā)生重大變化;標(biāo)記為“Draft”的模塊,表示在被批準(zhǔn)之前,預(yù)計(jì)會(huì)發(fā)生變化。
擴(kuò)展(extension)可以被分類為標(biāo)準(zhǔn)(standard)、定制(custom)和不符合(non-conforming)。為此,我們將每個(gè)RISC-V ISA編碼空間(以及相關(guān)的編碼空間,如CSR)劃分為三個(gè)互不關(guān)聯(lián)的類別:標(biāo)準(zhǔn)(standard)、保留(reserved)和定制(custom)。
標(biāo)準(zhǔn)擴(kuò)展和編碼是由RISC-V國(guó)際組織定義的。任何擴(kuò)展不是由RISC-V國(guó)際組織定義的都算是非標(biāo)準(zhǔn)的。每個(gè)基本ISA及其標(biāo)準(zhǔn)擴(kuò)展僅使用標(biāo)準(zhǔn)編碼,并且在使用這些編碼時(shí)不得相互沖突。
保留編碼目前沒(méi)有定義,但為將來(lái)的標(biāo)準(zhǔn)擴(kuò)展保留,一旦被使用,它們就稱為標(biāo)準(zhǔn)編碼。
定制編碼永遠(yuǎn)不會(huì)用于標(biāo)準(zhǔn)擴(kuò)展,而只能用于特定于供應(yīng)商的非標(biāo)準(zhǔn)擴(kuò)展。非標(biāo)準(zhǔn)擴(kuò)展要么是只使用定制編碼的定制擴(kuò)展,要么是使用任何標(biāo)準(zhǔn)或保留編碼的不符合擴(kuò)展。
指令集擴(kuò)展通常是共享的,但可能根據(jù)基本ISA提供略有不同的功能。
上述擴(kuò)展可以進(jìn)一步分為兩大類:標(biāo)準(zhǔn)(standard)和非標(biāo)準(zhǔn)(non-standard,包括定制和不符合)。
標(biāo)準(zhǔn)擴(kuò)展通常是有用的,并且不與任何其他標(biāo)準(zhǔn)擴(kuò)展相沖突。目前,RISC-V手冊(cè)中描述的“MAFDQLCBTPV”擴(kuò)展要么是完成的,要么是計(jì)劃中的標(biāo)準(zhǔn)擴(kuò)展。
非標(biāo)準(zhǔn)擴(kuò)展可能是高度專門化的,并且可能與其他標(biāo)準(zhǔn)或非標(biāo)準(zhǔn)擴(kuò)展相沖突。預(yù)計(jì)隨著時(shí)間的推移會(huì)開(kāi)發(fā)出各種各樣的非標(biāo)準(zhǔn)擴(kuò)展,其中一些最終會(huì)被提升為標(biāo)準(zhǔn)擴(kuò)展。
4. ISA命名規(guī)范
RISC-V ISA旨在支持各種指令集擴(kuò)展的各種實(shí)現(xiàn),有組織的命名方案簡(jiǎn)化了軟件工具和文檔,RISC-V ISA擴(kuò)展命名方案可以簡(jiǎn)潔地描述硬件實(shí)現(xiàn)中的ISA。ISA命名字符串不區(qū)分大小寫。
RISC-V ISA命名組成為:基本整型ISA名 + 標(biāo)準(zhǔn)擴(kuò)展名 + 非標(biāo)準(zhǔn)擴(kuò)展名
4.1 基本整型ISA
RISC-V ISA字符串以RV32I、RV32E、RV64I、RV64E或RV128I開(kāi)頭,表示支持的基本整型ISA的地址空間大小(以bit為單位)。
4.2 標(biāo)準(zhǔn)擴(kuò)展名
標(biāo)準(zhǔn)ISA擴(kuò)展由一個(gè)單個(gè)字母組成的名稱。例如:“M”表示整型乘法和除法,“A”表示原子訪存指令,“F”表示單精度浮點(diǎn)指令,“D”表示雙精度浮點(diǎn)指令。任何RISC-V指令集變體都可以通過(guò)將基本整型前綴與包含的擴(kuò)展名連接起來(lái)簡(jiǎn)潔描述。例如:RV64IMAFD。
一些ISA擴(kuò)展依賴于其他擴(kuò)展的存在,例如,“D”依賴于“F”,“F”依賴于“Zicsr”。這些依賴關(guān)系可能隱含在ISA名稱中。例如,RV32IF等價(jià)于RV32IFZicsr, RV32ID等價(jià)于RV32IFD和RV32IFDZicsr。
指令集可能隨著時(shí)間的推移而擴(kuò)展或改變,需要在擴(kuò)展名后面加上擴(kuò)展版本號(hào)。版本號(hào)分為主版本號(hào)和次版本號(hào),用“p”分隔。如果次要版本為“0”,則可以從版本字符串中省略“p0”。主版本號(hào)的更改意味著向后兼容性的喪失,而僅小版本號(hào)的更改必須向后兼容。例如,“RV64I1p0M1p0A1p0F1p0D1p0”和“RV64I1M1A1F1D1”的含義是一樣的。
為了提高可讀性并消除歧義,引入下劃線“_”可用于分隔ISA擴(kuò)展,例如:“RV32I2_M2_A2”。
4.3 其他標(biāo)準(zhǔn)擴(kuò)展名
標(biāo)準(zhǔn)擴(kuò)展也可以使用一個(gè)“Z”來(lái)命名,后面跟著一個(gè)字母名稱和一個(gè)可選的版本號(hào)。例如,“Zifencei”命名了instruction-fetch fence擴(kuò)展,且“Zifencei2”與“Zifencei2p0”名稱版本相同。
“Z”后面的第一個(gè)字母通常表示最密切相關(guān)的字母擴(kuò)展類別(類別有IMAFDQCVH)。例如,對(duì)于用于附加浮點(diǎn)指令的“Zfa”擴(kuò)展,字母“f”表示該擴(kuò)展與“f”標(biāo)準(zhǔn)擴(kuò)展相關(guān)。如果命名了多個(gè)“Z”擴(kuò)展名,它們應(yīng)該首先按類別排序,然后按類別中的字母順序排序——例如,“Zicsr_Zifencei_Zam”。
所有多字母擴(kuò)展名,包括以“Z”為前綴的擴(kuò)展名,必須用下劃線與其他多字母擴(kuò)展名分開(kāi),例如“RV32IMACZicsr_Zifencei”。
4.4 非標(biāo)準(zhǔn)擴(kuò)展名
非標(biāo)準(zhǔn)擴(kuò)展使用單個(gè)“X”命名,后跟字母名稱和可選的版本號(hào)。例如:“Xhwacha”命名了Hwacha vector-fetch ISA擴(kuò)展;“Xhwacha2”與“Xhwacha2p0”名稱2.0版本相同。
非標(biāo)準(zhǔn)擴(kuò)展必須列在所有標(biāo)準(zhǔn)擴(kuò)展之后,并且與其它多字母擴(kuò)展一樣,必須用下劃線與其他多字母擴(kuò)展分開(kāi)。例如:帶有非標(biāo)準(zhǔn)擴(kuò)展名Argle和Bargle的ISA可以命名為“RV64IZifencei_Xargle_Xbargle”。
如果列出了多個(gè)非標(biāo)準(zhǔn)擴(kuò)展,則應(yīng)按字母順序排列。
下表列出了一部分標(biāo)準(zhǔn)的擴(kuò)展名,表還定義了擴(kuò)展名必須在ISA名稱字符串中出現(xiàn)的規(guī)范順序,表中越往上出現(xiàn)在ISA名稱字符串中的位置需要越靠前,例如,RV32IMACV是合法的,而RV32IMAVC是非法的,因此C必須在V之前。