RISCV（英語發音為 riskfive）是一個基於精簡指令集（RISC）原則的開源指令集架構（ISA），簡易解釋為與開源軟體運動相對應的一種「開源硬體」。該專案於 2010 年在加州大學柏克萊分校啟動，但許多貢獻者是該大學以外的志願者和 zhtw 業界人士；zhcn 行業工作者。 與大多數指令集相比，RISCV 指令集可以自由地用於任何目的，允許任何人設計、製造和銷售 RISCV 晶片和軟體而不必支付給任何公司專利費。雖然這不是第一個開源指令集，但它具有重要意義，因為其設計使其適用於現代計算裝置（如倉庫規模雲計算機、高階行動電話和微小嵌入式系統）。設計者考慮到了這些用途中的效能與功率效率。該指令集還具有眾多支援的軟體，這解決了新指令集通常的弱點。新浪 圖靈獎得主加入清華，牽頭推動晶片開源 RISCV 指令集的設計考慮了小型、快速、低功耗的現實情況來實做，但並沒有對特定的微架構做過度的設計。 截至 2021 年 12 月，RISCV 工作小組已經批准了版本 20191213 的非特權指令集（Unprivileged ISA，曾經稱為使用者級指令集 UserLevel ISA），以及版本 20211203 的特權指令集（Privileged ISA）。 意義 RISCV 的作者們旨在提供數種可以在 BSD 許可證之下自由使用的 CPU 設計。該許可證允許像是 RISCV 晶片設計等衍生作品可以像 RISCV 本身一樣是公開且自由發行，也可以是閉源或者是專有財產。 相比而言，ARM 控股和 MIPS 科技等商業晶片供應商會對使用其專利者收取高額的許可費用。他們也要求在接收其描述設計優點的檔案和指令集前，還需要簽署保密協議。許多設計優點為完全專有，從來不會披露給客戶。這種保密制度阻礙了公共教育用途和安全審核，以及開發公共、低成本的自由及開放原始碼軟體編譯器和作業系統。 處理器設計需要多種專業的設計知識，包括電子邏輯、編譯器和作業系統，這種資源很難在專業工程團隊之外見到。所以現代且高質量的通用計算機指令集近年來除了學術環境以外並沒有在任何地方被廣泛使用，甚至沒有被闡述。正因如此，許多 RISCV 貢獻者將此視為整個社群付出的成果，而這也是 RISCV 有很多工程上的應用的一項原因。 RISCV 的作者們還有大量研究和使用者經驗來驗證他們在矽片和模擬中的設計。RISCV 指令集是從一系列的學術計算機設計專案直接發展而來的。它一開始的目的有一部分是為了幫助這些專案。 歷史 前身 RISC 的歷史可追溯到 1980 年左右。在此之前，人們覺得簡單的計算機可能會有用，但是沒有很多人去闡述其設計原則。這種簡單而有效的計算機一直都是學術界的興趣。 學術界的學者們為了出版第一版的《計算機體系結構：量化研究方法》（Computer Architecture A Quantitative Approach）ISBN 9781558600690 ，所以於 1990 年訂立了 RISC 指令集。大衛帕特森（David Patterson）是其中一位作者，後來協助 RISCV 的開發。但是 DLX 只用於教育用途，學術界和業餘愛好者使用 FPGA 來實做它，但並沒有取得商業運用。 版本 2 及更早版本的 ARM CPU 具有公共域指令集，並且仍有 GCC 的支援。該指令集有三個開源核心，但從未被製造。 是一款基於 DLX 的開源指令集，並且具有相關的 RISC 設計。OpenRISC 完全支援 GCC 並且有實做在 Linux 上，但是它很少有商業上的實做。 RISCV 基金會及 RISCV 國際 加州柏克萊分校的發現開放原始碼的電腦系統有很多用途。在 2010 年他決定用三個月的時間來開發並發表一個開放原始碼的電腦系統。這個計畫是用來幫助包括學術以及工業的使用者。柏克萊分校的大衛帕特森教授也參加了這個計畫。帕特森也是原來伯克利分校 RISC 的設計者，RISCV 只是他眾多 RISC CPU 研究計畫的一個．RISCV 計畫早期一些經費來自 DARPA。 有參與支援 RISCV 基金會的公司以及機構包括了超微半導體、晶心科技、英國航太系統、加州大學伯克利分校、、Cortus、Google、GreenWaves Technology、慧與科技、華為、IBM、Imperas Software、中國科學院、北京清華大學、印度理工學院、萊迪思半導體、邁倫科技、美高森美、美光科技、輝達、恩智浦半導體、甲骨文公司、高通、Rambus、威騰電子、、阿里巴巴集團、紅帽公司、成為資本。 2019 年 6 月，圖靈獎得主、RISCV 基金會創始人之一大衛帕特森（David Patterson）在瑞士宣佈，將依託（TBSI），在內部建設 RISCV 國際開源實驗室（RISCV International Open Source Laboratory），又稱大衛帕特森 RIOS 圖靈實驗室。清華大學稱實驗室將瞄準世界 CPU 產業戰略發展新方向和粵港澳大灣區產業創新需求，聚焦於開源指令集 CPU 研究，建設以深圳為根節點的 RISCV 全球創新網路和以技術成果轉移為主要使命的非營利組織，全面提升 RISCV 生態系至最先進可商用水平。預判屆時將面對國際大廠法律層面發起挑戰問題上，伯克利加州大學和清華大學的法學院將與之建立聯絡。 2020 年 3 月，RISCV 基金會為規避美國對中國的貿易限制而將總部搬遷至瑞士，並更名為 RISCV 國際，以非盈利商業協會的身份在瑞士註冊。 獎項 2017：The Linley Groups Analysts Choice Award for Best Technology（對其指令集） 激勵要求 RISC 設計者們認為指令集因為位於硬體和軟體之間，所以是電腦主要的溝通橋樑，因此如果有一個設計良好的指令集是開源而且可以被任何人使用的，就可以讓更多的資源能夠重複利用，而大大的減少軟體的成本。而這樣的指令集也會增加硬體供應商市場的競爭力，因為硬體供應商們可以挪用更多資源來進行設計，減少處理軟體支援的事務。 設計者聲稱在指令集設計領域裡，新的設計準則漸漸變得罕見，而近四十年中，大多數成功的設計變得越來越相似。至於那些失敗的指令集，大多數是因為他們的贊助商賺不了錢，而不是因為其指令集在技術上有多差。所以，一個在成熟的設計準則之下開發且設計良好的開源指令集想必能吸引許多供應商長期的支援。 許多先前的開源指令集架構使用 GNU 通用公共授權條款來鼓勵使用者們允許他們的實作方法被其他人複製或是使用。 設計者們表示，RISCV 指令集是給實際上的電腦使用的，它不像其他學術上的指令集設計，只有為了比較好闡述理念而做最佳化。而 RISCV 指令集有一些功能是可以增加電腦速度又可以減少成本和電源使用。這些特色包含，Loadstore 架構，在 CPU 裡面的位元表示方法來簡化資料多工器（MUX），以標準為基礎來簡化的浮點數，架構中立的設計和把最高有效位（Most significant bit，MSB）放到固定位置來加速符號擴充（Sign extension）。而 sign extension 常常就是靜態時序分析裡面的關鍵路徑（Critical timing path）。 RISCV 指令集是設計來給各式各樣的用途使用的，而它支援三個不同的字組大小，分別是 32 位元、64 位元、128 位元以及與這三種字組大小有關的各式各樣的指令子集。而這些指令子集的定義會按照那三個字組大小來做些微的改動。透過這些指令子集的向量處理器與資料中心等級的機櫃式平行電腦 平行運算來幫助嵌入式系統、個人電腦和超級電腦。 該指令集採取不固定的編碼長度而且還可以再擴充，因此在未來，還可以一直加入更多位元的編碼方式。該指令集有特別留空間給 128 位元的延伸版本，因為 60 年的產業界經驗顯示在指令集設計領域裡，最無法復原的錯誤就是缺少記憶體定址空間。截至 2016 年，128 位元的指令集仍然刻意地維持在「未」的狀態，這是因為到現在為止，人們很少有實際上操作這麼大記憶體的系統的經驗。 然而，RISCV 也可以拿來做學術上的使用。它擁有簡化的整數指令子集允許學生拿來做基本的練習，而整數指令子集就是一個簡單的指令集架構（ISA）讓軟體可以控制研究上的機器。而不定長度的指令集架構也允許擴充功能來滿足研究或是學生練習上的需求。分割出來的特權指令集可以支援在不重新設計編譯器的情況下，進行作業系統方面的研究。RISCV 的開放的智慧財產權允許相關的設計被發布、使用和修改。 軟體 一個新的 CPU 指令集通常的問題是缺少 CPU 的硬體設計跟軟體的支援。在 RISCV 的網站有一個 user mode 指令集的規格，還有一個用來支援作業系統模式的優先指令集的初步規格。 市面上已經有好幾個使用 RISCV 開源架構的 CPU 設計可以供參考，包括 64bit Berkeley Out of Order Machine（BOOM）、64bit Rocket、柏克萊設計的五個 32bit Sodor CPU、Clifford Wolf 的 picorv32、Syntacore 的 scr1、蘇黎世聯邦理工學院／波隆納大學的 PULPino （Riscy and ZeroRiscy），以及很多其他的設計。使用三層指令分段的 Sodor CPU 是一個適合嵌入式設計的小型 CPU。Rocket 可能適用在小型低功耗的個人電腦或其他個人裝置。BOOM 使用了大部分 Rocket 的架構，但是功能更加強大，適合個人電腦、伺服器或超級電腦。picorv 跟 scr1 都是使用 Verilog 設計的 32 位元 MCU 等級的 RV32IMC。PULPino 的核心使用了一個適合微控制器的簡單的 RV32IMC ISA 架構 ZeroRiscy，以及另外一個更強大的 DSP 版本 RV32IMFC ISA 可以支援一些嵌入式訊號處理的特別 DSP 指令集。 設計軟體包括了一個設計編譯器 ，它可把設計編譯成 Verilog 程式碼。網站上還有測試用的參考資料可以用來驗證設計的正確性。 RISCV 目前提供的軟體有 GNU Compiler Collection （GCC） toolchain（具有偵錯器 GDB）、一套 LLVM toolchain、模擬器（以及 RISCV 快速處理器模式的軟體參考庫）、Spike 模擬器，以及一套在 QEMU 上執行的模擬器。 作業系統的支援包括 Linux 核心、FreeBSD，以及 NetBSD，但是監督模式的指令直到版本 111 的特權指令集才被標準化，所以這方面的支援還不是正式的。有一個早期的 RISCV 的 FreeBSD 作業系統已經在 2016 年 2 月上傳到開放原始碼社群，而且包含在 FreeBSD 110 。Debian 跟 Fedora 的版本也有人在移植，並且在逐漸穩定中。已經有人做了一個 Das UBoot 的移植版本。UEFI Spec v27 定義了 RISCV UFEI 的規格，而且慧與科技公司的工程師已經做好一個 的移植版本，並且將會上傳到開放原始碼社群。已經有人做好了一個 L4 microkernel family 的移植。還有一個在網頁上用 JavaScript 寫的 RISCV Linux 系統模擬器。 設計 指令子集 RISCV 指令使用模組化設計，包括幾個可以互相替換的基本指令集，以及額外可以選擇的擴充指令集。所有基本跟擴充的指令集都是由科技產業、研究機構跟學術界合作開發的。基本指令集規範了指令跟他們的編碼、控制流程、暫存器數目（以及它們的長度）、記憶體跟定址方式、邏輯（整數）運算以及其他。只要有軟體以及一個通用的編譯器的支援，只用基本指令集就可以製作一個簡單的通用型的電腦。 標準的擴充指令集可以搭配所有的基本指令集以及其他擴充指令集，而不會發生衝突。 很多 RISCV 電腦可能使用精簡擴充指令集來降低電力消耗、程式的大小以及記憶體的使用。未來也有計畫支援 hypervisor 和虛擬化。 只要再加上一個監督指令集 S 的擴充，以及以下 RVGC 指令集，就有足夠的指令可以支援一個 Unixstyle 作業系統。 指令集名稱 描述 版本 狀態 基本指令集 基本指令集 基本指令集 基本指令集 RVWMO RISCV 弱記憶體模型 20 RV32I 基本整數指令集，32 位元 21 RV32E 基本整數指令集 嵌入式系統 32 位元，16 個暫存器 20 RV64I 基本整數指令集，64 位元 21 RV64E 基本整數指令集 嵌入式系統 64 位元，16 個暫存器 20 RV128I 基本整數指令集，128 位元 17 標準擴充指令集 標準擴充指令集 標準擴充指令集 標準擴充指令集 M 整數乘除法標準擴充 20 A 不可中斷指令 Atomic 標準擴充 21 F 單精度浮點標準擴充 22 D 雙精度浮點標準擴充 22 Zicsr 控制與狀態暫存器 20 Zifencei 指令抓取屏障 20 G 所有以上的擴充指令集以及基本指令集的總和的簡稱 Q 四精度浮點標準擴充 22 L 十進位浮點標準擴充 00 C 壓縮指令標準擴充 20 B 位元運算標準擴充 10 J 動態指令翻譯標準擴充 00 T 順序記憶體存取標準擴充 00 P 單指令多資料流（SIMD）運算標準擴充 0910 V 向量運算標準擴充 10 Zk 標量加密標準擴充 101 H Hypervisor 標準擴充 10 S Supervisor 標準擴充 112 Zam 非對齊不可中斷指令標準擴充 01 Zihintpause 暫停提示 20 Zihintntl 非時間區域性性提示 03 Zfa 額外浮點運算指令標準擴充 10 Zfh 半精度浮點標準擴充 10 Zfhmin 半精度浮點最小集標準擴充 10 Zfinx 整數暫存器單精度浮點標準擴充 10 Zdinx 整數暫存器雙精度浮點標準擴充 10 Zhinx 整數暫存器半精度浮點標準擴充 10 Zhinxmin 整數暫存器半精度浮點最小集標準擴充 10 Zmmul 整數純乘法標準擴充 10 Ztso 全儲存排序標準擴充 10 為了分辨各種不同的指令組合，非特權指令集標準中訂定了一些專有名詞。首先先指明基本指令集的種類，包括表示 RISCV 的代號 RV，然後是暫存器的寬度跟其他變化，例如 RV64I 或 RV32E。然後用上表的字母（以及表列的順序）表示用了哪種擴充指令，例如 RV64IMAFD。 基本指令集、擴充整數或浮點運算、多 CPU 系統使用的同步指令擴充，標準擴充指令 MAFD 被認為是大部分的一般運算都需要的，所以有一個字母的簡稱 G 用來表示 IMAFDZicsr_Zifencei。 使用嵌入式系統的一個小的 32 位元電腦可能用 RV32EC，而大型的 64 位元電腦可以用 RV64GC，即 RV64IMAFDCZicsr_Zifencei 的簡稱。 隨著擴充指令集數量的增加，指令集標準提供了另外一種命名方式，用 Z 字首緊接著字母名稱表示標準擴充，例如 Zifencei 表示指令抓取屏障擴充。 暫存器集 RISCV 有 32 個整數暫存器（在嵌入式版本則是 16 個）。當浮點延伸集被實作的時候，還有 32 個浮點暫存器。除了「記憶體存取指令」之外，一般指令「只能」定址暫存器而無法存取記憶體。 如同有些 RISC 指令集（MIPS SPARC DEC Alpha），其中一個暫存器為「零暫存器」（zero register），剩下的暫存器為通用暫存器。在 RISCV 當中，第一個整數暫存器是零暫存器，儲存數值到零暫存器是沒有作用的，而讀取零暫存器的數值將始終得到 0。使用零暫存器可以讓指令集設計更簡單。比方說，把「暫存器 X 複製到暫存器 Y」 ，可以使用「將暫存器 X 與 0 相加後，複製到暫存器 Y」 實作。 RISCV 有提供「控制暫存器」及「狀態暫存器」，但是 usermode 程式只能存取用來「量測效能」及「浮點管理」的部分。 RISCV 並沒有指令可以儲存和回復（save and restore。註：通常用於 contextswitch，中斷處理，或是函式呼叫）多個暫存器。這些設計在 RISCV 當中，被認為是不必要的，過於複雜的，可能過慢的設計。 記憶體存取 就像許多的 RISC 一樣，RISCV 屬於載入 儲存架構，只有 load 與 store 指令可以存取記憶體。 Load 和 Store 指令可以直接使用程式碼中的常數、在堆疊中的本地變數、或是資料結構中的內容。定址的方式是使用基底暫存器與 12bit 的 signed 相對地址 2KB。如果基底暫存器是 0，則資料或是常數可以在低位址，或是高位址（負的相對地址，導致繞回到高的記憶體地址。比方說 ROM 的記憶體地址）。 記憶體的定址單位是 8bit 的 byte，以 littleendian 存放在記憶體。Load 與 Store 支援的資料長度從 8bit 到電腦的 word 大小。記憶體存取並不需要對齊到 word 的大小，不過如果有對齊的話，可以增加效能。這項功能可以減小程式碼大小，而且透過軟體的模擬，還可以簡化硬體的設計（會觸發一個「對齊失敗」的中斷）。 和其他類似成功的電腦一樣，RISCV 也是 littleendian。這稍稍降低了複雜度與成本，因為所有大小的 word 的讀取都遵循一樣的順序。舉例來說，RISCV 的指令集都是從最低位址的 byte 開始解碼。RISCV 的規格書保留了實作 bigendian 的可能性。 如同許多的 RISC 指令集一樣，RISCV 並沒有可以「寫入多個暫存器」的定址模式。比方說：不支援 autoincrementing（像是 就無法使用一個指令完成，而必須拆解成「一個 load 指令」及「一個 指令」。） RISCV 管理 CPU 與 thread 之間的共用記憶體的方式是確保在單一的 thread 當中，記憶體存取指令的執行順序永遠是遵照原本的編譯順序。不過在不同的 thread 以及在 IO 裝置之間，RISCV 不保證存取的順序除非有像 這樣的指令出現。 保證在其之前的執行結果，一定會被其後的 thread 或 IO 裝置看到。 有 8bit 可以分別指定 memory readwrite 與 IO readwrite 的各種組合順序。透過這些組合， 可以保證記憶體與 memorymapped IO 之間的執行順序。比方說：其中一個組合是可以在不影響 IO 運算的情況下，只保證記憶體的讀取和寫入順序。也就是說，如果 IO 運算可以和記憶體同時執行的話， 不會強迫他們之間要互相等待。單一 CPU 上執行單一 thread 的情況下，可以把 視作 指令。 有些 RISC CPUs（例如：MIPS、PowerPC、DLX、Berkeleys RISCI）在 LoadSave 指令當中使用 16bit 位移。使用 load upper word 指令來設定最高的 16bit。這讓最高的 16bit 資料可以很容易被設定，而不需要位移指令。然而，大部分使用 load upper word 的時機都是為了要載入一個常數（比如：地址）。RISCV 則是使用類似 SPARC 12bit 與 20bit 的設計，而 RISCV 所採用的 12bit 設計可以讓指令更小。也就是說，這使得 32bit 的 loadstore 指令，就算需要在 32 個暫存器（需要 5bit 定址）當中選兩個來用（一共 10bit），還是有足夠的 bit 數目來支援 RISCV 的可變長度指令編碼 variablelength instruction coding。 注：請參考 32bit 的 Itype 指令格式，就會發現這個 12bit 位移比 16bit 來得優異的地方。這使得 32bit 的空間當中，扣掉 12bit 的常數值，以及最低的兩個 bit 為 11（表示這是一個 32bit 長的指令），再扣掉兩個 5bit 的暫存器位址，還有將近 8bit 的空間可以留給 opcode 及 func3 。如果是使用 16bit immediate 的話，會使得空間不夠放下兩個 5bit 的暫存器位址。舉例來說， Shift Left Logical Immediate 將會被迫拆解成兩個指令來完成：。 立即數 RISCV 讀取 32bit 常數與位址是透過設定 upper 20bit 的指令達到的。 指令（Load Upper Immediate）把（指令中的）20bit 讀取到暫存器的 3112 bits 當中。 另一個 指令，也是一樣讀取 upper 20bit，同時又加上 PC（Program Counter）之後，存放到某個基底暫存器。這個指令讓地址無關程式碼能夠支援「相對於程式碼位置的 32bit 地址」。 這個基底暫存器可以再搭配 12bit 位移，使用在 Load 與 Store 指令當中。如果需要的話，也可以使用 指令，將 lower 12bit 的常數加到一個暫存器中（注：這樣就完成一個完整的 32bit 常數讀取）。在 64bit 架構下， 與 執行的結果會被位元擴充至 64bit。 有些高速的 CPU 會把一些指令「融合」成一個指令。比如說：上述的 與 就很適合和 LoadSave 指令一起融合。 函式呼叫、跳躍和分支 RISCV 的函式呼叫 （Jump and Link）把回傳地址放入一個暫存器。由於相較於其他把回傳地址存入堆疊的設計，它省下了一次對堆疊記憶體的存取，所以在許多的處理器設計中是比較快速的。 有一個 20bit signed 位移。這個位移會被乘上 2 之後，加到 PC 當中，以產生指向 32 位元指令的相對位址。如果該位址沒有對齊到 32bit 位址（即不可被 4 整除），CPU 會觸發一個例外。 RISCV 的 （Jump and Link Register）指令與 相似，但是 是把一個 12bit 的相對位移和某一個暫存器相加，而 是用 20bit 的相對位移與 PC 相加。 的指令格式與使用暫存器的 loadstore 指令相似。搭配另一個設定高位 20bit 的基底暫存器，可以組成一個 32bit 的地址（可以是絕對位址，例如 ；或是相對於 PC 的位址，例如 ）。（使用零暫存器當基底暫存器，則可以跳到 0 2KB 的絕對位址） 透過使用零暫存器，兩種無條件跳躍：「20bit PC 相對位址」以及「暫存器為底的 12bit」，分別使用 與 兩個指令來實作。在這個情況下，因為目的地暫存器是零存器，所以回傳位址會被丟棄。 如同許多的 RISC 系統，在一個函式呼叫當中，RISCV 編譯器必須使用多個指令將暫存器一個一個地存到堆疊當中，然後在函式結束的時候，一個一個地將暫存器自堆疊中還原。RISCV 沒有「儲存多個」或是「還原多個」暫存器的指令，因為這些指令被認為會讓 CPU 變得過於複雜，而且可能更慢。然而 RISCV 的這種設計會增加程式大小，而設計者原本的規劃是透過呼叫子程式來減少程式大小。 RISCV 沒有。設計者相信條件碼暫存器會讓高速 CPU 的設計更加複雜，因為它強迫了不同執行階段的指令之間進行互動。這樣的設計會使得高精度計算變得更複雜，有些數值計算需要更多的能量。 相反地，RISCV 透過比較兩個暫存器來實現分支，指令包括：相等、不相等、小於、無號數小於、大於、無號數大於。十種「比較分支」運算，可以透過反轉運算元順序的方式，只用上述六種指令實作出來。舉例來說：「如果大於時跳躍」可以用運算元順序相反的「如果小於或等於時跳躍」來實作。 這六種比較分支指令具有 12bit 的有號位移，可以跳到 PC4KB 的範圍內。 RISCV 要求 CPU 實作「預設分支預測」（default branch prediction）。如果是往回跳躍 例如：中的 判斷式），CPU 要預測跳躍會發生，也就是預測 「會」成立。如果是向前跳躍（例如： 中的 部分），CPU 預測這個跳躍會發生，也就是預測 「不會」成立。CPU 判斷往回或向前的方法，是看指令中相對位址的最高位元，也就是有號數（signed bit）的部分：如果是 1，表示是負數，要往回跳躍；如果是 0，表示是正數，要向前跳躍。當然，複雜的 CPU 實作也可以加入更多的分支預測。 RISCV 手冊也建議軟體（如：編譯器）利用預設分支預測的特性，來避免分支造成 pipeline 被停滯。方法就是利用上一段提到的 signed bit 來「暗示」 CPU 這個分支會不會發生。所以，就是算是簡單又便宜的 CPU ，也可以透過編譯器來最佳化效能。如果有需要，編譯器也可以透過統計等方式來最佳化效能。 所以，為了避免不必要的分支預測電路（以及不必要的 pipeline 停滯），無條件跳躍不要用「比較分支」來實作。 RISCV 並不支援「條件執行」指令（conditional execution，註：當某個條件成立的時候，才執行該指令）。設計者宣稱沒有這種設計的 CPU 比較容易設計，而且編譯器在進行最佳化的時候，也比較不容易假設錯誤。設計者宣稱高速又不照順序執行的 CPU 反正都會同時執行正反兩種結果，之後再丟棄其中一個。他們也宣稱，即使在簡單的 CPU 當中，條件執行其實是比較沒有價值的，不如跳躍預測來的有用。不使用條件執行的程式碼會比較大，但是他們宣稱壓縮指令集在大部分的情況下，可以解決這樣的問題。 許多的 RISC 設計都有「分支延遲槽」（branch delay slot），用來充份使用跳躍指令的下一個記憶體位址，這可以略略增加整體的 CPU 效能。RISCV 並不支援這個功能，因為他會讓多時序、超純量，以及 long pipeline 變得很複雜。而動態分支預測其實已經做得很好，可以不需要這個功能了。 算術和邏輯集 RISCV 把數學運算指令歸類到一個很小的 I 子集當中，包括：加法、減法、位移、位元運算，及比較分支。這些可以使用軟體的方式去模擬其他大部分的 RISCV 指令（atomic 運算是值得一提的例外）。RISCV 目前沒有「數開頭有幾個零」以及一些用來加速軟體浮點運算的位元運算。 整數乘法子集（M 子集）包括：有號數與無號數的乘法與除法。 浮點子集（F 子集）包括單精度運算，以及類似於整數的「比較分支」。它需要額外的 32 個浮點暫存器，這些暫存器是與整數暫存器分開的。雙精度浮點子集（D 子集）一般假設浮點暫存器是 64 位元，而且會與 F 子集一起協作。RISCV 亦有定義四精度 128bit 浮點子集（Q 子集）。沒有支援硬體浮點指令的 RISCV CPU，依舊可以使用軟體的浮點程式庫。 RISCV 在遇到運算錯誤的時候，並不會丟擲異常，包括：overflow、underflow、subnormal 及 divide by zero。相反的，整數運算和浮點運算都會產生合理的預設數值，而且浮點運算指令還會設定狀態位元。Dividebyzero 可以透過在除法運算之後放置分支指令來發現。這些狀態位元可以也可以被作業系統或是定期的中斷檢查到。 原子記憶體操作 RISCV 支援計算機在多個 CPU 與執行緒之間共享記憶體。RISCV 的標準記憶體同步模式是「」原則。也就是說，讀取和寫入順序可以被重排，但是有些讀取可以被設定成「獲取」（acquire）運算，必須在其後的存取之前被執行；有些寫入可以被當作「釋放」（release）運算，必須在其之前的存取的後面執行。 基本指令集包含了以指令提供的最小支援，來保證記憶體存取順序。儘管這已經足夠了（ 提供「獲取」， 提供「釋放」），使用組合操作指令可以更有效率。 原子操作子集（A 子集）支援兩種型別的原子記憶體操作，以實現。首先，它提供了通用的 loadreserved 及 storeconditional 指令。執行載入，並嘗試為其執行緒保留該地址。僅當該保留未被來自另一個來源的幹預性寫入破壞時，才會執行對保留地址的 storeconditional 。如果寫入成功，則將零放入目標暫存器中；如果失敗，則以非零值表示軟體需要重試操作。在任何一種情況下，保留都會被釋放。 第二組原子指令 AMO（Atomic Memory Operation）執行 Readmodifywrite 操作：讀取（可選為讀取 獲取）到目標暫存器，然後執行讀出值和來源暫存器值之間的操作，然後寫入（可選為寫入 釋放）結果。將記憶體屏障設計為可選的，允許了多個操作的組合。每個 AMO 的操作碼中都有「獲取」及「釋放」位元，用於啟用可選的記憶體屏障。 RISCV 處理器 商業實現 阿里巴巴玄鐵 910 阿里巴巴旗下半導體公司平頭哥釋出了它的首款 RISCV 處理器「玄鐵 910」（XuanTie910），名字取自金庸小說《神鵰俠侶》。阿里巴巴稱它是目前效能最強的 RISCV 處理器，支援 16 核，主頻 25GHz，單核效能達到 71 CoremarkMHz。阿里巴巴稱其效能突破源自兩大創新：一是它採用 3 發射 8 執行的複雜亂序執行架構，是業界首個實現每週期 2 條記憶體訪問的 RISCV 處理器；二是它基於 RISCV 擴充套件了 50 餘條指令，系統性增強了 RISCV 的計算、儲存和多核等方面能力。 2021 年平頭哥半導體釋出玄鐵 C910 處理器開源專案，同時還發布出 C910 的 LLVM 編譯器原始碼。 SiFive 公司的 RISCV 半導體 IP 核系列 RISCV 創始人所創辦的 SiFive 公司提供一系列 RISCV 半導體 IP 核，包含高效能、高效能、低功耗及嵌入式 RISCV 處理器。 晶心科技的 RISCV CPU IP 系列 晶心提供可配置性高的 3264 位元高效能 CPU 核心，包含 DSP、FPU、Vector、超純量 Superscalar、亂序執行 OutofOrder 及多核心繫列。 開源實現 中國科學院「香山」 中國科學院計算所在 2020 年釋出「香山」高效能 RISCV 處理器開源專案，香山以硬體描述語言開發。 第一版「雁棲湖架構」使用臺積電的 28nm 製程，工作頻率為 13GHz。 威騰電子「SweRV」 威騰電子在 2018 年釋出 SweRV RISCV 處理器開源專案，SweRV 目標應用環境為儲存裝置控制器，從開源以來已有多家廠商採用。 參見 精簡指令集 RISC OpenRISC，以 GNU General Public License 授權 ，RISCV 處理器指令子集、核心和系統的指令精確模擬器。免費為非商業用途提供。 ARM 架構 參考資料 拓展閱讀 The RISCV Instruction Set Manual Instruction Sets Should Be Free The Case For RISCV Whitepaper by Krste Asanović and David A Patterson The RISCV Instruction Set HotChips 25 2013 The RISCV Software Ecosystem HPCA 2015 Tutorial Rocket Chip HPCA 2015 Tutorial The RISCV Compressed Instruction Set Manual Version 19 draft 外部連結 Pulpino A developed opensource systemonchip based on RISCV 4 August 2016 Category2010 年軟體 Category 指令集架構 Category 開源微處理器