RISC-V(1)——RISC-V是什么,有什么用

目录

1. RISC-V是什么

2. RISC-V指令集

3. RISC-V特权架构

4. RiscV的寄存器描述

5. 指令 

5.1 算数运算—add/sub/addi/mul/div/rem

 5.2 逻辑运算—and/andi/or/ori/xor/xori

5.3 位移运算—sll/slli/srl/srli/sra/srai

5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw

5.5 比较指令—slt/slti/sltu/sltiu

5.6 条件分支指令—beq/bne/blt/bge

5.7 无条件跳转指令—j/jal/jalr


1. RISC-V是什么

         RISC发明者是美国加州大学伯克利分校教师David Patterson,RISC-V(拼做risk-five)是第五代精简指令集,也是由David Patterson指导的项目,但许多贡献者是该大学以外的志愿者和行业工作者。

        指令集是一个CPU的基石,要实现CPU 计算和控制功能,就必须定义好一系列与硬件电路相匹配的指令系统。指令就是我们交代CPU 要执行的操作,指令集就可以简单理解为指令的集合。我们把cpu 能够识别的指令汇总在一起就构成了一个指令集。不同的CPU 有不同的指令集,根据他们的繁简程度可以分为两种:复杂指令集CISC 和精简指令集 RISC。

2. RISC-V指令集

        RISC-V就是RISC的第五代指令集架构。而RISC-V目标就是“成为一种完全开放的指令集架构,可被任何学术机构或商业组织自由使用”。       

         RISC-V指令集由“基本指令集 + 扩展指令集”组成。

        基本指令集是必选的,扩展指令集是可选的。意思就是可以根据你的实际需求,选择需要使用的指令。例如在一个项目中,如果不需要用到压缩指令,那么就不需要把压缩指令添加进来,从而做到定制化,这也是RISC-V的一大特点。

        RISC-V指令集有RV32I、RV32E、RV64I、RV64E、RV64I等等,RV代表RISC-V,32/64代表32位或64位,I和E都是基本指令集,在I和E的基础上,可以添加D(双精度浮点扩展)、M(整数乘除法)、A(原子扩展)、C(压缩扩展)等扩展指令。例如,在RV64I基础上,添加原子、整数乘除法、双精度浮点、压缩指令,则该指令集称为RV64IMADC。

基本指令集和扩展指令集描述如下:

名称类别说明
RV32I基础指令整数指令:包含算法、分支、逻辑、访存指令,有32个32位寄存器。能寻址32位地址空间
RV64I基础指令整数指令:包含算法、分支、逻辑、访存指令,有32个64位寄存器。能寻址64位地址空间
RV128I基础指令整数指令:包含算法、分支、逻辑、访存指令,有32个128位寄存器。能寻址128位地址空间
RV32E基础指令与RV32I一样,只不过只使用前16个(0~15)32位寄存器
M扩展指令包含乘法、除法、取模求余指令
F扩展指令单精度浮点指令
D扩展指令双精度浮点指令
Q扩展指令四倍精度浮点指令
A扩展指令原子操作指令:比如比较并交换,读改写等指令
C扩展指令压缩指令:单指令长度为16位,主要用于改善程序大小
P扩展指令单指令多数据(Packed-SIMD)指令
B扩展指令位操作指令
H扩展指令支持(Hypervisor)管理指令
J扩展指令支持动态翻译语言指令
L扩展指令十进制浮点指令
N扩展指令用户中断指令
G通用指令包含I、M、A、F、D 指令

        我们可以选择一个基础指令集,加上若干个扩展指令集进行搭配使用,就可以得到我们想要的指令集架构,进而根据这样的指令架构,设计出贴合我们需求的CPU。其中最核心部分是一个基础指令集,叫做RV32I。RV32I 包含的指令是固定不变的,这为编译器设计人员,操作系统开发人员和汇编语言程序员提供了稳定的基础框架。

3. RISC-V特权架构

        ARM有7种工作模式,而RISC-V也有不同的模式,这些模式在RISC-V中也被称为特权架构。

