Skip to content
2001wei edited this page Jan 8, 2023 · 25 revisions
  • 第一章

    RISC-V的目標是成為一個通用的指令集架構(ISA)

    1. 要能適應包括從最小的嵌入式控制器,到最快的高性能電腦等各種規格的處理器。
    
    2. 能兼容各種流行軟件和編程語言。
    
    3. 適應所有實現技術,包括現場可編成門陣列(FPGA)、專用集成電路(ASIC)、全定制芯片,甚至未來的設備技術。
    
    4. 對所有微體系結構樣式都有效:例如微編碼或硬連線控制;順序或亂序執行流水線;單發射或超標量等等。
    
    5. 支持廣泛的專業化,成為定制加速器的基礎,因為隨著摩爾定律的消退,加速器的重要性日益提高。
    
    6. 是穩定的,基礎的指令集架構不應該改變。更重要的是不能像以前的專有指令集加購一樣被棄用,例如AMD Am29000、Digital Alpha、Digital VAX、Hewlett Packard PA-      RISC、Intel i860、Intel i960、Motorola 88000、以及ZilogZ8000。
    

    RISC-V與一般指令集架構的不同之處

    1. 為2010年左右所誕生的一個新興指令集架構(其他的指令集大概分布在1970~1980年)。
    
    2. 是開源的指令集架構。
    
       它的未來不受任何單一公司的浮沉或一時興起的决定的影響。
    3. 屬於一個開放的,非營利性質的基金會。
    
       RISC-V基金會的目標是保持RISC-V的穩定性,僅僅出於技術原因緩慢而謹慎地發展它,並力圖讓它在硬件中如同Linux在操作系統一樣受歡迎。
    4. 模塊化
    
       核心是一個名為RV32I的基礎ISA。是固定的永遠不會改變。這位編譯器編寫者,操作系統開發人員和彙編語言程序員提供了穩定的目標。
       模塊化來源於可選的標準擴展,根據應用程序的需要,硬件可以包含或不包含這些擴展。這種模塊化特性使得RISC-V具有了袖珍化、低能耗的特點,而这對於嵌入式應用可能至關重要。
       RISC-V編譯器得知當前硬件包含哪些擴展後,便可以生成當前硬件條件下的最佳代碼。慣例是把代表擴展的字母附加到指令集名稱之後作為指示。例如,RV32IMFD將乘法(RV32M),單精度浮點(RV32F)和雙精度浮點(RV32D)的擴展添加到了基礎指令集(RV32I)中。
    
  • 第二章

    RV32I(RISC-V 基礎整數指令集)

    六種基本指令格式

    1. 用於寄存器-寄存器操作的R類型指令(此類型的指令會有3個暫存器作為Input,分別是: rd,rs1,rs2。)
    
    2. 用於短立即數和訪存load操作的I型指令(包含了暫存器與立即數的運算。)
    
    3. 用於訪存store操作的S型指令(存取記憶體的指令。)
    
    4. 用於條件跳轉操作的B類型指令(分支指令的立即數字段在S類型的基礎上旋轉了1位。)
    
    5. 用於長立即數的U型指令(將立即數放到高位,這些指令被設計來實現完整的32bits運算。)
    
    6. 用於無条件跳轉的J型指令。(跳轉指令的直接字段在U類型的基礎上旋轉了12位。)
    
    因此,RISC-V實際上只有四種基本格式,但我們可以保守地認為它有六種格式。
    
  • 第三章

    RISC-V彙編语言

    函數調用規範(Calling convention)
    
       1. 將參數儲存到函數能夠訪問到的位置。
    
       2. 跳轉到函數開始位置(使用RV32I的jal指令)。
    
       3. 獲取函數需要的局部儲存資源,按需保存寄存器。
    
       4. 執行函數中的指令。
    
       5. 將返回值存儲到調用者能够訪問到的位置,恢復寄存器,釋放局部存儲資源。
    
       6. 返回調用函數的位(使用ret指令)。
    
    
    彙編器
    
       彙編指示符(assemble directives)。
          它們是彙編器的命令,具有告訴彙編器代碼和數據的位置、指定程序中使用的特定代碼和數據常量等作用。
          ex:
             .text:進入代碼段。
    
             .align 2:後續代碼按22字節對齊。
    
             .globl main:聲明全局符號“main”。
    
             .section .rodata:進入只讀數據段。
    
             .balign 4:數據段按4字節對齊。
    
             .string “Hello, %s!\n”:創建空字符結尾的字符串。
    
             .string “world”:創建空字符結尾的字符串。
    
  • 第四章

    乘法與除法指令

    除法
    
       1. 商 = (被除數 − 余數) ÷ 除數
    
       2. 被除數 = 除數 × 商 + 余數
    
       3. 余數 = 被除數 − (商 × 除數)
    
       RV32M具有有符號和無符號整數的除法指令:divide(div)和divide unsigned(divu),它們將商放入目標寄存器。在少數情况下,程序員需要餘數而不是商,因此RV32M提供remainder(rem)和remainder unsigned(remu),它們在目標寄存器寫入餘數,而不是商。
    
    乘法
    
       積 = 被乘數 × 乘數
    
       它比除法要更複雜,是因為積的長度是乘數和被乘數長度和。
    
       將兩個2位數相乘得到的是64位的乘積,為了正确地得到一個有符號或無符號的64位積,RISC-V中帶有四個乘法指令,
    
       要得到整數32位乘積(64位中的低32位)就用mul指令。
    
       要得到高32位,如果操作數都是有符號數,就用mulh指令
    
       如果操作數都是無符號數,就用mulhu指令
    
       如果一個有符號一個無符號,可以用mulhsu指令。
    
       在一條指令中完成把64位積寫入两個32位寄存器的操作會使硬件設計變得複雜,所以RV32M需要兩條乘法指令才能得到一個完整的64位積。
    
  • 第五章

    單精度浮點(RV32F)和雙精度浮點(RV32D)

    浮點寄存器
    
       使用32個獨立的f寄存器而不是x寄存器。
    
       使用兩組寄存器的主要原因是:處理器在不增加RISC-V指令格式中寄存器描述符所占空間的情况下使用兩組寄存器来將寄存器容量和帶寬是乘2,這可以提高處理器性能。
    
       使用兩組寄存器對RISC-V指令集的主要影響是,必須要添加新的指令來加載和存儲數據f寄存器,還需要添加新指令用於在x和f寄存器之間傳遞數據。
    
       如果處理器同时支持RV32F和RV32D擴展,則單精度數據僅使用f寄存器中的低32位。
    
       與RV32I中的x0不同,寄存器f0不是硬連線到常量0,而是和所有其他31個f寄存器一樣,是一个可變寄存器。
    
    許多浮點算法(例如矩陣乘法)在執行完乘法運算後會立即執行一條加法或减法指令。因此RISC-V提供了指令用於先將两个操作數相乘然後將乘積加上或减去第三個操作數,最後再將结果寫入目的寄存器。
    
  • 第六章

    原子指令

    將目標寄存器設置為操作前的内存值。原子表示内存讀寫之間的過程不會被打斷,内存值也不會被其它處理器修改。
    
  • 第七章

    壓縮指令

    每條短指令必須和一條標準的32位RISC-V指令一一對應。此外16位指令只對彙編器和鏈接器可見,並且是否以短指令取代對應的寬指令由它們决定。
    
  • 第八章

    向量

    RV32V采用了一種新穎的方法,即將數據類型和長度與向量寄存器而不是與指令操作碼相關聯。程序在執行向量計算指令之前用它們的數據類型和寬度標記向量寄存器。使用動態寄存器類型會减少向量指令的數量。因為每個向量指令通常有六個整數版本和三個浮點版本,使用動態寄存器類型的向量架構减少了彙編語言程序而員的認知負擔以及編譯器生成代碼的难度。
    
  • 第九章

    RV64:64位地址指令

    RV64和RV32之間基本是超集關系,但是有一個例外是壓縮指令。RV64C取代了一些RV32C指令,因為其他一些指令對於64位地址可以取得更好的代碼壓縮效果。
    
  • 第十章

    RV32/64特權架構

    這個章節介紹了兩種新權限模式:
       運行最可信的代碼的機器模式(machine mode)
    
       為Linux,FreeBSD和Windows等操作系統提供支持的監管者模式(supervisor mode)。
    
       這兩種新模式都比用和模式有著更高的權限
    
    有更多權限的模式通常可以使用權限較低的模式的所用功能,並且它們還有一些低權限模式下不可用的額外功能
    
       例如處理中斷和执行I/O的功能。處理器通常大部分时間都運行在權限最低的模式下,處理中斷和異常时會將控制權移交到更高權限的模式。
    
  • 第十一章

    RISC-V未來可選擴展

    1. "B"標準擴展:位操作
    
    2. "E"標準擴展:嵌入式
    
    3. "H"特權架構態擴展:支持管理程序
    
    4. "J"標準擴展:動態翻譯語言
    
    5. "L"標準擴展:十進制浮點
    
    6. "N"標準擴展:用戶態中斷
    
    7. "P"標準擴展:封装的單指令多數據指令
    
    8. "Q"標準擴展:四精度浮點
    
  • 心得

    閱讀完這本書發現RISC-V雖然還只是一個近年發展的開源指令集架構,但在靈活性上它一個模塊化的架構,不同部分能以模塊化的方式串在一起試圖通過一套統一的架構滿足各種不同的應用。

    和不同系列相互不兼容的ARM相比,RISC-V具有能夠靈活地擴展指令集的優勢,可以新增專用指令,也可以擴充邊緣運算裝置所需的運算資源。

    目前主流市場上,x86獨佔了電腦(除了蘋果)及伺服器的處理器,ARM在手機、嵌入式裝置上也處於領導地位,但RISC-V在十幾年的時間就可以切入新興的領域,未來發展值得期待。

    從高通的S865開始已經開始慢慢地轉向了RISC-V,在 PC、行動裝置、可穿戴裝置、聯網汽車和AR/VR裝置中有採用了RISC-V微控制器。高通已經出貨了超過6.5億個RISC-V內核,悄無聲息的成為「RISC-V 實行的領導者之一」

    代表這個RISC-V充滿的潛力,期望未來功能會變得更加的完善

  • 參考資料

    http://riscvbook.com/chinese/RISC-V-Reader-Chinese-v2p1.pdf

    https://qooah.com/2022/12/19/qualcomm-originally-laid-out-risc-v-in-s865/

    https://www.cmoney.tw/notes/note-detail.aspx?nid=506998

Clone this wiki locally