在談 RISC-V 之前,我們先梳理幾個(gè)概念:
1. 芯片
芯片 是所有半導(dǎo)體元器件的統(tǒng)稱,它是把一定數(shù)量的常用電子元件(如電阻,電容,晶體管等),通過半導(dǎo)體工藝集成在一起,具有特定功能的電路。
2. CPU
cpu 是芯片的一種,它里面包含了控制部件和運(yùn)算部件,即中央處理器。1971 年, Intel 將運(yùn)算器和控制器集成到一個(gè)芯片上,稱為4004 微處理器,這標(biāo)志著CPU 的誕生。
CPU 的工作流程分為以下5個(gè)階段:
取指令
指令譯碼
執(zhí)行指令
訪存讀取數(shù)據(jù)
結(jié)果寫回
指令和數(shù)據(jù)統(tǒng)一存儲(chǔ)在內(nèi)存中,數(shù)據(jù)與指令需要從統(tǒng)一的存儲(chǔ)空間存取,經(jīng)由共同的總線傳輸,無(wú)法并行讀取數(shù)據(jù)和指令。馮諾依曼結(jié)構(gòu)
3. 馮諾依曼結(jié)構(gòu)
馮·諾依曼結(jié)構(gòu)也稱普林斯頓結(jié)構(gòu),是一種將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的存儲(chǔ)器結(jié)構(gòu)。
程序指令存儲(chǔ)地址和數(shù)據(jù)存儲(chǔ)地址指向同一個(gè)存儲(chǔ)器的不同物理位置,因此程序指令和數(shù)據(jù)的寬度相同,如英特爾公司的8086中央處理器的程序指令和數(shù)據(jù)都是16位寬。
數(shù)學(xué)家馮·諾依曼提出了計(jì)算機(jī)制造的三個(gè)基本原則,即采用二進(jìn)制邏輯、程序存儲(chǔ)執(zhí)行以及計(jì)算機(jī)由五個(gè)部分組成:
運(yùn)算器
控制器
存儲(chǔ)器
輸入設(shè)備
輸出設(shè)備
現(xiàn)代計(jì)算機(jī)發(fā)展所遵循的基本結(jié)構(gòu)形式始終是馮·諾依曼機(jī)結(jié)構(gòu)。這種結(jié)構(gòu)特點(diǎn)是“程序存儲(chǔ),共享數(shù)據(jù),順序執(zhí)行”,需要 CPU 從存儲(chǔ)器取出指令和數(shù)據(jù)進(jìn)行相應(yīng)的計(jì)算
(1)單處理機(jī)結(jié)構(gòu),機(jī)器以運(yùn)算器為中心;
(2)采用程序存儲(chǔ)思想;
(3)指令和數(shù)據(jù)一樣可以參與運(yùn)算;
(4) 數(shù)據(jù)以二進(jìn)制表示;
(5)將軟件和硬件完全分離;
(6) 指令由操作碼和操作數(shù)組成;
(7)指令順序執(zhí)行。
這套理論被稱為馮·諾依曼體系結(jié)構(gòu)。
4. 哈佛結(jié)構(gòu)
哈佛結(jié)構(gòu)是一種將程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開的存儲(chǔ)器結(jié)構(gòu),如下圖所示。中央處理器首先到程序指令存儲(chǔ)器中讀取程序指令內(nèi)容,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)存儲(chǔ)器中讀取數(shù)據(jù),并進(jìn)行下一步的操作(通常是執(zhí)行)。
程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開,可以使指令和數(shù)據(jù)有不同的數(shù)據(jù)寬度,如Microchip公司的PIC16芯片的程序指令是14位寬度,而數(shù)據(jù)是8位寬度。
哈佛結(jié)構(gòu)的微處理器通常具有較高的執(zhí)行效率。其程序指令和數(shù)據(jù)指令分開組織和存儲(chǔ)的,執(zhí)行時(shí)可以預(yù)先讀取下一條指令。
哈佛結(jié)構(gòu)是指程序和數(shù)據(jù)空間獨(dú)立的體系結(jié)構(gòu), 目的是為了減輕程序運(yùn)行時(shí)的訪存瓶頸。
哈佛結(jié)構(gòu)能基本上解決取指和取數(shù)的沖突問題。
5. 混合式結(jié)構(gòu)
使用兩個(gè)獨(dú)立的存儲(chǔ)器模塊,分別存儲(chǔ)指令和數(shù)據(jù),每個(gè)存儲(chǔ)模塊都不允許指令和數(shù)據(jù)并存;
具有一條獨(dú)立的地址總線和一條獨(dú)立的數(shù)據(jù)總線,利用公用地址總線訪問兩個(gè)存儲(chǔ)模塊(程序存儲(chǔ)模塊和數(shù)據(jù)存儲(chǔ)模塊),公用數(shù)據(jù)總線則被用來(lái)完成程序存儲(chǔ)模塊或數(shù)據(jù)存儲(chǔ)模塊與CPU之間的數(shù)據(jù)傳輸;
兩條總線由程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分時(shí)共用。
6. CISC
從前面的內(nèi)容中,我們已經(jīng)得知 CPU 就是不斷的執(zhí)行指令,來(lái)實(shí)現(xiàn)程序的執(zhí)行,最后實(shí)現(xiàn)相應(yīng)的功能。但是一顆CPU 能實(shí)現(xiàn)多少條指令,每條指令完成多少功能,卻是值得細(xì)細(xì)考量的問題。
CISC的英文全稱為“Complex InstrucTIon Set Computer”,即“復(fù)雜指令系統(tǒng)計(jì)算機(jī)”,從計(jì)算機(jī)誕生以來(lái),人們一直沿用CISC指令集方式。早期的桌面軟件是按CISC設(shè)計(jì)的,并一直沿續(xù)到現(xiàn)在。目前,桌面計(jì)算機(jī)流行的x86體系結(jié)構(gòu)即使用CISC。
CISC 的優(yōu)勢(shì)在于,用少量的指令就能實(shí)現(xiàn)非常多的功能,程序自身大小也會(huì)下降,減少內(nèi)存空間占用。
缺點(diǎn):這些復(fù)雜指令集,包含的指令數(shù)量多且功能復(fù)雜,設(shè)計(jì)復(fù)雜。
7. RISC
RISC的英文全稱為“Reduced InstrucTIon Set Computer”,即“精簡(jiǎn)指令集計(jì)算機(jī)”,是一種執(zhí)行較少類型計(jì)算機(jī)指令的微處理器,起源于80年代的MIPS主機(jī)(即RISC機(jī)),RISC機(jī)中采用的微處理器統(tǒng)稱RISC處理器。
這樣一來(lái),它能夠以更快的速度執(zhí)行操作(每秒執(zhí)行更多百萬(wàn)條指令,即MIPS)。因?yàn)橛?jì)算機(jī)執(zhí)行每個(gè)指令類型都需要額外的晶體管和電路元件,計(jì)算機(jī)指令集越大就會(huì)使微處理器更復(fù)雜,執(zhí)行操作也會(huì)更慢。
RISC 設(shè)計(jì)方案非常簡(jiǎn)約,通常有20 多條簡(jiǎn)化的指令集。每條指令長(zhǎng)度固定,由專用的加載和儲(chǔ)存指令用于訪問內(nèi)存,減少了內(nèi)存的尋址方式,大多數(shù)運(yùn)算指令只能訪問操作寄存器。
CPU 中配有大量的寄存器,這些指令的選取都是工程中使用頻率最高的指令。由于指令長(zhǎng)度一致,功能單一,操作依賴于寄存器,這些特性使得CPU 指令預(yù)取、分支預(yù)測(cè)、指令流水線等部件的效能大大發(fā)揮,幾乎一個(gè)時(shí)鐘周期能執(zhí)行多條指令
RISC 的代表產(chǎn)品是 ARM 和 RISC-V。現(xiàn)在,兩者已經(jīng)沒有明顯的界限了,開始相互融合了
8. 流水線
談到指令并行,就不得不談到CPU 核心的流水線。現(xiàn)代處理器都是流水線結(jié)構(gòu)。
流水線(Pipeline)技術(shù)是指程序在執(zhí)行時(shí)候多條指令重疊進(jìn)行操作的一種準(zhǔn)并行處理實(shí)現(xiàn)技術(shù)。通俗的講將一個(gè)時(shí)序過程,分解成若干個(gè)子過程,每個(gè)過程都能有效的與其他子過程同時(shí)執(zhí)行。這種思想最初是在RISC的架構(gòu)中出現(xiàn)的,旨在提高處理器處理效率,爭(zhēng)取在一個(gè)時(shí)鐘周期中完成一條指令。
一般常見的5級(jí)流水線有:
取指:指令取指(Instruction Fetch)是指將指令從存儲(chǔ)器中讀取出來(lái)的過程。
譯碼:指令譯碼(Instruction Decode)是指將存儲(chǔ)器中取出的指令進(jìn)行翻譯的過程。經(jīng)過譯碼之后得到指令需要的操作數(shù)寄存器索引,可以使用此索引從通用寄存器組(Register File)中將操作數(shù)讀出。
執(zhí)行:指令譯碼之后所需要進(jìn)行的計(jì)算類型都已得知,并且已經(jīng)從通用寄存器組中讀取出了所需的操作數(shù),那么接下來(lái)便進(jìn)行指令執(zhí)行(Instruction Execute)。指令執(zhí)行是指對(duì)指令進(jìn)行真正運(yùn)算的過程。譬如,如果指令是一條加法運(yùn)算指令,則對(duì)操作數(shù)進(jìn)行加法操作;如果是減法運(yùn)算指令,則進(jìn)行減法操作。在“執(zhí)行”階段的最常見部件為算術(shù)邏輯部件運(yùn)算器(Arithmetic Logical Unit,ALU),作為實(shí)施具體運(yùn)算的硬件功能單元。
訪存:存儲(chǔ)器訪問指令往往是指令集中最重要的指令類型之一,訪存(Memory Access)是指存儲(chǔ)器訪問指令將數(shù)據(jù)從存儲(chǔ)器中讀出,或者寫入存儲(chǔ)器的過程。
寫回:寫回(Write-Back)是指將指令執(zhí)行的結(jié)果寫回通用寄存器組的過程。如果是普通運(yùn)算指令,該結(jié)果值來(lái)自于“執(zhí)行”階段計(jì)算的結(jié)果;如果是存儲(chǔ)器讀指令,該結(jié)果來(lái)自于“訪存”階段從存儲(chǔ)器中讀取出來(lái)的數(shù)據(jù)。
無(wú)流水線:
有流水線:
它增加了四組寄存器,每一個(gè)流水線級(jí)數(shù)內(nèi)部都有各自的組合邏輯數(shù)據(jù)通路,彼此之間沒有復(fù)用資源,因此,其面積開銷是比較大的,但是由于可以讓不同的流水線級(jí)數(shù)同時(shí)做不同的事情,而達(dá)到流水的效果,提高了性能,優(yōu)化了時(shí)序,增加了吞吐率。
9. RISC-V
在了解了 RISC 和 CISC 兩種計(jì)算機(jī)指令設(shè)計(jì)架構(gòu)后。我們來(lái)看看 RISC-V。
RISC-V 的 “V”, 有兩層意思,一方面代表第5代 RISC;另一方面, “V”取Variation 之意代表變化。
9.1 RISC-V 是什么?
RISC-V 是一套開放許可證書、免費(fèi)的、由基金維護(hù)的、一個(gè)整數(shù)運(yùn)算指令集外加多個(gè)擴(kuò)展指令集的CPU 結(jié)構(gòu)規(guī)范(ISA)。
整數(shù)運(yùn)算指令集 + 擴(kuò)展指令集
任何硬件開發(fā)商或者組織都可以免費(fèi)使用這套規(guī)范,構(gòu)建CPU 芯片產(chǎn)品。
9.2 指令集命名方式
以RV 為2前綴,然后是位寬,最后代表是指令集的字母集合:
RV[###][abc......xyz]
符號(hào) | 說(shuō)明 |
---|---|
RV | RISC-V 縮寫 |
[###] | 用于標(biāo)識(shí)處理器位寬,取值[32, 64,128],也就是處理器的寄存器位寬 |
[abc...xyz] | 標(biāo)識(shí)該處理器支持的指令模塊集合 |
比如:RV64IMAC, 表示64 位 RISC-V, 支持整數(shù)指令、乘除法指令、原子指令和壓縮指令。
9.3 指令集模塊
指令集模塊是一款CPU架構(gòu)的主要組成部分,是CPU 和 上層軟件交互的核心,也是cpu主要功能體現(xiàn)。
RISC-V 規(guī)范只定義了CPU 需要包含的基礎(chǔ)整型操作指令:
整型的儲(chǔ)存
加載
加減
邏輯
移位
分支
等。
其他指令為可選指令或者用戶擴(kuò)展指令。比如:
乘
除
取模
單精度浮點(diǎn)
雙精度浮點(diǎn)
壓縮
原子指令
等。
擴(kuò)展指令是芯片工程師根據(jù)需求自定義。
所以 RISC-V 采用的是模塊化的指令集,易于擴(kuò)展、組裝。它適用于不同的應(yīng)用場(chǎng)景,可以降低 CPU 實(shí)現(xiàn)成本。
9.4 RISC-V 寄存器
指令的操作數(shù)來(lái)源于寄存器,精簡(jiǎn)指令架構(gòu)的CPU,都會(huì)提供大量的寄存器。
RISC-V 的規(guī)范定義了32個(gè)通用寄存器以及一個(gè)PC寄存器,這對(duì)于RV32I、RV64I、RV128I 指令集都是一樣的,只是寄存器的位寬不一樣。
如果要實(shí)現(xiàn)支持F/D擴(kuò)展指令集的CPU,則需要額外支持32個(gè)浮點(diǎn)寄存器。而如果實(shí)現(xiàn)只支持RV32E指令集的嵌入式CPU,則可以將32個(gè)通用寄存器縮減為16個(gè)通用寄存器。
寄存器 | ABI 名稱 | 說(shuō)明 |
---|---|---|
x0 | zero | 0值寄存器,硬編碼為0,寫入數(shù)據(jù)忽略,讀取數(shù)據(jù)為0 |
x1 | ra | 用于返回地址(return address) |
x2 | sp | 用于棧指針(stack pointer) |
x3 | gp | 用于通用指針 (global pointer) |
x4 | tp | 用于線程指針 (thread pointer) |
x5 | t0 | 用于存放臨時(shí)數(shù)據(jù)或者備用鏈接寄存器 |
x6~x7 | t1~t2 | 用于存放臨時(shí)數(shù)據(jù)寄存器 |
x8 | s0/fp | 需要保存的寄存器或者幀指針寄存器 |
x9 | s1 | 需要保存的寄存器 |
x10~x11 | a0~a1 | 函數(shù)傳遞參數(shù)寄存器或者函數(shù)返回值寄存器 |
x12~x17 | a2~a7 | 函數(shù)傳遞參數(shù)寄存器 |
x18~x27 | s2-s11 | 需要保存的寄存器 |
x28~x31 | t3~t6 | 用于存放臨時(shí)數(shù)據(jù)寄存器 |
ABI: 應(yīng)用程序二進(jìn)制接口,可以理解為寄存器別名,高級(jí)語(yǔ)言在生成匯編會(huì)用到。
不同的 指令集架構(gòu)都有特權(quán)級(jí)的概念,RSIC-V 也不例外,我們來(lái)看看RISC-V 的特權(quán)級(jí)。
不同的特權(quán)級(jí)能訪問的系統(tǒng)資源不同,高特權(quán)級(jí)的能訪問低特權(quán)級(jí)的資源,反之卻不行。
RISC-V 的規(guī)范文檔定義了四個(gè)特權(quán)級(jí)別(privilege level),特權(quán)等級(jí)由高到低排列,如下表所示。
名稱 | 級(jí)別 | 縮寫 | 編碼 |
---|---|---|---|
用戶,應(yīng)用程序特權(quán)級(jí) | 0 | U | 00 |
管理員特權(quán)級(jí) | 1 | S | 01 |
虛擬機(jī)監(jiān)視特權(quán)級(jí) | 2 | H | 10 |
機(jī)器特權(quán)級(jí) | 3 | M | 11 |
一個(gè)RISC-V 硬件線程(hart),相當(dāng)于一個(gè)CPU 內(nèi)獨(dú)立的可執(zhí)行核心,在任意時(shí)刻,只能運(yùn)行在某一個(gè)特權(quán)級(jí)上,這個(gè)特權(quán)級(jí)由CSR(控制和狀態(tài)寄存器)指定配置。
具體分級(jí)如下:
機(jī)器特權(quán)級(jí)(M):RISC-V 中 hart 可以執(zhí)行的最高權(quán)限模式。在M 模式下運(yùn)行的 hart,對(duì)內(nèi)存、I/O 和一些必要的底層功能(啟動(dòng)和系統(tǒng)配置)有著完全的控制權(quán)。它是唯一一個(gè)所有標(biāo)準(zhǔn)RISC-V CPU 都必須實(shí)現(xiàn)的權(quán)限級(jí)。
虛擬機(jī)監(jiān)視特權(quán)級(jí)(H):為了支持虛擬機(jī)監(jiān)視器而定義的特權(quán)級(jí)。
管理員特權(quán)級(jí)(S):主要用于支持現(xiàn)代操作系統(tǒng),如Linux、FreeBSD和 windows 等
用戶應(yīng)用特權(quán)級(jí)(U):用于運(yùn)行應(yīng)用程序,同樣也適用于嵌入式系統(tǒng)。
特權(quán)級(jí)的存在,是給指令加上了權(quán)力,從而去控制指令編寫應(yīng)用程序。應(yīng)用程序只能干應(yīng)用程序該干的事情,不能越權(quán)操作。操作系統(tǒng)則擁有更高的權(quán)力,能對(duì)系統(tǒng)資源進(jìn)行管理。
10. 總結(jié)
本文梳理了 芯片、CPU、流水線,指令與架構(gòu)等基礎(chǔ)概念,引出了RISC-V 基礎(chǔ)介紹,簡(jiǎn)單介紹了RISC-V 由來(lái)。后續(xù)針對(duì)risc-v 會(huì)根據(jù)自身學(xué)習(xí)情況做相應(yīng)介紹。
審核編輯:劉清
-
控制器
+關(guān)注
關(guān)注
112文章
16332瀏覽量
177813 -
晶體管
+關(guān)注
關(guān)注
77文章
9682瀏覽量
138084 -
運(yùn)算器
+關(guān)注
關(guān)注
1文章
163瀏覽量
16567 -
RISC-V
+關(guān)注
關(guān)注
45文章
2271瀏覽量
46131
原文標(biāo)題:適合新手的RISC-V入門基礎(chǔ)知識(shí)
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論