0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RISC-V指令集是如何設(shè)計的

冬至配餃子 ? 來源:天奇工作室 ? 作者:LRC ? 2022-08-08 14:47 ? 次閱讀

我們來回顧一下上期內(nèi)容:我們定義了兩種指令,第一種是立即數(shù)指令,其指令規(guī)則是:xxxxxxxxxxxx(立即數(shù))xxxxx(源寄存器序號)xxx(運算規(guī)則)xxxxx(目標(biāo)寄存器序號)1(立即數(shù)標(biāo)志位)。第二種指令是寄存器指令,其指令規(guī)則是:0000000xxxxx(源寄存器序號1)xxxxx(源寄存器序號2)xxx(運算規(guī)則)xxxxx(目標(biāo)寄存器序號)0(立即數(shù)標(biāo)志位)。不過呢,這些指令只是我們的一廂情愿,現(xiàn)實中實際的指令集是怎么實現(xiàn)的?

pYYBAGLwsFuAMLa5AACNBC2MMKU335.png

RISC-V指令格式

我們這次來講講RISC-V指令集,看看他們的指令集是如何設(shè)計的。

RISC-V指令集項目在2010年始于伯克利大學(xué),是一個新穎先進的指令集。我們曾在前幾章中多次提到過這個指令集,不過也就是順嘴一題,這次我們具體看看究竟什么是RISC-V指令集。

首先RISC-V指令集由幾部分組成。最主要的部分是最基礎(chǔ)32位的RV32I,這部分是最基礎(chǔ)的指令集,是兼容RISC-V程序的必要部分。其次是16位的RVC,作為壓縮指令,可以極大節(jié)省程序占用內(nèi)存的空間。再者是32位的RV32M,用以支持乘除法指令。此外還有RV32F、RV32A等等。為什么要分成這么多部分呢?因為我們設(shè)計的CPU大多不會對這些指令全部兼容,而是選擇有目的的部分兼容。比如,設(shè)計一個低功耗的單片機CPU,我們就用不到乘除法等指令,我們可以選擇只兼容RV32I,既簡單又高效。當(dāng)然這些指令還有64位版本,用以支持更高位數(shù)的計算。

RISC-V指令集規(guī)定了CPU中有32個寄存器。有疑問嗎?你可能覺得指令集不就是指令的集合嘛,為什么還規(guī)定我們的硬件設(shè)計?不要忘了,32個寄存器意味著寄存器序號一共是5位,而這是由指令集決定的。順便一說X86指令集中僅規(guī)定有8個寄存器。其中,00000即第一個寄存器本質(zhì)并不是寄存器而是硬件連線0,始終代表數(shù)字0。這個設(shè)計是有意義的,可以借此寫出許多騷操作的指令。

我們先講最基礎(chǔ)的RV32I指令集。作為最基礎(chǔ)的指令集,其包括幾種指令類型。分別是數(shù)字運算指令(包括寄存器指令和立即數(shù)指令)、pc跳轉(zhuǎn)指令、分支指令和內(nèi)存讀寫指令。我們上次定義的指令集屬于數(shù)字運算指令,二者類型相同但內(nèi)容并不完全一致?,F(xiàn)在我來說說RV32I中的數(shù)字運算指令,你們可以和上次定義的指令集比比有何不同?這些差別能帶來好處還是壞處?

pYYBAGLwsHOAc4hVAABmp1yVSCk758.png


add指令釋義

首先是運算指令。RV32I一共定義了10種運算,分別是加法、減法、有符號比較、無符號比較、與、或、非、異或、邏輯左移、邏輯右移和算數(shù)右移。而這些運算分為寄存器指令和立即數(shù)指令。立即數(shù)指令中是無需減法指令的,因為我們曾經(jīng)說過,減法可以通過對其中一個加數(shù)取反加一再與另一個加數(shù)求和實現(xiàn),所以立即數(shù)可以直接在立即數(shù)上做文章,不需要減法指令。那我們是否需要十種運算電路來分別對應(yīng)這十種計算指令呢?不用,我們只需要八種。少的那兩種分別是減法和移位。減法完全可以復(fù)用加法電路,左移完全可以復(fù)用右移電路。什么是復(fù)用?為什么要復(fù)用?復(fù)用就是重復(fù)利用原有的電路,減少設(shè)置新的電路。這樣可以節(jié)省芯片面積,節(jié)約生產(chǎn)成本,降低發(fā)熱功耗。那么如何復(fù)用呢?不同的電路有不同的復(fù)用方法,以減法復(fù)用加法為例,使用加法電路前,將其中一個數(shù)取反加一便可成為減法電路。

