RISC-V

**RISC-V**（發音為「risk-five」）是一個基於精簡指令集（RISC）原則的開源指令集架構（ISA），簡易解釋為開源軟體運動相對應的一種「開源硬體」。該專案 2010 年始於加州大學柏克萊分校，但許多貢獻者是該大學以外的志願者和業界人士。

與大多數指令集相比，RISC-V 指令集可以自由地用於任何目的，允許任何人設計、製造和銷售 RISC-V 晶片和軟體而不必支付給任何公司專利費。雖然這不是第一個開源指令集，但它具有重要意義，因為其設計使其適用於現代計算裝置（如倉庫規模雲端運算機、高端行動電話和微小嵌入式系統）。設計者考慮到了這些用途中的效能與功率效率。該指令集還具有眾多支援的軟體，這解決了新指令集通常的弱點。

RISC-V 指令集的設計考慮了小型、快速、低功耗的現實情況來實做，但並沒有對特定的微架構做過度的設計。截至 2017 年 5 月 RISC-V 已經確立了版本 2.22 的使用者空間的指令集 (userspace ISA)，而特權指令集 (privileged ISA) 也處在草案版本 1.10。

## 意義

RISC-V 的作者們旨在提供數種可以在 BSD 授權條款之下自由使用的 CPU 設計。該授權條款允許像是 RISC-V 晶片設計等衍生作品可以像 RISC-V 本身一樣是公開且自由發行，也可以是閉源或者是專有財產。

相比而言，ARM 控股和 MIPS 科技等商業晶片供應商會對使用其專利者收取高額的授權費用。他們也要求在接收其描述設計優點的檔案和指令集前，還需要簽署保密協定。許多設計優點為完全專有，從來不會披露給客戶。這種保密制度阻礙了公共教育用途和安全審核，以及開發公共、低成本的自由及開放原始碼軟體編譯器和作業系統。

開發一個 CPU 需要多種專業的設計知識，包括電子邏輯、編譯器和作業系統。這種資源在專業工程團隊之外很難見到。所以現代且高品質的通用電腦指令集近年來除了學術環境以外並沒有在任何地方被廣泛使用，甚至沒有被闡述。正因如此，許多 RISC-V 貢獻者將此視為整個社群付出的成果，而這也是 RISC-V 有很多工程上的應用的一項原因。

RISC-V 的作者們還有大量研究和使用者經驗來驗證他們在矽片和仿真中的設計。RISC-V 指令集是從一系列的學術電腦設計專案直接發展而來的。它一開始的目的有一部分是為了幫助這些專案。

## 歷史

### 前身

RISC 的歷史可追溯到 1980 年左右。在此之前，人們覺得簡單的計算機可能會有用，但是沒有很多人去闡述其設計原則。這種簡單而有效的計算機一直都是學術界的興趣。

學術界的學者們為了出版第一版的《計算機體系結構：量化研究方法》（_Computer Architecture: A Quantitative Approach_）ISBN 978-1558600690 ，所以於 1990 年訂立了 RISC 指令集 DLX。大衛・帕特森（David Patterson）是其中一位作者，後來協助 RISC-V 的開發。但是 DLX 只用於教育用途，學術界和業餘愛好者使用 FPGA（現場可編程門陣列）來實做它，但並沒有取得商業運用。版本 2 及更早版本的 ARM CPU 具有公共域指令集，並且仍有 GCC 的支援，而 GCC 是一個受歡迎且免費的軟體編譯器。該 ISA 有三個開源核心，但尚未製造。

OpenRISC 是一款基於 DLX 的開源 ISA，並且具有相關的 RISC 設計。它完全支援 GCC 並且有實做在 Linux 上。但是它很少有商業上的實做，直到 2018 年 10 月 SiFive 公司推出一系列全新 CPU，產品線應用涵蓋 5G、網通、儲存、擴增實境（AR）、虛擬實境（VR）等，其 E 系列與 U 系列的 CPU 方案已經威脅到 ARM 公司的收費產品並且擁有後者缺乏的 64 位元架構產品。。

