第1章 初識RISC-V
1.1 什么是RISC-V
了解RISC-V之前,先熟悉一個概念,指令集架構(Instruction Set Architecture,ISA)。
1.1.1 指令集架構ISA
還記得用C語言的編寫的hello world程序嗎?
void main()
{
printf("Hello, World!");
}
該程序在PC、8位MCU、32位MCU這些不同的平台上都能正常運行,這是為什么呢?
答案就是有一套標准規范,正因為編譯器和芯片設計時都遵循這套規范,使得高級語言編寫的程序經指定編譯器編譯后能直接運行在對應的芯片上。
這套標准規范就是指令集架構(Instruction Set Architecture,ISA)。
ISA主要分為復雜指令集(Complex Instruction Set Computer,CISC)和精簡指令集(Reduced Instruction Set Computer,RISC),典型代表如下:
類型 | 名稱 | 特點 | 應用領域 |
復雜指令集CISC | x86 | 性能高 速度快 兼容性好 |
PC 服務器 |
精簡指令集RISC | ARM | 生態成熟 非離散 需授權 |
移動設備 嵌入式設備 |
RISC-V | 開源 模塊化 簡潔 可拓展 |
物聯網 人工智能 邊緣計算 |
ISA是底層硬件電路面向上層軟件程序提供的一層接口規范,即機器語言程序所運行的計算機硬件和軟件之間的“橋梁”。ISA主要定義了如下內容:
-
基本數據類型及格式(byte、int、word……)
-
指令格式,尋址方式和可訪問地址空間大小
-
程序可訪問的通用寄存器的個數、位數和編號
-
控制寄存器的定義
-
I/O空間的編址方式
-
異常或中斷的處理方式
-
機器工作狀態的定義和切換
-
……
ISA規定了機器級程序的格式和行為,即ISA具有軟件看得見(能感覺到)的特性,因此用機器指令或匯編指令編寫機器級程序時,必須熟悉對應平台的ISA。不過程序員大多使用高級語言(C/C++、Java)編寫程序,由工具鏈編譯轉換為對應的機器語言,不需要了解ISA和底層硬件的執行機理。
1.1.2 開源指令集RISC-V
RISC由美國加州大學伯克利分校教授David Patterson發明。
RISC-V(讀作”risk-five“),表示第五代精簡指令集,起源於2010年伯克利大學並行計算實驗室(Par Lab) 的1位教授和2個研究生的一個項目(該項目也由David Patterson指導),希望選擇一款指令集用於科研和教學,該項目在x86、ARM等指令集架構中徘徊,最終決定自己設計一個全新的指令集,RISC-V由此誕生。RISC-V的最初目標是實用、開源、可在學術上使用,並且在任何硬件或軟件設計中部署時無需版稅。
2015年,為了更好的推動RISC-V在技術和商業上的發展,3位創始人做了如下安排:
-
成立RISC-V基金會,維護指令集架構的完整性和非碎片化
-
成立SiFive公司,推動RISC-V商業化
2019年,RISC-V基金會宣布將總部遷往瑞士,改名RISC-V國際基金會。作為全球性非營利組織,已在全球70多個國家擁有2000+成員。包括華為、中興、阿里巴巴、沁恆微電子、樂鑫等眾多國內企業。
通過十多年的發展,RISC-V這一星星之火已有燎原之勢。倪光南院士表示,未來RISC-V很可能發展成為世界主流CPU之一,從而在CPU領域形成Intel (x86)、ARM、RISC-V三分天下的格局。
RISC-V 指令集規范官方下載地址:https://riscv.org/technical/specifications/
1.1.3 RISC-V概述
(1)模塊化的指令子集
RISC-V指令集采用模塊化的方式進行組織設計,由基本指令集和擴展指令集組成,每個模塊用一個英文字母表示。
其中,整數(Integer)指令集用字母“I”表示,這是RISC-V處理器最基本也是唯一強制要求實現的指令集。其他指令集均為可選模塊,可自行選擇是否支持。
RISC-V指令模塊描述如下:
類型 | 指令集 | 指令數 | 狀態 | 描述 |
基本指令集 | RV32I | 47 | 批准 | 32位地址與整數指令 支持32個通用寄存器 |
RV32E | 47 | 草稿 | RV32I的子集 支持16個通用寄存器 |
|
RV64I | 59 | 批准 | 64位地址與整數指令集及 部分32位整數指令 支持32個通用寄存器 |
|
RV128I | 71 | 草稿 | 128位地址與整數指令集及 部分64位和32位整數指令 支持32個通用寄存器 |
|
擴展指令集 | M | 8 | 批准 | 乘法(Multiplication)與除法指令 |
A | 11 | 批准 | 存儲器原子(Automic)操作指令 | |
F | 26 | 批准 | 單精度(32bit)浮點(Float)運算指令 | |
D | 26 | 批准 | 雙精度(64bit)浮點(Double)運算指令 | |
C | 46 | 批准 | 壓縮(Compressed)指令,指令長度位16bit | |
Zicsr | 6 | 批准 | 控制和狀態寄存器訪問指令 |
上表基於20191213版非特權指令集規范手冊,最新指令模塊說明參考官網:https://riscv.org/technical/specifications/
通常把模塊“I”、“M”、“A”、“F”和“D”的特定組合“IMAFD”稱為通用組合(General),用字母“G”表示。如用RV32G表示RV32IMAFD。
(2)可配置的寄存器
RV32I支持32個通用寄存器x0~x31,每個寄存器長度均為32位,其中寄存器x0恆為0,剩余31個為任意讀/寫的通用寄存器。
為了增加匯編程序的閱讀性,匯編編程時通常采用應用程序二進制接口協議(Application Binary Interface,ABI)定義的寄存器名稱。
RV32I通用寄存器如下:
寄存器名稱 | ABI名稱 | 說明 | 存儲者 |
---|---|---|---|
x0 | zero | 讀取時總為0,寫入時不起任何效果 | N/A |
x1 | ra | 程序返回地址 | Caller |
x2 | sp | 棧空間指針 | callee |
x3 | gp | 全局變量指針(基地址) | / |
x4 | tp | 線程變量指針(基地址) | / |
x5 ~ x7 | t0 ~ t2 | 臨時寄存器 | Caller |
x8 | s0/fp | 保存寄存器/幀指針(配合棧指針界定函數棧) | Callee |
x9 | s1 | 保存寄存器(被調用函數使用時需備份並在退出時恢復) | Callee |
x10, x11 | a0, a1 | 函數參數寄存器(用於函數參數/返回值) | Caller |
x12 ~ x17 | a2 ~ a7 | 函數參數寄存器(用於函數參數) | Caller |
x18 ~ x27 | s2 ~ s11 | 保存寄存器(被調用函數使用時需備份並在退出時恢復) | Callee |
x28 ~ x31 | t3 ~ t6 | 臨時寄存器 | Caller |
-
Caller:來訪者,簡單來說就是打電話的,即調用函數的函數,
-
Callee:被訪者,簡單來說就是接電話的,即被調用函數
-
寄存器的寬度由ISA指定,如RV32的通用寄存器寬度為32位,RV64的通用寄存器寬度為64位。
-
如果支持浮點指令,則需額外支持32個浮點(Float Point)寄存器
-
不同於ARM,RISC-V中PC指針不占用通過寄存器,而是獨立的,程序執行中自動變化,無法通過通用寄存器訪問和修改PC值。
此外,RISC-V還定義了一組控制和狀態寄存器(Control and Status Registers,CSR),用於記錄內核運行狀態。詳情參考特權指令集規范:https://riscv.org/technical/specifications/
**(3)特權級別 **
RISC-V規定如下四個特權級別(privilege level):
等級(Level) | 編碼(Encoding) | 名稱(Name) | 縮寫(Abbreviation) |
---|---|---|---|
0 | 00 | 用戶/應用模式(User/Application) | U |
1 | 01 | 管理員模式(Supervisor ) | S |
2 | 10 | Reserved | - |
3 | 11 | 機器模式(Machine) | M |
- 機器模式(M),RISC-V處理器在復位后自動進入機器模式(M),因此,機器模式是所有RISC-V處理器唯一必須要實現的特權模式。此模式下運行的程序權限最高,支持處理器的所有指令,可以訪問處理器的全部資源。
- 用戶模式(U),該模式是可選的,權限最低。此模型下僅可訪問限定的資源。
- 管理員模式(S),該模式也是可選的,旨在支持Linux、Windows等操作系統。管理員模式可訪問的資源比用戶模式多,但比機器模式少。
通過不同特權模式的組合,可設計面向不同應用場景的處理器,如:
模式數量 | 支持模式 | 目標應用 |
---|---|---|
1 | M | 簡單嵌入式系統 |
2 | M,U | 安全嵌入式系統 |
3 | M,S,U | 支持Unix、Linux、Windows等操作系統 |
1.2 沁恆RISC-V處理器及Roadmap
1.2.1 沁恆自研RISC-V處理器
沁恆微電子從2017年開始關注並研究RISC-V開源指令集的32位MCU架構,針對快速中斷響應、高帶寬數據DMA進行優化,自定義壓縮指令,研發設計硬件壓棧(HPE,Hardware Prologue/Epilogue),並創新性提出免表中斷(VTF,Vector Table Free)技術,即免查表方式中斷尋址技術,同時引入兩線仿真調試接口。
目前已形成了側重於低功耗或高性能等多個版本的RISC-V處理器。特點如下:
Core | 特點 | ||||||||
支持指令 | 流水線 | 特權模式 | 中斷嵌套 | 硬件壓棧 | 免表中斷 | 整數除法周期 | 內存保護 | ||
V2A | RV32EC | 2級 | M | 2級 | 0 | 2路 | - | 無 | |
V3A | RV32IMAC | 3級 | M+U | 2級 | 2級 | 4路 | 17 | 無 | |
V4A | RV32IMAC | 3級 | M+U | 2級 | 2級 | 4路 | 17 | RV標准PMU | |
V4B | RV32IMAC | 3級 | M+U | 2級 | 2級 | 4路 | 9 | 無 | |
V4C | RV32IMAC | 3級 | M+U | 2級 | 2級 | 4路 | 5 | RV標准PMU | |
V4F | RV32IMAFC | 3級 | M+U | 8級 | 3級 | 4路 | 5 | RV標准PMU |
1.2.2 沁恆RISC-V系列MCU
沁恆微電子結合多年USB、低功耗藍牙、以太網等接口的設計經驗,基於多款自研RISC-V處理器,並基於32位通用MCU架構外加USB高速PHY、藍牙收發器、以太網PHY等專業接口模塊推出增強版MCU+系列產品。
沁恆RISC-V系列MCU Roadmap如下:
1.3 工業級互聯型MCU CH32V307
本教程基於沁恆微電子工業級互聯型RISC-V MCU CH32V307,通過講解RISC-V常用匯編指令,分析CH32V307的每個外設功能及使用方法,配合詳細的示例代碼,幫助大家熟悉RISC-V平台的嵌入式開發。
CH32V307配備了硬件堆棧區、快速中斷入口,在標准RISC-V基礎上大大提高了中斷響應速度。加入單精度浮點指令集,擴充堆棧區,具有更高的運算性能。擴展串口U(S)ART數量到8組,電機定時器到4組。提供USB2.0高速接口(480Mbps)並內置了PHY收發器,以太網MAC升級到千兆並集成了10M-PHY模塊。
詳細參數如下:
沁恆官網資料下載: