2010:UC Berkeley Par Lab 需要一個可自由使用、修改、發表的 ISA 供研究與教學,Krste Asanović、Andrew Waterman、Yunsup Lee 與 David Patterson 啟動第五代 Berkeley RISC 計畫——RISC-V(“five”)。
2011:公開第一版使用者層 ISA;2014:凍結 RV32I/RV64I 基礎集——基礎集永不再變,軟體投資永遠有效。
2015:成立 RISC-V Foundation(2020 年遷冊瑞士、更名 RISC-V International),以會員制治理規格的批准(ratification)。
任何公司、學校、個人都可以免費實作、販售 RISC-V 處理器,無需授權合約——這與 x86(封閉)、Arm(授權費+權利金)形成根本差異。
「指令集應該像 TCP/IP 一樣是開放標準」——RISC-V 的核心主張。開放的是規格;具體的處理器實作(微結構)可以開源(如 Rocket、BOOM、PicoRV32、VexRiscv)也可以商業閉源(SiFive、平頭哥、Andes 的核)。結構與組織的分離(第 1 章)在此獲得制度性的體現。
模組化:小基礎 + 選配擴展
x86/Arm 的指令集隨年代不斷膨脹,所有實作都得背負全部歷史。RISC-V 反其道:
基礎整數指令集
| 基礎 | XLEN | 說明 |
|---|---|---|
| RV32I | 32 | 32 位元基礎整數指令集,40 條指令(本教材主角) |
| RV32E | 32 | 嵌入式精簡版:僅 16 個暫存器 |
| RV64I | 64 | 64 位元基礎(暫存器 64 位元,增加 W 尾碼字運算) |
| RV128I | 128 | 為未來保留(草案) |
RV32I 小到什麼程度?40 條指令、六種格式、無旗標、無條件碼——一名學生可以在一學期內以 Verilog 完整實作(第三部將證明這一點),卻足以支撐完整的編譯器目標與作業系統。
標準擴展
| 字母 | 名稱 | 內容 |
|---|---|---|
| M | 整數乘除 | mul/mulh*/div/rem(第 20 章) |
| A | 原子操作 | lr/sc、amoswap/amoadd...(多核同步) |
| F / D | 單/雙精度浮點 | 32 個 f 暫存器、IEEE 754(第 9 章) |
| C | 壓縮指令 | 常用指令的 16 位元編碼,程式縮小約 25–30% |
| V | 向量 | 可變長度向量運算(SIMD 的優雅解) |
| Zicsr | CSR 指令 | csrrw/csrrs...(第 21 章) |
| Zifencei | 指令流同步 | fence.i |
| B/Zb* | 位元操作 | 旋轉、計數、抽取等 |
命名法:RV32IMAC = RV32I + M + A + C;G = IMAFD + Zicsr + Zifencei(“General”),故 RV64GC 是 Linux 級應用處理器的代名詞。設定檔(Profiles,如 RVA23)進一步規定應用處理器必備的擴展組合,保證軟體相容性。
程式設計師模型(RV32I)
| 暫存器 | ABI 名 | 保存責任 | 用途 |
|---|---|---|---|
| x0 | zero | — | 恆為 0;寫入被丟棄 |
| x1 | ra | 呼叫者 | 返回位址 |
| x2 | sp | 被呼叫者 | 堆疊指標(16 位元組對齊) |
| x3 | gp | — | 全域指標 |
| x4 | tp | — | 執行緒指標 |
| x5–x7 | t0–t2 | 呼叫者 | 臨時 |
| x8 | s0/fp | 被呼叫者 | 保存暫存器/框架指標 |
| x9 | s1 | 被呼叫者 | 保存暫存器 |
| x10–x11 | a0–a1 | 呼叫者 | 參數/回傳值 |
| x12–x17 | a2–a7 | 呼叫者 | 參數 |
| x18–x27 | s2–s11 | 被呼叫者 | 保存暫存器 |
| x28–x31 | t3–t6 | 呼叫者 | 臨時 |
x0 恆零是 RISC 經典技巧:許多操作免專用指令——
mv=addi rd,rs,0、nop=addi x0,x0,0、neg rd,rs=sub rd,x0,rs、丟棄結果=寫入 x0。PC 不是通用暫存器(對比 Arm32 的 r15):讀取 PC 用
auipc,控制轉移只經分支/跳躍指令——微結構因此不必監控「任何指令都可能改 PC」。沒有旗標暫存器:比較與分支合一;多字加法的進位以
sltu求得。所有指令的相依關係都顯式地經由暫存器——對管線、超純量、編譯器都是好消息(第 12、14 章)。hart(hardware thread):規格用語,一個硬體執行緒=一套暫存器+PC。多核=多 hart。
記憶體模型
位址空間 \(2^{32}\) 位元組,小端序(第 10 章);
載入/儲存粒度:位元組(b)、半字(h,2B)、字(w,4B);
未對齊存取:規格允許(可由硬體或陷阱模擬),但效能不保證;
I/O 採記憶體映射(第 7 章);
多 hart 的記憶體序為弱序 RVWMO,同步靠
fence與 A 擴展(第 16 章)。
生態系現況
軟體:GCC/LLVM、Linux、glibc/musl、QEMU、OpenSBI/U-Boot 均已上游支援;
開源硬體:Rocket/BOOM(Chisel)、PicoRV32、VexRiscv、CVA6、Ibex——閱讀它們是絕佳的進階教材;
商用:SiFive、Andes(晶心)、平頭哥玄鐵、Ventana、Tenstorrent 等;出貨量最大宗是嵌入式控制核心(硬碟、GPU、基頻內的管理核),應用處理器與 AI 加速器快速成長;
工具:Spike(黃金參考模擬器)、riscv-tests(相容性測試,第 26 章將借用其思想)、riscof。
本章重點回顧
RISC-V=開放標準 ISA:規格免費、實作自由;基礎集凍結永不變。
模組化:RV32I(40 條指令)+M/A/F/D/C/V/Zicsr...;RV64GC=Linux 級標配。
程式模型:32 個 x 暫存器(x0 恆零)、獨立 PC、無旗標、小端序。
ABI 名稱(ra/sp/a0/s0/t0...)與保存責任是第 19 章呼叫慣例的基礎。
複習問題
「開放 ISA」開放的是什麼、不是什麼?與 Arm 授權模式的差異?
RV32IMAC、RV64GC 各包含哪些模組?
x0 恆零帶來哪些好處?舉出三個利用 x0 合成的偽指令。
RISC-V 為何不設旗標暫存器?這對管線設計有何影響?
RV32E 與 RV32I 的差異?各適合什麼場景?
什麼是 hart?單核雙執行緒(SMT)的處理器有幾個 hart?
9 RISC-V International, The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture, ver. 20260120. K. Asanović and D. Patterson, “Instruction Sets Should Be Free,” UCB/EECS-2014-146. D. Patterson and A. Waterman, The RISC-V Reader, Strawberry Canyon, 2017.