ARM 公司受到威脅後上線了一個網站 riscv-basics.com，列舉了對 RISC-V 的批判，包括：成本、生態系統、碎片化風險、安全性問題、設計驗證。但最終迫於業界輿論惡評，ARM 關閉了該網站。

### 基金會

加州柏克萊分校的 Krste Asanović教授，發現開放原始碼的電腦系統有很多用途。在 2010 年他決定用三個月的時間來開發並發表一個開放原始碼的電腦系統。這個計畫是用來幫助包括學術以及工業的使用者。柏克萊分校的大衛・帕特森教授也參加了這個計畫。帕特森也是原來柏克萊分校 RISC 的設計者，RISC-V 只是他眾多 RISC CPU 研究計畫的一個．RISC-V 計畫早期一些經費來自 DARPA。

有參與支援 RISC-V 基金會的公司以及機構包括了超微半導體、晶心科技、英國航太系統、加州大學柏克萊分校、Bluespec、Cortus、Google、GreenWaves Technology、慧與科技、華為、IBM、Imperas Software、中國科學院、北京清華大學、印度理工學院、萊迪思半導體、邁倫科技、美高森美、美光科技、輝達、恩智浦半導體、甲骨文公司、高通、Rambus、威騰電子、SiFive、阿里巴巴集團、紅帽公司、成為資本。

2019 年 6 月，圖靈獎得主、RISC-V 基金會創始人之一大衛・帕特森（David Patterson）在瑞士宣布，將依託清華 - 柏克萊深圳學院（TBSI），在內部建設 RISC-V 國際開源實驗室（RISC-V International Open Source Laboratory），又稱大衛帕特森 RIOS 圖靈實驗室。清華大學稱實驗室將瞄準世界 CPU 產業戰略發展新方向和粵港澳大灣區產業創新需求，聚焦於開源指令集 CPU 研究，建設以深圳為根節點的 RISC-V 全球創新網路和以技術成果轉移為主要使命的非營利組織，全面提升 RISC-V 生態系至最先進可商用水平。預判屆時將面對國際大廠法律層面發起挑戰問題上，柏克萊加州大學和清華大學的法學院將與之建立聯絡。

2020 年 3 月，RISC-V 基金會為規避美國對中國的貿易限制而將總部搬遷至瑞士，並更名為 RISC-V 國際（英語：RISC-V International），以非盈利商業協會的身分在瑞士註冊。

### 獎項

* 2017：The Linley Group's Analyst's Choice Award for Best Technology（頁面存檔備份，存於網際網路檔案館）（對其指令集）

## 激勵要求

RISC 設計者們認為指令集因為位於硬體和軟體之間，所以是電腦主要的溝通橋梁，因此如果有一個設計良好的指令集是開源而且可以被任何人使用的，就可以讓更多的資源能夠重複利用，而大大的減少軟體的成本。而這樣的指令集也會增加硬體供應商市場的競爭力，因為硬體供應商們可以挪用更多資源來進行設計，減少處理軟體支援的事務。

設計者聲稱在指令集設計領域裡，新的設計準則漸漸變得罕見，而近四十年中，大多數成功的設計變得越來越相似。至於那些失敗的指令集，大多數是因為他們的贊助商賺不了錢，而不是因為其指令集在技術上有多差。所以，一個在成熟的設計準則之下開發且設計良好的開源指令集想必能吸引許多供應商長期的支援。

許多先前的開源指令集架構使用 GNU 通用公眾授權條款來鼓勵使用者們允許他們的實作方法被其他人複製或是使用。

設計者們表示，RISC-V 指令集是給實際上的電腦使用的，它不像其他學術上的指令集設計，只有為了比較好闡述理念而做最佳化。而 RISC-V 指令集有一些功能是可以增加電腦速度又可以減少成本和電源使用。這些特色包含，Load/store 架構，在 CPU 裡面的位元表示方法來簡化數據多工器（MUX），以標準為基礎來簡化的浮點數，架構中立的設計和把最高有效位（Most significant bit，MSB）放到固定位置來加速符號擴充（Sign extension）。而 sign extension 常常就是靜態時序分析裡面的關鍵路徑（Critical timing path）。

