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