綜上所述,我們?nèi)孕枰?位數(shù)字表示這八種運算邏輯,它們分別是000到111,這三位數(shù)字被稱為funct3(3位功能數(shù)字)。不過加法和移位運算中需要額外的一位數(shù)字用以區(qū)分加減和左右。這一位數(shù)字在哪呢?我們先講立即數(shù)移位指令,立即數(shù)一般是12位數(shù)字,但在移位運算中用不到這么多位數(shù),一般只有5位。那么在這五位數(shù)之前會有7個空位,第二個空位便是這位數(shù)字所在。立即數(shù)加法指令不需要這一位數(shù)字,原因剛才有指出。寄存器指令中,同樣會存在7位空位,第二位空位是這位數(shù)字所在。

然后我們講一下另一類指令,內(nèi)存讀寫指令。不過我們在此之前需要指出一件事,我們現(xiàn)在有兩種指令類型了,分別是運算指令和內(nèi)存讀寫指令,我們怎么區(qū)分呢?RV32I設(shè)置了另一種功能數(shù)字,funct7(7位功能數(shù)字),為什么會有七位呢?因為指令類型很多,funct7不單起到區(qū)分RV32I指令類型的作用,同時還區(qū)分所有RISC-V的所有指令,甚至還包括16位和64位指令,所以funct7會有7位數(shù)字?;氐絻?nèi)存讀寫指令上來,讀和寫可以被看成兩種類型,需要一位數(shù)字區(qū)分,這位數(shù)字在funct7中。讀和寫都需要地址,否則不知道讀哪或是寫哪。

同時讀指令還需要知道取到的內(nèi)容放到哪,而寫指令需要知道寫什么內(nèi)容。先說地址,地址是由某一寄存器中的數(shù)字加上七位立即數(shù)得到,這樣正好組成之前說的12位數(shù)字。讀指令放到哪呢?放到目標(biāo)寄存器嘛。寫指令的內(nèi)容從哪來呢?來源寄存器嘛。這不就和之前的指令樣式對應(yīng)起來了嗎?所以這兩種指令樣式區(qū)別其實不大。只不過執(zhí)行內(nèi)容有所區(qū)別。

我們現(xiàn)在剛剛簡單講完兩種指令類型,是不是很多人就已經(jīng)迷失自我了?難道所有這些指令規(guī)則只能通過繁瑣的文字來講述嗎?這里就要提到指令集圖卡了。

pYYBAGLwsLCANZaWAAC_XgiafkQ258.png

RV32I指令集圖卡

上圖就是實拍RV32I指令集圖卡,每一行都代表著一條指令,你所要做的便是填入對應(yīng)的寄存器序號和立即數(shù)即可。其中rs1和rs2分別是來源寄存器1和2,rd是目標(biāo)寄存器,imm是立即數(shù)。有的指令可能只需要一個來源寄存器甚至一個都不要,有的指令可能不需要目標(biāo)寄存器,有的指令可能需要12位立即數(shù),有的則可能要20位立即數(shù)。這些在指令集圖卡中都體現(xiàn)出來了??吹接疫呌⑽闹?,我手寫的幾道黑橫線了嗎?夾在里面的指令是我們在前文中所講的指令類型,可以再根據(jù)這張圖對前文進行理解,會容易得多哦。

舉個例子,比如加法指令,看到最右側(cè)有兩個add,分別是I addi和R add,區(qū)別在于一個是立即數(shù)加法,一個是寄存器加法。對應(yīng)到靠右邊的方框中是不是可以看到7位數(shù)字,這就是funct7,中間有3位數(shù)字000,這就是funct3。寄存器指令中的最左側(cè)7位數(shù)字是空著的為0000000,而立即數(shù)指令中最左側(cè)則是12位的立即數(shù)。再看R add下面的R sub,與R add唯一的區(qū)別是不是左邊第二位數(shù)字變成了1?這就是之前所說的復(fù)用所需的那一位數(shù)字?,F(xiàn)在是不是能完全和之前所說的聯(lián)系起來了?也沒那么難對吧?

