RISC-V 指令集的模塊化和寄存器結構


0 前言

RISC-V 指令集架構是加州大學伯克利分校研發的第五代精簡指令集架構,先后經歷了四代精簡指令集的發展,旨在設計一個完全開放、免費的和性能強大的指令集架構。它和X86/ARM相比,一大優勢就是支持模塊化,下面我們就來介紹一下RISC-V指令集的模塊化結構,順便再介紹下其寄存器結構。

一、模塊化結構

RISC-V 指令集架構一改傳統增量 ISA 模式,采用模塊化 ISA 模式,它被定義為基本的整數指令集架構,以及幾個標准的擴展子集,可以自定義指令擴展,如下表所示。

在這里插入圖片描述

它的核心為RV32I的基礎整數指令集,RV32I 是固定的,並保持永遠不變,而其擴展是可選擇進行實現的。這為編譯器、匯編器和操作系統開發人員提供了穩定的研發目標。其擴展包括 M、F、D、A、G、C、V等,開發人員根據實際的應用程序,硬件設計可以選擇是否實現這些擴展。這種模塊化特性解決了以往指令集增量 ISA 模式和兼容性帶來的弊端,並且使得 RISC-V 具有了小型化、低功耗的特點,這對於嵌入式應用至關重要的。

RISC-V 指令集架構的標准擴展指令的具體介紹如下

  • I 擴展:整數擴展(I 擴展)表示 RISC-V 的基礎整數指令集,是任何一個實現中都必須存在的模塊。根據地址空間可分為 RV32I、RV64I、RV128I 三類。RV32I 非常精簡,只有 47 條指令,但它具有齊全的功能,可以形成編譯器目標,滿足現代操作系統和運行時的基本要求。它包括整數計算指令、控制轉移指令、加載-存儲指令以及系統調用等指令。

  • M 擴展:M 擴展即乘除擴展,是 RISC-V 整數乘除標准擴展指令集,包含了有符號和無符號的整數乘除法指令。

  • F 擴展/D 擴展:F 擴展和 D 擴展兩者是分開的,可單獨進行選擇實現。F 表示單精度浮點標准擴展指令集,D表示雙精度浮點標准擴展指令集。它們使用的是 32 個獨立的浮點寄存器而不是基本整數寄存器,除了具有加載-存儲和算術指令外,還包括一些加減乘除指令在內的分別進行融合計算的指令,讓計算過程變得更快速、簡潔和准確。另外為了保證數學庫代碼的編寫,還必須包括符號注入指令以及分類指令等。 F 和 D 兩個標准擴展沒有提供浮點分支指令,其主要功能被浮點比較指令所替代,也就是說可以依據兩個浮點數的比較結果信息將寄存器中的值設置為 0 或者 1,從而用於分支跳轉。

  • A 擴展:A 擴展表示標准原子擴展,是 RISC-V 的原子操作指令集,為實現多個RISC-V 線程之間的進行同步操作提供了技術支持。RV32A 標准擴展指令集為兩種不同的使用場景分別提供了加載保留/條件存儲指令和獲取和操作存儲器指令兩種原子性操作指令,其中加載保留和條件存儲指令確保了原子的比較-交換操作。即比較 A寄存器的值和 B 寄存器的內存地址指向的值,如果兩者相等,交換 C 寄存器中的值和內存中的值

  • G 擴展:通用擴展 G 是基本整數指令集和四個標准擴展指令集(即“IMAFD”)的總稱。

  • C 擴展:C 擴展表示壓縮擴展,是 RISC-V 的標准壓縮指令集。每條 16 位壓縮指 令一般情況必有一條標准的 32 位指令與之對應,並且僅僅對於匯編器和鏈接器是可見的。匯編器和鏈接器決定了是使用 16 位指令還是使用 32 指令,因此編譯器和匯編語言開發人員可以完全忽略壓縮指令及其格式。上述設計方案避免了在重新設計 ISA短指令集時,給處理器和編譯器的設計增加負擔的問題。

  • Q 擴展:Q 擴展是一個 128 位的四精度浮點指令集擴展。四精度浮點指令擴展的浮點寄存器可以用來存儲一個單精度、雙精度或者四精度的浮點數。四精度浮點擴展要求實現RV64IFD。

  • V 擴展:向量擴展是 RISC-V 向量指令集,與單指令多數據流(SIMD)指令的區別是,RV32V 采用了向量架構,實現了內部向量寄存器的寬度與指令集的分離,不會像 SIMD 那樣加寬了寄存器就會同時擴展了指令集,解決了 SIMD 指令集每次增加寬度,所導致的上層軟件適配問題。RISC-V 向量指令集包括向量計算指令、load-store指令、向量條件運算等指令。

除以上 RISC-V 標准指令集擴展外,RISC-V 還有多個標准指令集擴展,例如十進制浮點(L)、位操作(B)、封裝的單指令多數據(P)等。目前這些標准擴展大多數仍在不斷完善和設計中。

二、寄存器結構

RISC-V 指令集架構具有 32 位和 64 位的,其寄存器寬度也分別是 32 位和 64 位 的。RISC-V 的基本整數指令集中包含 32 個整數寄存器 x0~x31 以及一個程序計數器(pc)保存當前指令的地址。具體結構如下圖所示,其中 x1~x31 表示整數通用寄存器,其功能是保存程序運行的中間結果,存儲的是整數類型,寄存器 x0 代表常數0,可以使用 x0 實現一些指令功能
在這里插入圖片描述

另外在浮點指令集中,則需要 32 個獨立的浮點寄存器 f0~f31 和一個浮點控制和狀態寄存器 fcsr,結構如下圖所示:
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM