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