# RISC – V 學習筆記
作者 : Jerry Lin
Reference : https://riscv.org/specifications/ :100:
## Outline
* CPU開發歷程
* RISC-V設計架構
* 蜂鳥 E200 設計分析
* FPGA實作
## CPU開發歷程
* **CPU指令集架構**
* CISC(Complex Instruction Set Computer)
* 包含常用的指令集與不常用的特殊指令集,隨著CPU更新開發,特殊指令集會越積越多,導致真正常用的指令集,只佔所有指令集的一小部分
* 代表 : Intel & AMD 所開發的x86 CPU,也是目前PC上主流的CPU
* RISC (Reduced Instruction Set Computer)
* 僅具有常用指令集,不常用的特殊指令集,則由多條常用指令集組合執行,達成相同任務
* 代表 : IBM PowerPC、ARM
* **CPU位元架構**
* 8、16、32、64位元
* 通用暫存器(general-purpose registers)的長度
* 可以決定尋找暫存器地址的範圍與運算能力
* 32位元的CPU架構,代表通用暫存器的寬度為32位元,尋找暫存器地址的範圍為232,4GB,運算指令最長為32位元
* 運算指令越短越好,不一定要等於通用暫存器的長度
* 現有主流的CPU所使用的位元架構
* 8、16位元 : 8051、Arduino UNO 所使用的 Atmel 單晶片處理器
* 32位元 : 嵌入式微處理器,如 ARM Cortex M系列
* 64位元 : 目前主流的PC CPU與智慧型手機
* **CPU應用領域**
| 應用領域 | 需求 | 主流架構 |
|:------------------:|:--------------------------:|:-----------------------:|
| 伺服器 | 高運算量、複雜多工 | Intel 、AMD x86架構 CPU |
| 個人電腦 | 中高運算量、普通多工 | Intel 、AMD x86架構 CPU |
| 智慧型裝置(嵌入式) | 中低運算量、娛樂用途 | ARM Cortex A |
| 嵌入式系統 | 低功耗、低成本、IoT Device | ARM Cortex M |
* **嵌入式系統的主流處理器 – Arm**
* arm,位於英國的半導體設計與軟體公司,目前已被軟銀(SoftBank)收購
* 營業項目 : 嵌入式系統處理器、S.O.C IP、GPU…等
* 處理器系列
* Cortex – A
* 幾乎壟斷所有的智慧型裝置處理器市場
* 常見於智慧型手機、平板的處理器中,廠商包含蘋果、三星、高通、LG…
* 由2005年,Cortex A8,以armv7 – A架構開始發展,到目前Cortex A77,arm8.2A架構
* Cortex – M
* 32位元的RISC架構處理器,專門應用於低功耗的微控制器領域,實現於物聯網裝置上
* 以Cortex M0為代表,各家廠商以arm處理器核IP為基礎,各自開發成不同應用的MCU
* 廠商包含Freescale、NXP、ST…等
* **如何開始設計一個CPU**
* x86架構?
* Intel 與 AMD公司,產品以CPU晶片為主,不可能釋出x86架構供其他人使用
* x86的授權費用,也非普通公司能夠負擔
* arm架構?
* 架構授權、處理器核IP授權、ARM處理器
* 都需要付給ARM一筆相當大的授權費用
**綜上所述,目前主流的CPU架構,皆需要一大筆的授權費用,難以取得**
**一般人如何設計一個CPU???**
* RISC – V
* 由美國加州大學柏克萊分校,Krste Asanovic等教授所開發的新指令集架構
* 完全開放的指令集,由RISC-V基金會所託管、維護,任何組織可自由使用
* 簡單但強大的標準指令集,可以輕鬆用硬體實現,且非常穩定
* 開源的網站,提供完整的開發支援,包含架構文件、編譯器、軟體開發工具
**非常適合普通人利用RISC-V,自行實現一個CPU,並加以應用**
## RISC – V設計架構
| 基本指令集 | 指令數量 | 簡述 |
| ---------- | -------- | ---- |
| RV32I | 47 | 32位元架構,32位地址寬度與整數指令集 |
| RV32E | 47 | 支援16位元架構 |
| RV64I | 59 | 64位元架構,可支援一部份32位整數指令集 |
| RV128I | 71 |128位地址寬度與整數指令集,可支援部分64、32位元指令 |
| 擴展指令集 | 指令數量 | 簡述 |
| M | 8 | 整數乘法與除法運算指令 |
| A | 11 | Atomic操作指令與Load-Reserved/Store-Conditional指令 |
| F | 26 | 32-bit float |
| D | 26 | 64-bit double |
| C | 46 | 壓縮指令,16位指令長度 |
* 模組化的指令集,可以依照使用情形,組裝搭配使用
* Ex.低功耗使用場景 = RV32IC / 高運算應用場景 = RV32IMFDC
* 通用場景 RV32G = RV32IMAFD 與 RV64G = RV64IMAFD
* 嵌入式應用場景 RV32EC
* 格式化的指令編碼
* 指令所需的通用暫存器index至於相同固定位置
* 專用的Memory讀寫指令
* Address對齊,增加讀寫性能
* 僅支援 Little-Endian
* 不支援 Address增減
* 採用 Relaxed Memory Model,對於訪問Address的排序沒有要求
* 高效率跳轉指令
* 無條件跳轉指令 jal (Jump and Link) & jalr (Jump and Link-Register)
* 六個有條件的跳轉指令
* 與普通運算指令相同,使用兩個整數操作數,比較完成且條件滿足後即進行跳轉
(相比其他RISC,需要先使用比較指令,將比較結果存於狀態暫存器,再使用跳轉指令)
* 靜態分支跳轉預測機制
* 往後跳轉的條件跳轉指令,預測為跳 / 往前跳轉的條件跳轉指令,預測為不跳
* 取消Store Multiple & Load Multiple
* 用公用程式庫裡的保存狀態與恢復狀態指令碼來完成
* 可以減少Store Multiple & Load Multiple的電路複雜度與面積
* 無條件碼執行
* 需要判斷執行的指令,都使用”有條件的跳轉指令”
* 其他的一律直接執行
* 取消Delay Slot
* 因為已經採取”靜態分支跳轉預測機制”,取消後可減低硬體複雜度
* Privileged Mode
* Machine Mode = Simple embedded systems
* Supervisor + Machine + User Mode = Running Unix-like operating Systems
* Machine + User Mode = Secure embedded systems
* 運算指令不產生異常
* 與一般架構不同,RISC-V不產生運算錯誤指令
* 但會將Overflow、Underflow…等所產生的錯誤,以特定的默認值,儲存於特定的狀態的暫存器,再透過其他軟體的方法來解決
* 可以再次簡化指令集
* 普通32位元指令可以對應16位元的壓縮指令
* “格式化的指令編碼”容易於CPU的設計,但同時會造成Code Size過於龐大
* 對於較小的嵌入式應用場景,可以透過16位元的壓縮指令來執行相同的功能
---
**個人總結,RISC – V適用於 IoT Device MCU**
* 電路複雜度降低,可以拉高CPU主頻,提升運算量
* 在低功耗、低面積的應用領域,也因為電路複雜度減低,具有優勢
* 模塊化的方式,可以透過組裝,客製化成專用於某項應用的處理器
* 例如 : IoT前端感測裝置的MCU、簡單的DSP、邊緣運算節點
**個人想法**
* RISC – V非常適合IoT裝置的應用,因為目前大多數的使用場景,IoT MCU並不需要複雜的計算,常當作通訊(BLE、WIFI、Zigbee)的資料節點,或是簡單的控制。這類的裝置通常需要較低的功耗,來延長使用的時間;需要較小的面積,便於PCB製作,以符合穿戴或感測的需求。
---
## 蜂鳥 E200
* 預計採用這個開源的RISC – V,作為入門參考的對象
* 學習一個簡單的RISC – V架構
* 學習設計者的思路
* 學習一些實現的細節
* 學習之後,試著用這個範例,改造成適合自己應用的RISC – V
* 預計使用FPGA實現
* 然後再學習要怎麼把這個CPU導入自己的應用
* **目標應用是一個AIoT前端感測器,配合自己做的感測電路,開發成一片完整的PCB模組,並拉到雲端Server測試整個系統**
## 蜂鳥 E200 設計分析
未完待續...