RISC-V 指令集是設計來給各式各樣的用途使用的，而它支援三個不同的字組大小，分別是 32 位元、64 位元、128 位元以及與這三種字組大小有關的各式各樣的指令子集。而這些指令子集的定義會按照那三個字組大小來做些微的改動。透過這些指令子集的向量處理器與資料中心等級的機櫃式平行電腦 / 平行運算來幫助嵌入式系統、個人電腦和超級電腦。

該指令集採取不固定的編碼長度而且還可以再擴充，因此在未來，還可以一直加入更多位元的編碼方式。該指令集有特別留空間給 128 位元的延伸版本，因為 60 年的產業界經驗顯示在指令集設計領域裡，最無法復原的錯誤就是缺少記憶體定址空間。截至 2016 年，128 位元的指令集仍然刻意地維持在沒有定義的狀態，這是因為到現在為止，人們很少有實際上操作這麼大記憶體的系統的經驗。

然而，RISC-V 也可以拿來做學術上的使用。它擁有簡化的整數指令子集允許學生拿來做基本的練習，而整數指令子集就是一個簡單的指令集架構（ISA）讓軟體可以控制研究上的機器。而不定長度的指令集架構也允許擴充功能來滿足研究或是學生練習上的需求。分割出來的特權指令集可以支援在不重新設計編譯器的情況下，進行作業系統方面的研究。RISC-V 的開放的智慧財產權允許相關的設計被發布、使用和修改。

## 軟體

一個新的 CPU 指令集通常的問題是缺少 CPU 的硬體設計跟軟體的支援。在 RISC-V 的網站有一個 user mode 指令集的規格，還有一個用來支援作業系統模式的優先指令集的初步規格。

市面上已經有好幾個使用 RISC-V 開源架構的 CPU 設計可以供參考，包括 64-bit Berkeley Out of Order Machine（BOOM）、64-bit Rocket、柏克萊設計的五個 32-bit Sodor CPU、Clifford Wolf 的 picorv32、Syntacore 的 scr1、蘇黎世聯邦理工學院／波隆納大學的 PULPino （Riscy and Zero-Riscy），以及很多其他的設計。使用三層指令分段的 Sodor CPU 是一個適合嵌入式設計的小型 CPU。Rocket 可能適用在小型低功耗的個人電腦或其他個人裝置。BOOM 使用了大部分 Rocket 的架構，但是功能更加強大，適合個人電腦、伺服器或超級電腦。picorv 跟 scr1 都是使用 Verilog 設計的 32 位元 MCU 等級的 RV32IMC。PULPino 的核心使用了一個適合微控制器的簡單的 RV32IMC ISA 架構 (Zero-Riscy)，以及另外一個更強大的 DSP 版本 RV32IMFC ISA 可以支援一些嵌入式訊號處理的特別 DSP 指令集。

設計軟體包括了一個設計編譯器 Chisel，它可把設計編譯成 Verilog 代碼。網站上還有測試用的參考資料可以用來驗證設計的正確性。

RISC-V 目前提供的軟體有 GNU Compiler Collection （GCC） toolchain (具有偵錯器 GDB)、一套 LLVM toolchain、OVPsim 模擬器（以及 RISC-V 快速處理器模式的軟體參考庫）、Spike 模擬器，以及一套在 QEMU 上運行的模擬器。

