计算机系统基础(五)之RISC-V指令集_第1页
计算机系统基础(五)之RISC-V指令集_第2页
计算机系统基础(五)之RISC-V指令集_第3页
计算机系统基础(五)之RISC-V指令集_第4页
计算机系统基础(五)之RISC-V指令集_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机系统基础(五)之RISC-V指令集RISC-V指令集本⽂主要介绍RISC-V指令集,简单总结⼀些重点信息,其中参考了《RISC-V⼿册》和《计算机组成与设计硬件与软件接⼝RISCV版》,如果学习过程中有问题,欢迎指正。提⽰:写完⽂章后,⽬录可以⾃动⽣成,如何⽣成可参考右边的帮助⽂档⽂章⽬录前⾔提⽰:以下是本篇⽂章正⽂内容,下⾯案例可供参考⼀、RISC-V诞⽣的意义RISC-V要成为⼀个指令集,他必须要符合⼀下这些特征。1.要能适应包括从最袖珍的嵌⼊式控制器,到最快的⾼性能计算机等各种规模的处理器2.应该能兼容各种流⾏的软件栈和编程语⾔3.应该适应所有实现技术,包括现场可编程门阵列(FPGA)、专⽤集成电路(ASIC)、全定制芯⽚,甚⾄未来的设备技术。4.应该对所有微体系结构样式都有效5.应该⽀持⼴泛的专业化,成为定制加速器的基础6.应该是稳定的,基础的指令集架构不应该改变RISC-V相对于以前传统的指令集,它的优点在于:⼀个最近诞⽣的指令集架构是⼀个开源的指令集架构模块化社区化稳定清晰的分层设计⼆、RISC-VISA命名规范RISC-V的命名规范:RV[###][abc……xyz]。例如:RV32IMA,RV64GCRV:⽤于标识RISC-V体系架构的前缀,即RISC-V的缩写。[###]:{32,64,128}⽤于标识处理器的字宽,也就是处理器的寄存器的宽度(单位为bit)。[abc…xyz]:标识该处理器⽀持的指令集模块集合。三、模块化RISC-V的模块化是以⼀个名为RV32I的基础ISA作为核⼼模块,RV32I是固定的,永远不会改变,但根据应⽤程序的需要可以选择扩展模块。扩展模块指令集:RISC-V允许在实现中以可选的形式实现其他标准化和⾮标准化的指令集扩展。特定组合“IMAFD”被称为“通⽤(General)”组合,⽤英⽂字母G表⽰。这种模块化特性使得RISC-V具有了袖珍化、低能耗的特点,⽽这对于嵌⼊式应⽤可能⾄关重要。惯例是把代表扩展的字母附加到指令集名称之后作为指⽰。例如,RV32IMFD将乘法(RV32M),单精度浮点(RV32F)和双精度浮点(RV32D)的扩展添加到了基础指令集(RV32I)中。⽤⼀个公式简单表达,即:RISCISA=1个基本整数指令集+多个可选的扩展指令集3.1RISC-V的基础指令模块RISC-V有六种基本指令格式:R类型指令,⽤于寄存器-寄存器操作I型指令,⽤于短⽴即数和访存load操作S型指令,⽤于访存store操作B类型指令,⽤于条件跳转操作U型指令,⽤于长⽴即数J型指令,⽤于⽆条件跳转以RV32为例如下图所⽰:3.1.1R类型指令R类型指令将32位划分成6个区域:opcode是操作码,占了7bit,在指令格式的0-6bit位上rd(DestinationRegister)是⽬的寄存器,占了5bit,在指令格式的7-11bit位上funct3+funct7是两个操作字段。funct3占了3bit,在指令格式的12-14bit位上;funct7占了7bit,在指令格式的25-31bit位上。rs1(SourceRegister#1)是第⼀个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。rs2(SourceRegister#2)是第⼆个源操作数寄存器,占了5bit,在指令格式的25-31bit位上。R类型的全部指令例⼦:addx18,x19,x103.1.2I类型指令I类型指令将32位划分成5个区域:opcode是操作码,占了7bit,在指令格式的0-6bit位上rd(DestinationRegister)是⽬的寄存器,占了5bit,在指令格式的7-11bit位上funct3是操作字段。funct3占了3bit,在指令格式的12-14bit位上。rs1(SourceRegister#1)是第⼀个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。存放12位的⽴即数——imm[11:0],在指令格式的20-31bit位上。I类型指令可以⽤于:寄存器-⽴即数的运算加载指令格式上只有⼀个字段不同于r格式,rs2和funct7替换为12位符号⽴即数(immediate字)imm[11:0]。immediate字段为补码值,所以它可以表⽰从-2"到2"-1之间的整数。当I型格式⽤于加载指令时,immediate字段表⽰⼀个字节偏移量,所以加载双字指令可以取相对于基址寄存器rd中基地址偏移±(2"或2048)字节(±(2或256)个双字)的任何双字。指令格式展⽰:寄存器-⽴即数的运算加载指令同样格式的I类型指令也可以⽤作加载指令I类型的指令算术展⽰:注:其中画圈表⽰位移⽅向0表⽰向左移,1表⽰向右移SLLI:是逻辑左移,低位补零SRLI:是逻辑右移,⾼位补零SRAI:是算术右移,⾼位补原来⾼位。注:RV32I⽀持加载有符号和⽆符号字节和半字(lb,lbu,lh,lhu)举例:addix15,x1,-50加载:lwx14,8(x2)3.1.3S类型指令S类型指令将32位划分成6个区域:opcode是操作码,占了7bit,在指令格式的0-6bit位上imm[4:0]+imm[11:5]:⽴即数分成两个:存放前5位的⽴即数——imm[4:0],在指令格式的7-11bit位上;存放后7位⽴即数——imm[11:5],在指令格式的25-31bit位上。funct3是操作字段。funct3占了3bit,在指令格式的12-14bit位上。rs1(SourceRegister#1)是第⼀个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。rs2(SourceRegister#2)是第⼆个源操作数寄存器,占了5bit,在指令格式的25-31bit位上。S型格式的12位immediate字段分成了两个字段,低5位和⾼7位。RISC-V体系结构设计师选择这种设计是因为它能够在所有指令格式中保持rs1和rs2字段在相同的位置。保持尽可能相似的指令格式降低了硬件的复杂性。同样,opcode和funct3字段也总是保持同样的⼤⼩并在同⼀个位置。指令格式展⽰:S类型的指令算术展⽰:注:sb=Storebyte,sh=Storehalfword,sw=Storeword举例swx14,8(x2)#先将x2寄存器偏移8bit,再存到x14寄存器。3.1.4B类型指令B类型指令将32位划分成6个区域:opcode是操作码,占了7bit,在指令格式的0-6bit位上imm[4:1]+imm[11]+imm[10:5]+imm[12]:⽴即数分成四个:存放第11位的⽴即数——imm[11],在指令格式的第7bit位上;存放第1位到第5位的⽴即数——imm[4:1],在指令格式的8-11bit位上;存放后6位的⽴即数——imm[11:5],在指令格式的25-30bit位上;存放第12位的⽴即数——imm[12],在指令格式的31bit位上。注:imm[0]被丢弃,因为它始终为零。funct3是操作字段。funct3占了3bit,在指令格式的12-14bit位上。rs1(SourceRegister#1)是第⼀个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。rs2(SourceRegister#2)是第⼆个源操作数寄存器,占了5bit,在指令格式的25-31bit位上。B类型指令属于有条件的分⽀。RV32I可以⽐较两个寄存器并根据⽐较结果上进⾏分⽀跳转。⽐较可以是:相等(beq),不相等(bne),⼤于等于(bge),或⼩于(blt)。最后两种⽐较有符号⽐较,RV32I也提供相应的⽆符号版本⽐较的:bgeu和bltu。剩下的两个⽐较关系(⼤于和⼩于等于)可以通过简单地交换两个操作数,即可完成⽐较。因为x<y表⽰y>x且x≥y表⽰y≤x。RISC-V汇编语⾔包含两个决策类指令,类似于带goto的if语句。第⼀条指令是:beqrs1,rs2,Ll该指令表⽰如果寄存器rs1中的值等于寄存器rs2中的值,则转到标签为L1的语句执⾏。助记符beq代表相等则分⽀。第⼆条指令是:bners1,rs2,Ll该指令表⽰如果寄存器rs1中的值不等于寄存器rs2中的值,则转到标签为L1的语句执⾏。助记符bne代表不等则分⽀。这两条指令通常称作条件分⽀指令。注:PC相对寻址在后续补充举例beqx19,x10,offset=16bytes3.1.5U类型指令U类型指令将32位划分成3个区域:opcode是操作码,占了7bit,在指令格式的0-6bit位上rd(DestinationRegister)是⽬的寄存器,占了5bit,在指令格式的7-11bit位上imm[31:12]:存放⾼20位的⽴即数——imm[31:12],在指令格式的12-31bit位上U类型指令包含两种指令LUI–加载⾼位⽴即数AUIPC–⽴即数地址添加到PC寄存器中之前的类型指令中,已经有了12位的⽴即数作为表⽰常量。虽然常量通常很短并且适合12位,但有时它们也会更⼤。RISC-V指令系统包括指令loadupperimmediate(取⽴即数⾼位,lui),⽤于将⾼20位常数加载到寄存器的第31位到第12位。将寄存器的低12位⽤0填充。该指令会与ADDI指令⼀起使⽤,⽬的是将低12位写⼊⽬标寄存器,以实现对32位的寄存器数值设置。LUIx100x87654#x10=0x87654000ADDIx10,x10,0x321#x10=0x87654321注:由于ADDI的12位⽴即数最⾼位是符号位。例如:如何利⽤LUI加载0xDEADBEEFLUIx10,0xDEADB#x10=0xDEADB000ADDIx10,x10,0xEEF#x10=0xDEADAEEF由上可知0xDEADAEEF不等于0xDEADBEEF所以当ADDI的12位⽴即数为负,也就是最⾼位bit位为1时,得到⽽结果是⾼20为减1再和低12位拼接起来。(减1是和补码有关)解决⽅法:当数值的低12位的符号为1时,将利⽤lui装⼊的⾼20为的⽴即数值预先加1,⽽ADDI写⼊的低12位不变。如下LUIx10,0xDEADB#x10=0xDEADB000ADDIx10,x10,0xEEF#x10=0xDEADAEEF在汇编语⾔中还可以使⽤li伪指令,直接装⼊32位的数值,但时它在编译时还是会编译成LUI和ADDI这两条指令。lix10,0xDEADBEEFAUIPC指令加载⼀个20bit的的⽴即数,取值范围为0-1048575,但是该指令rd中保存的数据是(pc)+(⽴即数<<12)。⽤于PC相对寻址。Label:AUIPCx10,0#Putsaddressoflabelinx103.1.6J类型指令J类型指令将32位划分成3个区域:opcode是操作码,占了7bit,在指令格式的0-6bit位上rd(DestinationRegister)是⽬的寄存器,占了5bit,在指令格式的7-11bit位上imm[19:12]+imm[11]+imm[10:1]+imm[20]:存放第1位到第10位的⽴即数——imm[10:1],在指令格式的21-30bit位上;存放11位的⽴即数——imm[11],在指令格式的20bit位上;存放第12位到第19位的⽴即数——imm[19:12],在指令格式的12-19bit位上;存放第20位的⽴即数——imm[20],在指令格式的31bit位上;跳转并链接指令(jal)具有双重功能。若将下⼀条指令PC+4的地址保存到⽬标寄存器中,通常是返回地址寄存器ra(见下图寄存器),便可以⽤它来实现过程调⽤。像分⽀⼀样,jal将其20位分⽀地址乘以2,进⾏符号扩展后再添加到PC上,便得到了跳转地址。注:如果使⽤零寄存器(x0)替换ra作为⽬标寄存器,则可以实现⽆条件跳转,因为x0不能更改。跳转和链接指令的寄存器版本(jalr)同样是多⽤途的。它可以调⽤地址是动态计算出来的函数,或者也可以实现调⽤返回(只需ra作为源寄存器,零寄存器(x0)作为⽬的寄存器)。Switch和case语句的地址跳转,也可以使⽤jalr指令,⽬的寄存器设为x0。3.2RV32I寄存器RV32I有32个通⽤寄存器,以及⼀个PC寄存器。其中有⼀个通过硬件设置的值恒为0的x0寄存器,3.3RISC-V的寻址⽅式RISC-V分⽀指令寻址,在之前的B类型指令就是其中之⼀。这种格式可以表⽰从-4096到4094的分⽀地址,以2的倍数表⽰。B型格式包括⼀个7位操作码、⼀个3位功能码、两个5位的寄存器操作数(rs1和rs2)和⼀个12位地址⽴即数。该地址使⽤特殊的编码⽅式,简化了数据通路设计,但使组装变得复杂。下⾯这条指令bnex10,x11,2000//ifx10!=xll,gotolocation2000=011111010000其中条件分⽀的操作码是110

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论