RISC-V

意義

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

激勵要求

RISC設計者們認為指令集因為位於硬體和軟體之間，所以是電腦主要的溝通橋樑，因此如果有一個設計良好的指令集是開源而且可以被任何人使用的，就可以讓更多的資源能夠重複利用，而大大的減少軟體的成本。而這樣的指令集也會增加硬體供應商市場的競爭，因為硬體供應商們可以挪用更多資源來進行設計，減少處理軟體支援的事務。
設計者聲稱在指令集設計領域裡，新的設計準則漸漸變得罕見，而近四十年中，大多數成功的設計變得越來越相似。至於那些失敗的指令集，大多數是因為他們的贊助商賺不了錢，而不是因為其指令集在技術上有多差。所以，一個在成熟的設計準則之下開發且設計良好的開源指令集想必能吸引許多供應商長期的支援。
許多先前的開源指令集架構使用GNU通用公眾授權條款來鼓勵使用者們允許他們的實作方法被其他人複製或是使用。
設計者們表示，RISC-V指令集是給實際上的電腦使用的，它不像其他學術上的指令集設計，只有為了比較好闡述理念而做最佳化。而RISC-V指令集有一些功能是可以增加電腦速度又可以減少成本和電源使用。這些特色包含，Load/store 架構，在CPU裡面的位元表示方法來簡化MUX（資料多工器），以標準為基礎來簡化的浮點數，架構中立的設計和把MSB(Most significant bit)放到固定位置來加速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 有 32 個整數暫存器 (在嵌入式版本則是 16 個)。當浮點延伸集被實作的時候，還有 32 個浮點暫存器。除了「記憶體存取指令」之外，一般指令「只能」定址暫存器 (註：無法存取記憶體）。
如同有些 RISC 指令集（MIPS, SPARC, DEC Alpha），其中一個暫存器為「零暫存器」（zero register，註：其值永遠為零），剩下的暫存器為通用暫存器。在 RISC 當中，第一個整數暫存器是零暫存器。儲存數值到零暫存器是沒有作用的。使用零暫存器可以讓指令集設計更簡單。比方說，把「暫存器 X 複製到暫存器 Y」 (MOV Y, X)，可以使用「將暫存器 X 與 0 相加後，複製到暫存器 Y」 (ADD Y, X, r0) 實作。 [4]
RISC-V 有提供「控制暫存器」及「狀態暫存器」，但是 user-mode 程式只能存取用來「量測效能」及「浮點管理」的部分。
RISC-V 並沒有指令可以儲存和回復（save and restore。註：通常用於 context-switch，中斷處理，或是函式呼叫）多個暫存器。這些設計在 RISC-V 當中，被認為是不必要的，過於複雜的，可能過慢的設計。 [4]

記憶體存取

就像許多的 RISC 一樣， RISC-V 只有 load 與 store 指令可以存取記憶體。
記憶體的定址單位是 8-bit 的 byte。，以 little-endian 存放在記憶體。Load 與 Store 支援的資料長度從 8-bit 到電腦的 word 大小。存取並不需要對齊到 word 的大小，不過如果有對齊的話，可以增加效能。這項功能可以減小程式碼大小，而且透過軟體的類比，還可以簡化硬體的設計（會觸發一個「對齊失敗」的中斷。
Load 和 Store 指令可以直接使用程式碼中的常數，在堆疊中的本地變數，或是資料結構中的內容。定址的方式是使用基底暫存器與 12-bit 的 signed 相對位址 (+- 2KB)。如果基底暫存器是 0，則資料或是常數可以在低位址，或是高位址（負的相對位址，導致繞回到高的記憶體位址。比方說 ROM 的記憶體位址）。
那麼，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 指令集一樣，RISC-V 並沒有可以「寫入多個暫存器」的定址模式。比方說：不支援 auto-incrementing（像是 *ptr++ 就無法使用一個指令完成，而必須拆解成「一個 load 指令」及「一個 addi 指令」。）
和其他類似成功的電腦一樣，RISC-V 也是 little-endian。這稍稍降低了複雜度與成本，因為所有大小的讀取，都遵循一樣的順序（註：例如 64-bit 與 128-bit 的讀取，都是從最小的 word 開始讀進來，只要一直 shift 就可以了）。舉例來說，RISC-V 的指令集都是從最低的那個 byte 開始解碼（註：opcode）。RISC-V 的規格書保留了實作 big-endian 的可能性。[4]
有些 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)。[4]
註：請參考 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 兩個指令來實作。在這個情況下，因為目的地暫存器是零存器，所以回傳位址會被丟棄。[4]
如同許多的 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 設計更加複雜，因為它必須強迫了指令們在不同的執行階段之間的互動作用。這樣的設計，會使得高精度計算變得更複雜，有些數值計算需要更多的能量。[4]
相反地，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 停滯），無條件跳躍不要用「比較分支」來實作。[4]
RISC-V 並不支援「條件執行」指令（condition execution，註：當某個條件成立的時候，才執行該指令）。設計者宣稱沒有這種設計的 CPU 比較容易設計，而且編譯器在進行最佳化的時候，也比較不容易假設錯誤。設計者宣稱高速又不照順序執行的 CPU 反正都會同時執行正反兩種結果，之後再丟棄其中一個。他們也宣稱，即使在簡單的 CPU 當中，條件執行其實是比較沒有價值的，不如跳躍預測來的有用。不使用條件執行的程式碼會比較大，但是他們宣稱壓縮指令集在大部分的情況下，可以解決這樣的問題。[4]
許多的 RISC 設計都有「分支延遲槽」（branch delay slot），用來充份使用跳躍指令的下一個記憶體位址，這可以略略增加整體的 CPU 效能。RSIV-V 並不支援這個功能，因為他會讓多時序，超純量，以及 long pipeline 變得很複雜。而動態分支預測其實已經做得很好，可以不需要這個功能了。[4]

算術和邏輯集

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處理器

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