作業系統的支援包括 Linux 核心、FreeBSD, 以及 NetBSD，但是監督模式的指令在 2016 年 11 月 10 日還沒有標準化，所以這方面的支援還不是正式的。有一個早期的 RISC-V 的 FreeBSD 作業系統已經在 2016 年 2 月上傳到開放原始碼社群，而且包含在 FreeBSD 11.0 。Debian 跟 Fedora 的版本也有人在移植，並且在逐漸穩定中。已經有人做了１個 U-Boot 的移植版本。UEFI Spec v2.7 定義了 RISC-V UFEI 的規格，而且惠普公司的工程師已經做好一個 TianoCore 的移植版本，並且將會上傳到開放原始碼社群。已經有人做好了一個 L4 microkernel family 的移植。還有一個在網頁上用 JavaScript 寫的 RISC-V Linux 系統模擬器。

## 設計

### 指令子集

RISC-V 指令使用模組化的設計，包括幾個可以互相替換的基本指令集，以及額外可以選擇的擴充指令集。所有基本跟擴充的指令集都是由科技產業、研究機構跟學術界合作開發的。基本指令集規範了指令跟他們的編碼、控制流程、暫存器數目（以及它們的長度）、記憶體跟定址方式、邏輯（整數）運算以及其他。只要有軟體以及一個通用的編譯器的支援，只用基本指令集就可以製作一個簡單的通用型的電腦。

標準的擴充指令集可以搭配所有的基本指令集以及其他擴充指令集，而不會發生衝突。

很多 RISC-V 電腦可能使用精簡擴充指令集來降低電力消耗、程式的大小以及記憶體的使用。未來也有計畫支援 hypervisor 和虛擬化。

只要再加上一個監督指令集 (S) 的擴充，以及以下 RVGC 指令集，我們就有足夠的指令可以支援一個 Unix-style 作業系統。

為了分辨各種不同的指令組合，非特權指令集標準中訂定了一些專有名詞。首先先指明基本指令集的種類，包括表示 RISC-V 的代號 RV，然後是暫存器的寬度跟其他變化，例如 RV64I 或 RV32E。然後用上表的字母（以及表列的順序）表示用了哪種擴充指令，例如 RV64IMAFD。

基本指令集、擴充整數或浮點運算、多 CPU 系統使用的同步指令擴充，標準擴充指令 MAFD 被認為是大部分的一般運算都需要的，所以有一個字母的簡稱 G 用來表示 IMAFDZicsr\_Zifencei。

使用嵌入式系統的一個小的 32 位元電腦可能用 RV32EC，而大型的 64 位元電腦可以用 RV64GC，即 RV64IMAFDCZicsr\_Zifencei 的簡稱。

隨著擴充指令集數量的增加，指令集標準提供了另外一種命名方式，用 Z 字首緊接著字母名稱表示標準擴充，例如 Zifencei 表示指令抓取屏障擴充。

### 暫存器集

RISC-V 有 32 個整數暫存器（在嵌入式版本則是 16 個）。當浮點延伸集被實作的時候，還有 32 個浮點暫存器。除了「記憶體存取指令」之外，一般指令「只能」定址暫存器而無法存取記憶體。

如同有些 RISC 指令集（MIPS, SPARC, DEC Alpha），其中一個暫存器為「零暫存器」（zero register，註：其值永遠為零），剩下的暫存器為通用暫存器。在 RISC 當中，第一個整數暫存器是零暫存器。儲存數值到零暫存器是沒有作用的。使用零暫存器可以讓指令集設計更簡單。比方說，把「暫存器 X 複製到暫存器 Y」 (MOV Y, X)，可以使用「將暫存器 X 與 0 相加後，複製到暫存器 Y」 (ADD Y, X, r0) 實作。

RISC-V 有提供「控制暫存器」及「狀態暫存器」，但是 user-mode 程式只能存取用來「量測效能」及「浮點管理」的部分。

RISC-V 並沒有指令可以儲存和回復（save and restore。註：通常用於 context-switch，中斷處理，或是函式呼叫）多個暫存器。這些設計在 RISC-V 當中，被認為是不必要的，過於複雜的，可能過慢的設計。

### 記憶體存取

就像許多的 RISC 一樣， RISC-V 屬於載入 - 儲存架構，只有 load 與 store 指令可以存取記憶體。

