0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RISC-V指令集是如何设计的

冬至配饺子 来源:天奇工作室 作者:LRC 2022-08-08 14:47 次阅读

我们来回顾一下上期内容:我们定义了两种指令,第一种是立即数指令,其指令规则是:xxxxxxxxxxxx(立即数)xxxxx(源寄存器序号)xxx(运算规则)xxxxx(目标寄存器序号)1(立即数标志位)。第二种指令是寄存器指令,其指令规则是:0000000xxxxx(源寄存器序号1)xxxxx(源寄存器序号2)xxx(运算规则)xxxxx(目标寄存器序号)0(立即数标志位)。不过呢,这些指令只是我们的一厢情愿,现实中实际的指令集是怎么实现的?

pYYBAGLwsFuAMLa5AACNBC2MMKU335.png

RISC-V指令格式

我们这次来讲讲RISC-V指令集,看看他们的指令集是如何设计的。

RISC-V指令集项目在2010年始于伯克利大学,是一个新颖先进的指令集。我们曾在前几章中多次提到过这个指令集,不过也就是顺嘴一题,这次我们具体看看究竟什么是RISC-V指令集。

首先RISC-V指令集由几部分组成。最主要的部分是最基础32位的RV32I,这部分是最基础的指令集,是兼容RISC-V程序的必要部分。其次是16位的RVC,作为压缩指令,可以极大节省程序占用内存的空间。再者是32位的RV32M,用以支持乘除法指令。此外还有RV32F、RV32A等等。为什么要分成这么多部分呢?因为我们设计的CPU大多不会对这些指令全部兼容,而是选择有目的的部分兼容。比如,设计一个低功耗的单片机CPU,我们就用不到乘除法等指令,我们可以选择只兼容RV32I,既简单又高效。当然这些指令还有64位版本,用以支持更高位数的计算。

RISC-V指令集规定了CPU中有32个寄存器。有疑问吗?你可能觉得指令集不就是指令的集合嘛,为什么还规定我们的硬件设计?不要忘了,32个寄存器意味着寄存器序号一共是5位,而这是由指令集决定的。顺便一说X86指令集中仅规定有8个寄存器。其中,00000即第一个寄存器本质并不是寄存器而是硬件连线0,始终代表数字0。这个设计是有意义的,可以借此写出许多骚操作的指令。

我们先讲最基础的RV32I指令集。作为最基础的指令集,其包括几种指令类型。分别是数字运算指令(包括寄存器指令和立即数指令)、pc跳转指令、分支指令和内存读写指令。我们上次定义的指令集属于数字运算指令,二者类型相同但内容并不完全一致。现在我来说说RV32I中的数字运算指令,你们可以和上次定义的指令集比比有何不同?这些差别能带来好处还是坏处?

pYYBAGLwsHOAc4hVAABmp1yVSCk758.png


add指令释义

首先是运算指令。RV32I一共定义了10种运算,分别是加法、减法、有符号比较、无符号比较、与、或、非、异或、逻辑左移、逻辑右移和算数右移。而这些运算分为寄存器指令和立即数指令。立即数指令中是无需减法指令的,因为我们曾经说过,减法可以通过对其中一个加数取反加一再与另一个加数求和实现,所以立即数可以直接在立即数上做文章,不需要减法指令。那我们是否需要十种运算电路来分别对应这十种计算指令呢?不用,我们只需要八种。少的那两种分别是减法和移位。减法完全可以复用加法电路,左移完全可以复用右移电路。什么是复用?为什么要复用?复用就是重复利用原有的电路,减少设置新的电路。这样可以节省芯片面积,节约生产成本,降低发热功耗。那么如何复用呢?不同的电路有不同的复用方法,以减法复用加法为例,使用加法电路前,将其中一个数取反加一便可成为减法电路。

综上所述,我们仍需要3位数字表示这八种运算逻辑,它们分别是000到111,这三位数字被称为funct3(3位功能数字)。不过加法和移位运算中需要额外的一位数字用以区分加减和左右。这一位数字在哪呢?我们先讲立即数移位指令,立即数一般是12位数字,但在移位运算中用不到这么多位数,一般只有5位。那么在这五位数之前会有7个空位,第二个空位便是这位数字所在。立即数加法指令不需要这一位数字,原因刚才有指出。寄存器指令中,同样会存在7位空位,第二位空位是这位数字所在。