RISC-V总共有四种模式,分别是U、S、H和M模式: 

模式缩写编码
机器模式M11
HypervisorH10
监管者模式S01
用户模式U00
  • U模式被编码为00
  • S模式编码为01
  • H模式编码为10
  • M模式编码为11

        Level越高,等级越高。等级越高,拥有的访问权限也更高。按照特权等级,有高到低依次为M、H、S、U。

        上图中编码为10的模式是保留的,这个模式实际上就是H模式,H模式是用作虚拟化,但是目前RISC-V对虚拟化还不太完善,基本不支持。因此上图并没有将H模式标出来,而是作为保留。也正是因此,有人经常将RISC-V的模式说成三种U、S和M。

  • U模式:User,用户模式
  • S模式:Supervisor,监管者模式
  • M模式:Machine,机器模式

        以RISC-V Linux为例,Linux应用程序处于U模式,Linux内核/uboot处于S模式,M模式则是OpenSBI。M模式拥有最高访问权限,Linux内核如果要访问CSR寄存器,则必须由S模式切换到M模式,由OpenSBI读取CSR寄存器,然后将数据返回给内核。

        M模式是必须要选择的,RISC-V的裸机代码都运行在M模式下

4. RiscV的寄存器描述

RISC-V定义了32个通用寄存器和一个PC寄存器,32个通用寄存器如下:

寄存器ABI名称说明
x0zero0值寄存器,硬编码为0,写入数据忽略,读取数据为0
x1ra用于返回地址(return address)
x2sp用于栈指针(stack pointer)
x3gp用于通用指针(global pointer)
x4tp用于线程指针
x5t0用于存放临时数据或者备用链接寄存器
x6~x7t1~t2用于存放临时数据寄存器
x8s0/fp需要保存的寄存器或者帧指针寄存器
x9s1需要保存寄存器
x10~x11a0~a1函数参数或者返回值寄存器
x12~x17a2-a7函数传递参数寄存器
x18~x27s2-s11需要保存的寄存器
x28~x31t3~t6用于存放临时数据寄存器

5. 指令 

5.1 算数运算—add/sub/addi/mul/div/rem

add rd,rs1,rs2:将寄存器rs1与rs2的值相加并写入寄存器rd。
sub rd,rs1,rs2:将寄存器rs1与rs2的值相减并写入寄存器rd。
addi rd,rs1,imm:将寄存器rs1的值与立即数imm相加并存入寄存器rd。
mul rd,rs1,rs2:将寄存器rs1与rs2的值相乘并写入寄存器rd。
div rd,rs1,rs2:将寄存器rs1除以寄存器rs2的值,向零舍入并写入寄存器rd。
rem rd,rs1,rs2:将寄存器rs1模寄存器rs2的值并写入寄存器rd。

 5.2 逻辑运算—and/andi/or/ori/xor/xori

and rd,rs1,rs2:将寄存器rs1与rs2的值按位与并写入寄存器rd。
andi rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位与并写入寄存器rd。
or rd,rs1,rs2:将寄存器rs1与rs2的值按位或并写入寄存器rd。
ori rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位或并写入寄存器rd。
xor rd,rs1,rs2:将寄存器rs1与rs2的值按位异或并写入寄存器rd。
xori rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位异或并写入寄存器rd。

5.3 位移运算—sll/slli/srl/srli/sra/srai

//左移会在右边补0,逻辑右移会在最高位添0,算数右移在最高位添加符号位。

sll rd,rs1,rs2:将寄存器rs1的值左移寄存器rs2的值这么多位,并写入寄存器rd。
slli rd,rs1,imm:将寄存器rs1的值左移立即数imm的值这么多位,并写入寄存器rd。
srl rd,rs1,rs2:将寄存器rs1的值逻辑右移寄存器rs2的值这么多位,并写入寄存器rd。
srli rd,rs1,imm:将寄存器rs1的值逻辑右移立即数imm的值这么多位,并写入寄存器rd。
sra rd,rs1,rs2:将寄存器rs1的值算数右移寄存器rs2的值这么多位,并写入寄存器rd。
srai rd,rs1,imm:将寄存器rs1的值算数右移立即数imm的值这么多位,并写入寄存器rd。