Load 和 Store 指令可以直接使用程式碼中的常數、在堆疊中的本地變數、或是資料結構中的內容。定址的方式是使用基底暫存器與 12-bit 的 signed 相對位址 (± 2KB)。如果基底暫存器是 0，則資料或是常數可以在低位址，或是高位址（負的相對位址，導致繞回到高的記憶體位址。比方說 ROM 的記憶體位址）。

記憶體的定址單位是 8-bit 的 byte，以 little-endian 存放在記憶體。Load 與 Store 支援的資料長度從 8-bit 到電腦的 word 大小。記憶體存取並不需要對齊到 word 的大小，不過如果有對齊的話，可以增加效能。這項功能可以減小程式碼大小，而且透過軟體的類比，還可以簡化硬體的設計（會觸發一個「對齊失敗」的中斷）。

和其他類似成功的電腦一樣，RISC-V 也是 little-endian。這稍稍降低了複雜度與成本，因為所有大小的讀取，都遵循一樣的順序（註：例如 64-bit 與 128-bit 的讀取，都是從最小的 word 開始讀進來，只要一直 shift 就可以了）。舉例來說，RISC-V 的指令集都是從最低的那個 byte 開始解碼（註：opcode）。RISC-V 的規格書保留了實作 big-endian 的可能性。

如同許多的 RISC 指令集一樣，RISC-V 並沒有可以「寫入多個暫存器」的定址模式。比方說：不支援 auto-incrementing（像是 \*ptr++ 就無法使用一個指令完成，而必須拆解成「一個 load 指令」及「一個 addi 指令」。）

RISC-V 管理 CPU 與 thread 之間的共享記憶體的方式是確保在單一的 thread 當中，記憶體存取指令的執行順序永遠是遵照原本的編譯順序。不過在不同的 thread 以及在 I/O 裝置之間，RISC-V 不保證存取的順序──除非有像 FENCE 這樣的指令出現。

FENCE 保證在其之前的執行結果，一定會被其後的 thread 或 I/O 裝置看到。FENCE 有 8-bit 可以分別指定 memory read/write 與 I/O read/write 的各種組合順序。透過這些組合，FENCE 可以保證記憶體與 memory-mapped I/O 之間的執行順序。比方說：其中一個組合是可以在不影響 I/O 運算的情況下，只保證記憶體的讀取和寫入順序。也就是說，如果 I/O 運算可以和記憶體同時執行的話，FENCE 不會強迫他們之間要互相等待。單一 CPU 上面跑單一 thread 的情況下，可以把 FENCE 視作 NOP 指令。

有些 RISC CPUs（例如：MIPS, PowerPC, DLX, and Berkeley's RISC-I）在 Load/Save 指令當中使用 16-bit 位移。使用 load upper word 指令來設定最高的 16-bit。這讓最高的 16-bit 資料可以很容易被設定，而不需要位移指令。然而，大部分使用 load upper word 的時機都是為了要載入一個常數（比如：位址）。RISC-V 則是使用類似 SPARC 12-bit 與 20-bit 的設計。而 RISC-V 所採用的 12-bit 設計，可以讓指令更小。也就是說，這使得 32-bit 的 load/store 指令，就算需要在 32 個暫存器（需要 5-bit 定址）當中選兩個來用（一共 10-bit），還是有足夠的 bit 數目來支援 RISC-V 的可變長度指令編碼 (variable-length instruction coding)。

註：請參考 32-bit 的 I-type 指令格式，就會發現這個 12-bit 位移比 16-bit 來得優異的地方。這使得 32-bit 的空間當中，扣掉 12-bit 的常數值，以及最低的兩個 bit 為 11（表示這是一個 32-bit 長的指令），再扣掉兩個 5-bit 的暫存器位址，還有將近 8-bit 的空間可以留給 opcode 及 func3 。如果是使用 16-bit immediate 的話，會使得空間不夠放下兩個 5-bit 的暫存器位址。舉例來說，SLLI Rd, Rs, immediate (Shift Left Logical Immediate) 將會被迫拆解成兩個指令來完成：LDR Ri, immediate; SLLI Rd, Rs, Ri 。