然后我们讲一下另一类指令,内存读写指令。不过我们在此之前需要指出一件事,我们现在有两种指令类型了,分别是运算指令和内存读写指令,我们怎么区分呢?RV32I设置了另一种功能数字,funct7(7位功能数字),为什么会有七位呢?因为指令类型很多,funct7不单起到区分RV32I指令类型的作用,同时还区分所有RISC-V的所有指令,甚至还包括16位和64位指令,所以funct7会有7位数字。回到内存读写指令上来,读和写可以被看成两种类型,需要一位数字区分,这位数字在funct7中。读和写都需要地址,否则不知道读哪或是写哪。

同时读指令还需要知道取到的内容放到哪,而写指令需要知道写什么内容。先说地址,地址是由某一寄存器中的数字加上七位立即数得到,这样正好组成之前说的12位数字。读指令放到哪呢?放到目标寄存器嘛。写指令的内容从哪来呢?来源寄存器嘛。这不就和之前的指令样式对应起来了吗?所以这两种指令样式区别其实不大。只不过执行内容有所区别。

我们现在刚刚简单讲完两种指令类型,是不是很多人就已经迷失自我了?难道所有这些指令规则只能通过繁琐的文字来讲述吗?这里就要提到指令集图卡了。

pYYBAGLwsLCANZaWAAC_XgiafkQ258.png

RV32I指令集图卡

上图就是实拍RV32I指令集图卡,每一行都代表着一条指令,你所要做的便是填入对应的寄存器序号和立即数即可。其中rs1和rs2分别是来源寄存器1和2,rd是目标寄存器,imm是立即数。有的指令可能只需要一个来源寄存器甚至一个都不要,有的指令可能不需要目标寄存器,有的指令可能需要12位立即数,有的则可能要20位立即数。这些在指令集图卡中都体现出来了。看到右边英文中,我手写的几道黑横线了吗?夹在里面的指令是我们在前文中所讲的指令类型,可以再根据这张图对前文进行理解,会容易得多哦。

举个例子,比如加法指令,看到最右侧有两个add,分别是I addi和R add,区别在于一个是立即数加法,一个是寄存器加法。对应到靠右边的方框中是不是可以看到7位数字,这就是funct7,中间有3位数字000,这就是funct3。寄存器指令中的最左侧7位数字是空着的为0000000,而立即数指令中最左侧则是12位的立即数。再看R add下面的R sub,与R add唯一的区别是不是左边第二位数字变成了1?这就是之前所说的复用所需的那一位数字。现在是不是能完全和之前所说的联系起来了?也没那么难对吧?

剩下的下次再来吧?还是你们剩下的都能自己看懂了?可以找公众号回复一下,我想看看。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5021

    浏览量

    117631
  • 减法电路
    +关注

    关注

    0

    文章

    11

    浏览量

    7939
  • 指令集
    +关注

    关注

    0

    文章

    205

    浏览量

    23164
  • RISC-V
    +关注

    关注

    41

    文章

    1889

    浏览量

    45030