剩下的下次再來吧?還是你們剩下的都能自己看懂了?可以找公眾號回復(fù)一下,我想看看。


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119201
  • 減法電路
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    7971
  • 指令集
    +關(guān)注

    關(guān)注

    0

    文章

    220

    瀏覽量

    23280
  • RISC-V
    +關(guān)注

    關(guān)注

    44

    文章

    2141

    瀏覽量

    45708
收藏 人收藏

    評論

    相關(guān)推薦

    ISA ARM 對比 RISC-V

    ARM和RISC-V同為精簡指令集RISC)架構(gòu),這意味著它們都基于相似的設(shè)計理念:通過簡化指令集來提高處理器的效率和執(zhí)行速度。然而,即使同為RI
    的頭像 發(fā)表于 09-10 09:26 ?99次閱讀

    RISC-V指令集的特點總結(jié)

    開源 定義:RISC-V 是完全開源的指令集架構(gòu)(ISA),意味著任何人都可以查看、使用、修改以及分發(fā)其設(shè)計,而無需支付版權(quán)費用。 優(yōu)勢:這種開源特性促進了全球性的創(chuàng)新和合作。 社區(qū)化 定義
    發(fā)表于 08-30 22:05

    RISC-V指令集仿真介紹

    我們有時需要一種標(biāo)準(zhǔn)的仿真器,這種仿真器獨立于處理器微架構(gòu),用于模擬處理器在執(zhí)行目標(biāo)應(yīng)用程序時的各種狀態(tài),包括執(zhí)行結(jié)果,程序流以及CSR。如果當(dāng)前設(shè)計的處理器在執(zhí)行指定程序時,這三個指標(biāo)與標(biāo)準(zhǔn)的仿真程序所呈現(xiàn)的結(jié)果不一致,則認(rèn)為處理器設(shè)計存在問題,需要修正。對于RISCV處理器設(shè)計來講,最常見的仿真工具是Spike。本文將著重介紹如何安裝Spike仿真工具。 安裝Spike工具鏈 以下涉及到的安裝步驟都源自兩個工具鏈的README文件(所以README是個好東西),經(jīng)作者實踐后所總結(jié)。 安裝riscv-fesvr 下載riscv-fesvr bash git clone --recursive https://github.com/riscv/riscv-tools.git 設(shè)置RISCV環(huán)境變量 bash RISCV=${HOME}/Software/rv_linux_bare_19-10-17-11-10/bin #riscv工具鏈的路徑 安裝可能會有用的工具 bash yum install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev #注意:這些工具并不要求都安裝成功,視后續(xù)需求。此處為保險措施 創(chuàng)建build文件夾 在riscv-fesvr文件夾下創(chuàng)建新的build文件夾,用于生成編譯 bash mkdir build cd build 配置并生成代碼 bash ../configure --prefix=$RISCV 安裝 bash make install 此時會看到大片的編譯過程,如果沒有報錯,則安裝成功,可以進入下一步,否則就要排錯并重新安裝。riscv-fesvr工具是安裝spike所必需的工具。 安裝Spike 下載riscv-isa-sim bash git clone --recursive https://github.com/riscv/riscv-tools.git 創(chuàng)建build文件夾 在riscv-isa-sim文件夾下創(chuàng)建新的build文件夾,用于生成編譯 bash mkdir build cd build 配置并生成代碼 bash ../configure --prefix=RISCV --with-fesvr=RISCV 安裝 bash make install 設(shè)置環(huán)境變量 將生成的Spike工具添加到環(huán)境變量中
    發(fā)表于 07-31 23:03

    RISC--V架構(gòu)的特點

    RISC--V架構(gòu)的特點 RISC-V架構(gòu)RISC-V 架構(gòu)是基于 精簡指令集計算(RISC)原
    發(fā)表于 05-24 08:01

    RISC-V指令集說明哪里有?

    RISC-V指令集說明哪里有?匯編指令文檔哪有?
    發(fā)表于 04-30 17:44

    有沒有RISC-V指令集文檔分享一下?

    有沒有RISC-V指令集文檔分享一下?了解一下他的匯編指令。
    發(fā)表于 03-30 11:48

    什么是RISC-VRISC-V指令集的優(yōu)勢

    CPU 支持的所有指令指令的字節(jié)級編碼就是這個 CPU 的指令集架構(gòu)(Instruction Set Architecture,ISA),指令集在計算機軟件和硬件之間搭起了一座橋梁。
    發(fā)表于 03-05 10:31 ?590次閱讀
    什么是<b class='flag-5'>RISC-V</b>?<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>的優(yōu)勢

    RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】RISC-V基礎(chǔ)整數(shù)指令集

    第2章 RV32I:RISC-V基礎(chǔ)整數(shù)指令集 本章重點講解構(gòu)成RISC-V基礎(chǔ)整數(shù)指令集的基本指令
    發(fā)表于 01-31 21:10

    RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】RISC-V基礎(chǔ)整數(shù)指令集RV32I

    本書第二至十章都是講RISC-V指令集,最后第十一章講了RISC-V的未來可選擇擴展。本篇梳理學(xué)習(xí)基礎(chǔ)指令集RV32I。 RV32I指令集
    發(fā)表于 01-28 11:41

    RISC-V開放架構(gòu)設(shè)計之道|閱讀體驗】 RISC-V設(shè)計必備之案頭小冊

    中出現(xiàn)的RISC-V拓展。 這本書的開篇講的是,為什么我們需要RISC-V指令集? 從過去的ISA的特點進行引入,先以目前主流的x86指令集架構(gòu)為例列出了增量式
    發(fā)表于 01-22 16:24

    MIPS聘請SiFive前高管,推動RISC-V指令集架構(gòu)IP開發(fā)

    在SIFive任職期間,Brad Burgess不僅拓展了敢達三十多年的半導(dǎo)體行業(yè)經(jīng)驗,還成功開發(fā)了許多適用各類指令集的處理器,如x86、68k、PowerPC、Arm以及如今備受矚目的RISC-V。此次成為MIPS首席架構(gòu)師,Burgess將全權(quán)負(fù)責(zé)MIPS新建重磅產(chǎn)品
    的頭像 發(fā)表于 01-08 11:41 ?392次閱讀

    淺談RISC-V在人工智能的應(yīng)用

    RISC-V內(nèi)核的指令集只有47條指令。x86指令的實際數(shù)量難以計算,可能將近1000個。盡管Arm的指令集很小,但仍然比
    發(fā)表于 01-04 10:46 ?533次閱讀
    淺談<b class='flag-5'>RISC-V</b>在人工智能的應(yīng)用

    新思科技收購Ansys,拓展RISC-V驗證及驗證解決方案

    Imperas擁有的虛擬軟件模擬技術(shù)廣泛拓展至 RISC-V領(lǐng)域,為整個產(chǎn)業(yè)鏈帶來便利。2018年,該公司推出的 riscvOVPsim成為首款免費 RISC-V指令集模擬器,便于工程師們單核
    的頭像 發(fā)表于 12-27 09:57 ?470次閱讀

    瑞薩推出首款基于RISC-V指令集架構(gòu)的處理器內(nèi)核

    嵌入式硬件專家瑞薩電子宣布推出首款基于免費開放的 RISC-V 指令集架構(gòu) (ISA) 的完全自主研發(fā)的處理器內(nèi)核。
    的頭像 發(fā)表于 12-01 17:28 ?1271次閱讀
    瑞薩推出首款基于<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>架構(gòu)的處理器內(nèi)核

    risc-v是什么意思 指令集介紹

    什么是RISC-V 大家聽過最多的處理器架構(gòu)可能就是x86和ARM,x86架構(gòu)主要用在PC端,ARM主要用在移動終端。學(xué)習(xí)嵌入式的小伙伴肯定都知道ARM,但是ARM是國外的,設(shè)計一款A(yù)RM架構(gòu)的芯片
    的頭像 發(fā)表于 10-08 14:42 ?6652次閱讀
    <b class='flag-5'>risc-v</b>是什么意思 <b class='flag-5'>指令集</b>介紹