### 立即數

RISC-V 讀取 32-bit 常數與位址是透過設定 upper 20-bit 的指令達到的。LUI 指令 (Load Upper Immediate) 把（指令中的）20-bit 讀取到暫存器的 31~12 bits 當中。另一個 AUIPC 指令，也是一樣讀取 upper 20-bit，同時又加上 PC (Program Counter) 之後，存放到某個基底暫存器。這個指令讓 PIC 程式（Position-Independent Code）能夠支援「相對於程式碼位置的 32-bit 位址」。這個基底暫存器可以再搭配 12-bit 位移，使用在 Load 與 Store 指令當中（註：存取原生的 static 變數？)。如果需要的話，也可以使用 addi 指令，將 lower 12-bit 的常數加到一個暫存器中（註：這樣就完成一個完整的 32-bit 常數讀取）。在 64-bit 架構下，LUI 與 AUIPC 執行的結果會被位元擴充至 64-bit (sign-extent)。

有些高速的 CPU 會把一些指令「融合」成一個指令。比如說：上述的 LUI 與 AUIPC 就很適合和 Load/Save 指令一起融合。

### 函式呼叫、跳躍和分支

RISC-V 的函式呼叫 JAL (Jump and Link) 把回傳位址放在一個暫存器當中。由於它省下了一次存取推疊記憶體，所以在許多的設計當中是比較快速的。JAL 有一個 20-bit signed 位移。這個位移會被乘上 2 之後，加到 PC 當中。如果沒有對齊到 32-bit 位址，CPU 會觸發一個例外。

RISC-V 的 JALR (Jump and Link Register) 指令和 JAL 很像，但是他是把一個 12-bit 的相對位移，和某一個暫存器相加。（而 JAL 是用 20-bit 相加）

JALR 的指令格式有點像使用暫存器的 load/store 指令。搭配另一個設定高 20-bit 的基底暫存器，可以組成一個 32-bit 的位址（可以是絕對位址，例如 LUI; 或是相對於 PC 的位址，例如 AUIPC）。（使用零暫存器當基底暫存器，則是可以跳到 0 ± 2KB 的絕對位址）

透過使用零暫存器，底下兩種無條件跳躍（其他組語中的 JUMP 或 JMP）：「20-bit PC 相對位址」以及「暫存器為底的 12-bit」，分別使用 JAL 與 JALR 兩個指令來實作。在這個情況下，因為目的地暫存器是零存器，所以回傳位址會被丟棄。

如同許多的 RISC 系統，在一個函式呼叫當中，RISC-V 編譯器必須使用多個指令將暫存器一個一個地存到堆疊當中，然後在函式結束的時候，一個一個地將暫存器自堆疊中還原。RISC-V 沒有「儲存多個」或是「還原多個」暫存器的指令。因為這些指令被認為會讓 CPU 變得複雜，而且可能更慢 [51]。 然而 RISC-V 的這種設計，會增加程式大小。而設計者原本是希望透過一種特別的 routine 來減小程式（註：可以參考 這份檔案（頁面存檔備份，存於網際網路檔案館） 的 1.7 Optimizing Register Save/Restore Code Size）。

RISC-V 沒有旗標暫存器（註：原文是 conditional code register，就是指傳統的旗標暫存器 flag register，用以存放計算結果，給接下來的指令使用，例如：進位旗標 carry flag）。設計者相信旗標暫存器會讓 CPU 設計更加複雜，因為它必須強迫了指令們在不同的執行階段之間的互動作用。這樣的設計，會使得高精度計算變得更複雜，有些數值計算需要更多的能量。

相反地，RISC-V 直接比較兩個暫存器，運算元包括：相等、不相等、小於、無號數小於、大於、無號數大於。十個「比較跳躍」運算元，可以透過翻轉順序的方式，可以只用上述六個運算元實作出來。舉例來說：「如果大於時跳躍」可以用「小於或等於時跳躍」來實作。

