# 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 設計分析 未完待續...