RISC-V架构生态及相关学习记录
從網(wǎng)絡(luò)整理,僅供自己學(xué)習(xí)
_____________________________________________________________________________
1.RISC-V架構(gòu)的兩個(gè)特性
RISC-V,第五代精簡指令處理器。
RISC-V指令集,可以在理解上類比于主流商用Inter的x86,ARM的指令集,用于CPU讀取、翻譯從而指揮計(jì)算機(jī)進(jìn)行相應(yīng)操作。它在RISC(基于精簡指令集計(jì)算)的原理上不斷發(fā)展,建立起完全開源的ISA架構(gòu)(開放指令架構(gòu))。
與x86、ARM這種成熟的商業(yè)架構(gòu)相比,RISC-V指令集成除開源之外,另一個(gè)最大的優(yōu)勢就是其模塊化的架構(gòu):根據(jù)具體場景選擇指令集中模塊的組合,以最小的系統(tǒng)代價(jià)滿足不同應(yīng)用。譬如針對(duì)于小面積低功耗嵌入式場景,用戶可以選擇 RV32IC 組合的指令集,僅使用 Machine Mode(機(jī)器模式);而高性能應(yīng)用操作系統(tǒng)場景則可以選擇譬如 RV32IMFDC 的指令集,使用 Machine Mode(機(jī)器模式)與 User Mode(用戶模式)兩種模式。而他們共同的部分則可以相互兼容。
短小精悍的架構(gòu)以及模塊化的哲學(xué),使得 RISC-V 架構(gòu)的指令數(shù)目非常的簡潔。基本的 RISC-V 指令數(shù)目僅有 40 多條,加上其他的模塊化擴(kuò)展指令總共幾十條指令,但基于RISC-V指令集架構(gòu)可以設(shè)計(jì)服務(wù)器CPU、家用電器CPU、工控CPU和傳感器中的CPU,應(yīng)用前景十分廣泛。
2.RISC-V指令集特性
2.1 模塊化的指令集
RISC-V模塊化的意義在于它是由一個(gè)強(qiáng)制性的基本ISA和許多ISA擴(kuò)展組成。
RISC-V的指令集使用模塊化的方式進(jìn)行組織,每一個(gè)模塊使用一個(gè)英文字母來表示。
RISC-V最基本也是唯一強(qiáng)制要求實(shí)現(xiàn)的指令集部分是由I字母表示的基本整數(shù)指令子集,使用該整數(shù)指令子集,便能夠?qū)崿F(xiàn)完整的軟件編譯器。
| 基本指令集 | 指令數(shù) | 描述 |
| RV32I | 47 | 32位地址空間與整數(shù)指令,支持32個(gè)通用整數(shù)寄存器 |
| RV32E | 47 | RV32I的子集,僅支持16個(gè)通用整數(shù)寄存器 |
| RV64I | 59 | 64位地址空間與整數(shù)指令,及一部分32位的整數(shù)指令 |
| RV128I | 71 | 128位地址空間與整數(shù)指令,及一部分64位和32位的指令 |
其他的指令子集部分均為可選的模塊,具有代表性的模塊包括M/A/F/D/C。
為了提高代碼密度,RISC-V架構(gòu)也提供可選的“壓縮”指令子集,由英文字母C表示。壓縮指令的指令編碼長度為16比特,而普通的非壓縮指令的長度為32比特。以上這些模塊的一個(gè)特定組合“IMAFD”,也被稱為“通用”組合,由英文字母G表示。因此RV32G表示RV32IMAFD,同理RV64G表示RV64IMAFD。
| 擴(kuò)展指令集 | 指令數(shù) | 描述 |
| M | 8 | 整數(shù)乘法與除法指令 |
| A | 11 | 存儲(chǔ)器原子(Atomic)操作指令和Load-Reserved/Store-Conditional指令 |
| F | 26 | 單精度(32bit)浮點(diǎn)指令 |
| D | 26 | 雙精度(64bit)浮點(diǎn)指令,必須支持F擴(kuò)展指令 |
| C | 46 | 壓縮指令,指令長度為16位 |
通過以上的模塊化指令集,能夠選擇不同的組合來滿足不同的應(yīng)用。譬如,追求小面積低功耗的嵌入式場景可以選擇使用RV32EC架構(gòu);而大型的64位架構(gòu)則可以選擇RV64G。
除了以上模塊,還有一些擴(kuò)展在不斷完善和進(jìn)行。
2.2 可配置的通用寄存器組
RISC-V架構(gòu)支持32位或者64位的架構(gòu),32位架構(gòu)由RV32表示,其每個(gè)通用寄存器(Register File,Regfile)的寬度為32比特;64位架構(gòu)由RV64表示,其每個(gè)通用寄存器的寬度為64比特。
RISC-V架構(gòu)的整數(shù)通用寄存器組,包含32個(gè)(I架構(gòu))或者16個(gè)(E架構(gòu))通用整數(shù)寄存器,其中整數(shù)寄存器0被預(yù)留為常數(shù)0,其他的31個(gè)(I架構(gòu))或者15個(gè)(E架構(gòu))為普通的通用整數(shù)寄存器。
如果使用了浮點(diǎn)模塊(F或者D),則需要另外一個(gè)獨(dú)立的浮點(diǎn)寄存器組,包含32個(gè)通用浮點(diǎn)寄存器。如果僅使用F模塊的浮點(diǎn)指令子集,則每個(gè)通用浮點(diǎn)寄存器的寬度為32比特;如果使用了D模塊的浮點(diǎn)指令子集,則每個(gè)通用浮點(diǎn)寄存器的寬度為64比特。
2.3?規(guī)整的指令編碼
在流水線中能夠盡早盡快的讀取通用寄存器組,往往是處理器流水線設(shè)計(jì)的期望之一,這樣可以提高處理器性能和優(yōu)化時(shí)序。RISC-V的指令集編碼非常的規(guī)整,指令所需的通用寄存器的索引(Index)都被放在固定的位置,因此指令譯碼器(Instruction Decoder)可以非常便捷的譯碼出寄存器索引然后讀取通用寄存器組。
?2.4?簡潔的存儲(chǔ)器訪問指令
與所有的RISC處理器架構(gòu)一樣,RISC-V架構(gòu)使用專用的存儲(chǔ)器讀(Load)指令和存儲(chǔ)器寫(Store)指令訪問存儲(chǔ)器(Memory),其他的普通指令無法訪問存儲(chǔ)器。
存儲(chǔ)器訪問的基本單位是字節(jié)(Byte)。RISC-V的存儲(chǔ)器讀和存儲(chǔ)器寫指令支持一個(gè)字節(jié)(8位),半字(16位),單字(32位)為單位的存儲(chǔ)器讀寫操作,如果是64位架構(gòu)還可以支持一個(gè)雙字(64位)為單位的存儲(chǔ)器讀寫操作。
-
為了提高存儲(chǔ)器讀寫的性能,RISC-V架構(gòu)推薦使用地址對(duì)齊的存儲(chǔ)器讀寫操作(地址非對(duì)齊的存儲(chǔ)器操作也支持)。處理器可以選擇用硬件來支持,也可以選擇用軟件來支持。
-
RISC-V架構(gòu)僅支持小端格式。
-
RISC-V架構(gòu)的存儲(chǔ)器讀和存儲(chǔ)器寫指令不支持地址自增自減的模式。
-
RISC-V架構(gòu)采用松散存儲(chǔ)器模型(Relaxed Memory Model)。(松散存儲(chǔ)器模型對(duì)于訪問不同地址的存儲(chǔ)器讀寫指令的執(zhí)行順序不作要求,除非使用明確的存儲(chǔ)器屏障(Fence)指令加以屏蔽)
2.5 高效的分支跳轉(zhuǎn)指令/中斷
RISC-V架構(gòu)有兩條無條件跳轉(zhuǎn)指令(Unconditional Jump),jal與jalr指令。
跳轉(zhuǎn)鏈接(Jump and Link)指令jal可用于進(jìn)行子程序調(diào)用,同時(shí)將子程序返回地址存在鏈接寄存器(Link Register:由某一個(gè)通用整數(shù)寄存器擔(dān)任)中。跳轉(zhuǎn)鏈接寄存器(Jump and Link-Register)指令jalr指令能夠用于子程序返回指令,通過將jal指令(跳轉(zhuǎn)進(jìn)入子程序)保存的鏈接寄存器用于jalr指令的基地址寄存器,則可以從子程序返回。
RISC-V架構(gòu)有6條帶條件跳轉(zhuǎn)指令(Conditional Branch)
帶條件的跳轉(zhuǎn)指令跟普通的運(yùn)算指令一樣直接使用2個(gè)整數(shù)操作數(shù),然后對(duì)其進(jìn)行比較,如果比較的條件滿足時(shí),則進(jìn)行跳轉(zhuǎn)。因此,此類指令將比較與跳轉(zhuǎn)兩個(gè)操作放到了一條指令里完成。
對(duì)于沒有配備硬件分支預(yù)測器的低端CPU,為了保證其性能,RISC-V的架構(gòu)明確要求其采用默認(rèn)的靜態(tài)分支預(yù)測機(jī)制,即:如果是向后跳轉(zhuǎn)的條件跳轉(zhuǎn)指令,則預(yù)測為“跳”;如果是向前跳轉(zhuǎn)的條件跳轉(zhuǎn)指令,則預(yù)測為“不跳”,并且RISC-V架構(gòu)要求編譯器也按照這種默認(rèn)的靜態(tài)分支預(yù)測機(jī)制來編譯生成匯編代碼,從而讓低端的CPU也能得到不錯(cuò)的性能。RISC-V架構(gòu)特地定義了所有的帶條件跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)的偏移量(相對(duì)于當(dāng)前指令的地址)都是有符號(hào)數(shù),并且其符號(hào)位被編碼在固定的位置。因此,這種靜態(tài)預(yù)測機(jī)制在硬件上非常容易實(shí)現(xiàn),硬件譯碼器可以輕松的找到這個(gè)固定的位置,并判斷其是0還是1來判斷其是正數(shù)還是負(fù)數(shù),如果是負(fù)數(shù)則表示跳轉(zhuǎn)的目標(biāo)地址為當(dāng)前地址減去偏移量,也就是向后跳轉(zhuǎn),則預(yù)測為“跳”。當(dāng)然對(duì)于配備有硬件分支預(yù)測器的高端CPU,則可以采用高級(jí)的動(dòng)態(tài)分支預(yù)測機(jī)制來保證性能。
異常發(fā)生 --> 硬件更改寄存器 --> 軟件讀取寄存器判斷 --> 異常處理
系統(tǒng)會(huì)讀取mcause寄存器判斷何種異常從而跳轉(zhuǎn)異常處理
RISC-V硬件不會(huì)保存上下文,需要軟件保存和恢復(fù)
中斷和異常機(jī)制往往是處理器指令集架構(gòu)中最為復(fù)雜而關(guān)鍵的部分。RISC-V架構(gòu)定義了一套相對(duì)簡單基本的中斷和異常機(jī)制,但是也允許用戶對(duì)其進(jìn)行定制和擴(kuò)展。
2.6 簡潔的運(yùn)算指令
RISC-V架構(gòu)對(duì)任何的運(yùn)算指令錯(cuò)誤(包括整數(shù)與浮點(diǎn)指令)均不產(chǎn)生異常,而是產(chǎn)生某個(gè)特殊的默認(rèn)值,同時(shí),設(shè)置某些狀態(tài)寄存器的狀態(tài)位。RISC-V架構(gòu)推薦軟件通過其他方法來找到這些錯(cuò)誤。
2.7?優(yōu)雅的壓縮指令子集
基本的RISC-V基本整數(shù)指令子集(字母I表示 )規(guī)定的指令長度均為等長的32位,這種等長指令定義使得僅支持整數(shù)指令子集的基本RISC-V CPU非常容易設(shè)計(jì)。但是等長的32位編碼指令也會(huì)造成代碼體積(Code Size)相對(duì)較大的問題。
為了滿足某些對(duì)于代碼體積要求較高的場景(譬如嵌入式領(lǐng)域),RISC-V定義了一種可選的壓縮(Compressed)指令子集,由字母C表示,也可以由RVC表示。RISC-V具有后發(fā)優(yōu)勢,從一開始便規(guī)劃了壓縮指令,預(yù)留了足夠的編碼空間,16位長指令與普通的32位長指令可以無縫自由地交織在一起,處理器也沒有定義額外的狀態(tài)。
RISC-V壓縮指令的另外一個(gè)特別之處是,16位指令的壓縮策略是將一部分普通最常用的的32位指令中的信息進(jìn)行壓縮重排得到(譬如假設(shè)一條指令使用了兩個(gè)同樣的操作數(shù)索引,則可以省去其中一個(gè)索引的編碼空間),因此每一條16位長的指令都能一一找到其對(duì)應(yīng)的原始32位指令。因此,程序編譯成為壓縮指令僅在匯編器階段就可以完成,極大的簡化了編譯器工具鏈的負(fù)擔(dān)。
2.8 特權(quán)模式
RISC-V架構(gòu)定義了三種工作模式,又稱特權(quán)模式(Privileged Mode):
-
Machine Mode:機(jī)器模式,簡稱M Mode。
-
Supervisor Mode:監(jiān)督模式,簡稱S Mode。
-
User Mode:用戶模式,簡稱U Mode。
RISC-V架構(gòu)定義M Mode為必選模式,另外兩種為可選模式。通過不同的模式組合可以實(shí)現(xiàn)不同的系統(tǒng)。
RISC-V架構(gòu)也支持幾種不同的存儲(chǔ)器地址管理機(jī)制,包括對(duì)于物理地址和虛擬地址的管理機(jī)制,使得RISC-V架構(gòu)能夠支持從簡單的嵌入式系統(tǒng)(直接操作物理地址)到復(fù)雜的操作系統(tǒng)(直接操作虛擬地址)的各種系統(tǒng)。
一些相關(guān)寄存器
- 控制和狀態(tài)寄存器(Control and Status Register,CSR),用于配置或記錄一些運(yùn)行的狀態(tài)。CSR寄存器是處理器核內(nèi)部的寄存器,使用其自己的地址編碼空間和存儲(chǔ)器尋址的地址區(qū)間完全無關(guān)系。
CSR寄存器的訪問采用專用的CSR指令,包括CSRRW、CSRRS、CSRRC、CSRRWI、CSRRSI以及CSRRCI指令。
- mtvec異常入口地址寄存器,指定異常處理的pc地址,軟件可以更改其值。
- mcause 軟件可讀取寄存器,查看異常原因。
- mepc 保存原PC,用于異常返回,可讀寫,軟件可以更改。
- mtral 異常值。如果存儲(chǔ)器訪問,mtral為存儲(chǔ)器地址;如果非法指令,mtral為非法指令編碼。
- mstatus 機(jī)器模式狀態(tài)。MIE=1,該模式下中斷全局打開,為0關(guān)閉。進(jìn)入異常和退出時(shí)都會(huì)更改此寄存器。
?
3.RISC-V架構(gòu)的生態(tài)
2018年11月,中國開放指令生態(tài)(RISC-V)聯(lián)盟(下簡稱“RISC-V中國聯(lián)盟”)成立,發(fā)布了中科院計(jì)算所翻譯的中文版《RISC-V手冊(cè)》。
3.1 RISC-V的一些硬件平臺(tái)
平頭哥半導(dǎo)體?支持RISC-V第三代指令系統(tǒng)架構(gòu)處理器CK902
芯來科技?開源RISC-V處理器項(xiàng)目蜂鳥E203
兆易創(chuàng)新GD32VF103
嘉楠科技K210
其他RISC-V MCU硬核
FPGA軟核SoC
3.2?RISC-V的軟件開發(fā)環(huán)境
廠家提供IDE
IAR
Segger
基于開源軟件或terminal調(diào)試
3.3?RISC-V實(shí)現(xiàn)
RISC-V內(nèi)核在微控制器、微處理器和SoC中都可以進(jìn)行移植和延伸。
除了基于RISC-V制造芯片之外,RISC-V在許多領(lǐng)域,比如編譯器、模擬器、開發(fā)環(huán)境、操作系統(tǒng)等,都在逐漸形成生態(tài)。
4.文檔下載指路
RISC-V 架構(gòu)文檔” 分為 “指令集文檔”(riscv-spec-v2.2.pdf)和 “特權(quán)架構(gòu)文檔”(riscv-privileged-v1.10.pdf),可在RISC-V基金會(huì)的網(wǎng)站上(https://riscv.org/specifications/)無需注冊(cè)便可免費(fèi)下載。
5.一些對(duì)比
CISC CPU具有少量的寄存器和大量指令集,其中大多數(shù)可以訪問內(nèi)存。CISC運(yùn)行在單個(gè)指令中遞增變量。
RISC CPU具有大量的寄存器和非常適度的指令集,內(nèi)存訪問僅限于少數(shù)加載和存儲(chǔ)指令。RISC需要用加載和存儲(chǔ)來訪問內(nèi)存。
總結(jié)
以上是生活随笔為你收集整理的RISC-V架构生态及相关学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019微信公开课 同行With Us
- 下一篇: Unity 之 发布 Mac 报错 il