這六個比較跳躍有 12-bit 的有號位移，可以跳到 PC±4KB 的範圍內。

RISC-V 要求 CPU 實作「預設分支預測」 (default branch prediction)。如果是往回跳躍 (例如： do {...} while (expr) 中的 expr 判斷式），CPU 要預測跳躍會發生，也就是預測 expr 「會」成立。如果是向前跳躍（例如：if (expr) {...} else {...} 中的 else 部分），CPU 預測這個跳躍會發生，也就是預測 expr 「不會」成立。CPU 判斷往回或向前的方法，是看指令中相對位址的最高位元，也就是有號數的部分 (signed bit)：如果是 1，表示是負數，要往回跳躍。如果是 0，表示是正數，要向前跳躍。當然，複雜的 CPU 實作也可以加入更多的分支預測。

RISC-V 手冊也建議軟體（如：編譯器）利用預設分支預測的特性，來避免分支造成 pipeline 被停滯。方法就是利用上一段提到的 signed bit 來讓「暗示」 CPU 這個分支會不會發生。所以，就是算是簡單又便宜的 CPU ，也可以透過編譯器來優化效能。如果有需要，編譯器也可以透過統計等方式來優化效能。

所以，為了避免不必要的分支預測電路（以及不必要的 pipeline 停滯），無條件跳躍不要用「比較分支」來實作。

RISC-V 並不支援「條件執行」指令（condition execution，註：當某個條件成立的時候，才執行該指令）。設計者宣稱沒有這種設計的 CPU 比較容易設計，而且編譯器在進行優化的時候，也比較不容易假設錯誤。設計者宣稱高速又不照順序執行的 CPU 反正都會同時執行正反兩種結果，之後再丟棄其中一個。他們也宣稱，即使在簡單的 CPU 當中，條件執行其實是比較沒有價值的，不如跳躍預測來的有用。不使用條件執行的程式碼會比較大，但是他們宣稱壓縮指令集在大部分的情況下，可以解決這樣的問題。

許多的 RISC 設計都有「分支延遲槽」（branch delay slot），用來充份使用跳躍指令的下一個記憶體位址，這可以略略增加整體的 CPU 效能。RISC-V 並不支援這個功能，因為他會讓多時序，超純量，以及 long pipeline 變得很複雜。而動態分支預測其實已經做得很好，可以不需要這個功能了。

### 算術和邏輯集

RISC-V 把數學運算指令歸類到一個很小的 I 子集當中，包括：加法，減法，位移，位元運算，及比較跳躍。這些可以使用軟體的方式去類比其他大部分的 RISC-V 指令（atomic 運算是值得一提的例外）。RISC-V 目前沒有「數開頭有幾個零」以及一些用來加速軟體浮點運算的位元運算。

整數乘法子集（M 子集）包括：有號數與無號數的乘法與除法。

浮點子集包括單精度運算，以及類似於整數的「比較跳躍」。它需要額外的 32 個浮點暫存器，這些是與整數暫存器分開的。雙精度浮點子集一般假設浮點暫存器是 64 位元，而且會與 F 子集一起協作。RISC-V 亦有定義四精度 128-bit 浮點指令。沒有支援硬體浮點指令的 CPU，依舊可以使用軟體的浮點程式庫。

RISC-V 在遇到運算錯誤的時候，並不會丟擲異常，包括：overflow, underflow, subnormal 及 divide by zero。相反的，整數運算和浮點運算都會產生合理的預設數值，然後設定狀態位元。Divide-by-zero 可以用一個跳躍指令來處理。這些狀態位元可以也可以被作業系統或是定期的中斷檢查到。

### 原子記憶體操作

RISC-V 支援多個 CPU 與 thread。其標準記憶體同步模式是「釋放一致」原則。也就是說，讀取和寫入順序可以重排，但是有些讀取可以被設定成「獲取」運算，會在其後的存取之前被執行，有些寫入可以被當作「釋放」運算，必須在其之前的存取的後面執行。

基本指令當中包含了最少的支援，使用 fence 指令來保證記憶體存取順序。儘管這很簡單（fence r/rw 提供「獲取」，fence rw/w 提供「釋放」），組合起來還是可以很有效率。

## RISC-V 處理器

### 商業實現

#### 阿里巴巴玄鐵 910

阿里巴巴旗下半導體公司平頭哥釋出了它的首款 RISC-V 處理器「玄鐵 910」（XuanTie910），名字取自金庸小說《神鵰俠侶》。阿里巴巴稱它是目前效能最強的 RISC-V 處理器，支援 16 核，主頻 2.5GHz，單核效能達到 7.1 Coremark/MHz。阿里巴巴稱其效能突破源自兩大創新：一是它採用 3 發射 8 執行的複雜亂序執行架構，是業界首個實現每周期 2 條記憶體存取的 RISC-V 處理器；二是它基於 RISC-V 擴充了 50 余條指令，系統性增強了 RISC-V 的計算、儲存和多核等方面能力。

2021 年平頭哥半導體釋出玄鐵 C910 處理器開源項目，同時還發布出 C910 的 LLVM 編譯器原始碼。

#### SiFive 公司的 RISC-V 半導體 IP 核系列

RISC-V 創始人所創辦的 SiFive 公司提供一系列 RISC-V 半導體 IP 核，包含高效能、高效能、低功耗及嵌入式 RISC-V 處理器。

### 開源實現

#### 中國科學院「香山」

中國科學院計算所在 2020 年釋出「香山」高效能 RISC-V 處理器開源項目，香山以 Chisel 硬體描述語言開發。 第一版「雁棲湖架構」使用台積電的 28nm 製程，工作頻率為 1.3GHz。

#### 威騰電子「SweRV」

威騰電子在 2018 年釋出 SweRV RISC-V 處理器開源項目，SweRV 目標應用環境為儲存裝置控制器，從開源以來已有多家廠商採用。

## 參見

* 精簡指令集 (RISC)
* OpenRISC，以 GNU General Public License 授權
* OVPsim，RISC-V 處理器指令子集、核心和系統的指令精確模擬器。免費為非商業用途提供。
* ARM 架構
* 開源運算硬體列表

## 參考資料

## 拓展閱讀

* The RISC-V Instruction Set Manual（頁面存檔備份，存於網際網路檔案館）
* Instruction Sets Should Be Free: The Case For RISC-V（頁面存檔備份，存於網際網路檔案館） Whitepaper by Krste Asanović and David A. Patterson
* The RISC-V Instruction Set（頁面存檔備份，存於網際網路檔案館） HotChips 25 (2013)
* The RISC-V Software Ecosystem（頁面存檔備份，存於網際網路檔案館） HPCA 2015, Tutorial
* Rocket Chip（頁面存檔備份，存於網際網路檔案館） HPCA 2015, Tutorial
* The RISC-V Compressed Instruction Set Manual Version 1.9 (draft)（頁面存檔備份，存於網際網路檔案館）

## 外部連結

* 官方網站
* GitHub 上的 UCB's site for RISC-V
* RISC-V: An Open Standard for SoCs. The case for an open ISA. EETimes. 8 July 2014 [2017-08-28]. （原始內容存檔於 2017-08-24）.
* Pulpino: A developed, open-source system-on-chip based on RISC-V, 4 August 2016
* Hruska, Joel. RISC rides again: New RISC-V architecture hopes to battle ARM and x86 by being totally open source. ExtremeTech. 21 August 2014 [2017-08-28]. （原始內容存檔於 2017-08-24）.
* Analyzing the RISC-V Instruction Set Architecture. Adapteva. 11 August 2014 [2017-08-28]. （原始內容存檔於 2017-08-04）.
* YouTube 上的 RISC-V 頻道
* search: RISC-V since 2013. Google Scholar.