收藏 人收藏

    评论

    相关推荐

    有没有RISC-V指令集文档分享一下?

    有没有RISC-V指令集文档分享一下?了解一下他的汇编指令
    发表于 03-30 11:48

    RISC-V开放架构设计之道|阅读体验】+ 阅读初体验

    这本书确实不是简单的书,两位作者都曾参与RISC-V的研发设计,而几位译者及审校者则都与中科院计算技术研究所相关,可见这本书的质量肯定不低! 看到书中说,最好是了解过至少一款指令集,否则建议先阅读
    发表于 03-05 20:54

    什么是RISC-VRISC-V指令集的优势

    CPU 支持的所有指令指令的字节级编码就是这个 CPU 的指令集架构(Instruction Set Architecture,ISA),指令集在计算机软件和硬件之间搭起了一座桥梁。
    发表于 03-05 10:31 253次阅读
    什么是<b class='flag-5'>RISC-V</b>?<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>的优势

    RISC-V开放架构设计之道|阅读体验】RISC-V基础整数指令集

    第2章 RV32I:RISC-V基础整数指令集 本章重点讲解构成RISC-V基础整数指令集的基本指令
    发表于 01-31 21:10

    RISC-V开放架构设计之道|阅读体验】RISC-V基础整数指令集RV32I

    本书第二至十章都是讲RISC-V指令集,最后第十一章讲了RISC-V的未来可选择扩展。本篇梳理学习基础指令集RV32I。 RV32I指令集
    发表于 01-28 11:41

    RISC-V开放架构设计之道|阅读体验】 RISC-V设计必备之案头小册

    中出现的RISC-V拓展。 这本书的开篇讲的是,为什么我们需要RISC-V指令集? 从过去的ISA的特点进行引入,先以目前主流的x86指令集架构为例列出了增量式
    发表于 01-22 16:24

    RISC-V开放架构设计之道|阅读体验】先睹为快-学习RISC-V的案头好书

    蒙娜丽莎让人想到的就是优雅,这也契合RISC-V的设计哲学。本书从电子发烧友申请到,扉页有电子发烧友的签名。 前面附录了RISC-V指令集参考卡,这个比较有用,有时看下汇编代码可以参考。参考卡
    发表于 01-20 22:37

    瑞萨推出首款基于RISC-V指令集架构的处理器内核

    嵌入式硬件专家瑞萨电子宣布推出首款基于免费开放的 RISC-V 指令集架构 (ISA) 的完全自主研发的处理器内核。
    的头像 发表于 12-01 17:28 871次阅读
    瑞萨推出首款基于<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>架构的处理器内核

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

    什么是RISC-V 大家听过最多的处理器架构可能就是x86和ARM,x86架构主要用在PC端,ARM主要用在移动终端。学习嵌入式的小伙伴肯定都知道ARM,但是ARM是国外的,设计一款ARM架构的芯片
    的头像 发表于 10-08 14:42 5922次阅读
    <b class='flag-5'>risc-v</b>是什么意思 <b class='flag-5'>指令集</b>介绍

    ESP32-C6技术参考手册

    ESP-RISC-V CPU 是基于 RISC-V 指令集架构 (ISA) 的 32 位内核,包括基本整数 (I)、乘法/除法 (M)、原子 (A) 和压缩 (C) 标准扩展。ESP-RISC
    发表于 09-18 07:19

    RISC-V强势崛起为芯片架构第三极

    RISC-V产业链不断取得新突破。作为×86、ARM之外的芯片架构第三极,RISC-V正在全球尤其是在中国强势崛起。 RISC-V是一个开发、免费的指令集架构,是由加州大学伯克利分校
    发表于 08-30 13:53

    RISC-V新进展!deepin 成功适配VisionFive 2

    RISC-V指令集是基于精简指令集计算(RISC)原理建立的开放指令集架构(ISA),RISC-V
    发表于 07-10 09:23

    RISC-V新进展!deepin 成功适配VisionFive 2

    RISC-V指令集是基于精简指令集计算(RISC)原理建立的开放指令集架构(ISA),RISC-V
    的头像 发表于 06-30 10:00 342次阅读
    <b class='flag-5'>RISC-V</b>新进展!deepin 成功适配VisionFive 2

    计算机组成与设计:硬件/软件接口 risc-v版 Computer Organization and Design The Hardware/Software Interface: RISC-V Edition

    组成原理的学生阅读的入门教材。 RISC-V版,围绕RISC-V指令集架构,主要讲授计算机系统的硬件组成及主要功能子系统的原理和逻辑设计,有助于提高对计算机的精确理解与系统认识,为计算机体系结构硬件设计和系统软件设计打下基础。
    发表于 06-15 18:15

    【五一快乐】每日打卡开发板已经收到

    勤劳的电工们,大家五一快乐! 4月份的每日打卡开发板已经收到,WCH的307-R1,基于RISC-V指令集的CH32V307VCT6 MCU。
    发表于 05-01 12:25