5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw

//在RISC-V中1word=4Bytes=32bits。l是load的首字母,即加载数据;s是store的缩写,即存储数据。b,h,w分别是byte,half word,word的首字母,除此之外还有存取双字的d,即double word。

lb rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个字节,符号扩展后存入rd
lh rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读半个字,符号扩展后存入rd
lw rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个字,符号扩展后存入rd
lbu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个无符号的字节,零扩展后存入rd
lhu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读半个无符号的字,零扩展后存入rd
lwu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个无符号的字,零扩展后存入rd
sb rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的8位
sh rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的16位
sw rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的32位

5.5 比较指令—slt/slti/sltu/sltiu

有符号数:
slt rd,rs1,rs2:若rs1的值小于rs1的值,rd置为1,否则置为0
slti rd,rs1,imm:若rs1的值小于立即数imm,rd置为1,否则置为0
无符号数:
sltu rd,rs1,rs2:若rs1的值小于rs1的值,rd置为1,否则置为0
sltiu rd,rs1,imm:若rs1的值小于立即数imm,rd置为1,否则置为0

5.6 条件分支指令—beq/bne/blt/bge

beq rs1,rs2,lable:若rs1的值等于rs2的值,程序跳转到lable处继续执行
bne rs1,rs2,lable:若rs1的值不等于rs2的值,程序跳转到lable处继续执行
blt rs1,rs2,lable:若rs1的值小于rs2的值,程序跳转到lable处继续执行
bge rs1,rs2,lable:若rs1的值大于等于rs2的值,程序跳转到lable处继续执行

5.7 无条件跳转指令—j/jal/jalr

j label:程序直接跳转到lable处继续执行
jal rd,label:用于调用函数,把下一条指令的地址保存在rd中(通常用x1),然后跳转到label处继续执行
jalr rd,offset(rs):可用于函数返回,把下一条指令的地址存到rd中,然后跳转到rs+offset地址处的指令继续执行。若rd=x0就是单纯的跳转(x0不能被修改)

ALU(算术逻辑单元)是计算机处理器中负责执行算术和逻辑操作的核心组件。在设计RISC-V处理器的过程中,ALU的优化是至关重要的一步。 首先,我们可以通过增加多个ALU管道来提高处理器的性能。这样,指令可以在多个ALU之间并行执行,从而加快处理速度。另外,还可以采用超标量技术,将多个ALU分组,并行执行不同的指令,进一步提高处理器效率。 其次,为了提高ALU的性能,我们可以通过增加更多的功能单元来支持多种操作。例如,我们可以添加浮点运算单元,以支持浮点运算指令。此外,还可以添加位移单元和乘法单元等,以执行各种操作。通过提供更多的功能单元,ALU可以在单个周期内执行更多的操作,提高处理器的性能。 另外,在ALU的设计中,还需要考虑到电路延迟的问题。通过优化电路布线和信号传输路径,可以减少ALU操作所需的时间。此外,采用流水线技术也可以提高处理器的吞吐量。通过将ALU操作划分为多个阶段,并行执行多条指令,可以大大提高处理器的效率。 最后,为了优化ALU的设计,还需要考虑功耗的问题。通过采用低功耗电路设计和节能技术,可以有效降低ALU的功耗。此外,在处理器的设计过程中,还可以采用动态电压调整和时钟频率调整等技术,根据实际负载情况动态调整ALU的电压和频率,以达到节能的目的。 综上所述,通过增加ALU管道、添加更多功能单元、优化电路延迟、采用流水线技术和优化功耗等方法,可以对RISC-V处理器中的ALU进行优化,提高处理器的性能和效率。这些优化措施能够使处理器更快、更强大,更适应各种复杂的计算任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值