|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 robin.zhu 于 2020-3-23 00:10 编辑
欢迎指正
RISC-V基本32位整数指令集(RV32I)概述
RISC-V的指令集采用模块化划分,本文只讨论RISC-V基本32位整数指令集(RV32I), 文档参考riscv.org的指令集标准文档。
基本处理器有32位通用寄存器x0~x31和PC寄存器。x0是常数0只读寄存器(用于简化译码器和ALU格式),x1往往作为函数返回地址寄存器,x2往往作为栈指针.
1 RV32I概要(47条)
RISC-V指令集已经基本固定,其中32位整数指令集是最基本也是必须实现的核心指令集。
一共有47条。大致分类如下,具体指令格式以及参数说明在后续章节详解。
1.1 用于系统相关指令10条,包括:
1.1.1 FENCE类指令,目标是在没有MMU的情况下,多线程运行的环境下,运行中内存模式一致性。包括FENCE, FENCE.I共2条指令
1.1.2 ECALL,EBREAK,系统调用指令。目的是实现操作系统必须的系统调用支持。包含ECALL,EBREAK共2条指令
1.1.3 CSR(控制和状态寄存器)类指令,目标是对系统状态的维护和调用。包含CSRRW,CSRRS,CSRRC,CSRRWI,CSRRSI,CSRRCI共6条指令
1.2 用户程序指令37条,包括:
1.2.0 立即数指令,目的是辅助对寄存器完成立即数装载,包含LUI,AUIPC共2条指令
1.2.1 跳转类指令,目的是完成程序的分支,包括无条件跳转和有条件跳转。包含JAL,JALR,BEQ,BNE,BLT,BGE,BLTU,BGEU共8条指令
1.2.1 LOAD类指令,目标是从内存和MAPPING IO组成的存储器装载数据到寄存器。包含LB,LBU,LH,LHU,LW共5条指令
1.2.2 STORE类指令,目标是从寄存器存储数据到内存和MAPPING IP组成的存储器。包含SB,SH,SW共3条指令
1.2.3 核心ALU类指令,目标是在寄存器内加上可能存在的立即数参数进行比较、算数运算、逻辑运算、移位操作。共19条。可进一步细分为:
比较操作:SLT,SLTI,SLTU,SLTIU
逻辑运算:AND,ANDI,OR,ORI,XOR,XORI
移位操作:SRA,SRAI,SRL,SRLI,SLL,SLLI
算数操作:ADD,ADDI,SUB
2.RV32I指令格式
2.1 RV32I,47条指令均为为32位定长指令。
为了RISC-V CORE内部译码实现的方便,所有的RV32I指令都可以看成对齐的6段结构组成:
IZ[31:25]|RSI2[24:20]|RSI1[19:15]|FUNCT3[14:12]|RDI[11:7]|OPCODE[6:0]
对于RV32I,OPCODE最低2位是1。如果不是,则是其他子集的指令或者非法指令,比如00,01,10都属于16位压缩指令。
对于OPCODE[6:2]有定义的值是:
00000:LOAD类
00011:FENCE类
00100:ALU类含立即数参数操作
00101:AUIPC
01000:STORE类;
01100:ALU类3寄存器参数操作(即ALU指令中助记符不以I结尾的指令)
01101:LUI
11011:跳转类
11100:ECALL,EBREAK,CSR类
2.2 从格式上,RV32I的47条共分为R,I,S,U四类,部分指令的部分参数需要多段组合形成。
R(3寄存器ALU操作,立即数移位操作也属于特殊类型I指令)
I(ALU类含立即数参数操作,但不包含立即数移位操作,JALR)
S(条件跳转操作,STORE操作)
U(LUI,AUIPC,JAL)
具体格式如下:
31 25 | 24 20 | 19 15 | 14 12 | 11 7 | 6 0
funct7 | rs2 | rs1 | funct3 | rd | opcode R-type
imm[11:0] | rs1 | funct3 | rd | opcode I-type
imm[11:5] |rs2 | rs1 | funct3 | imm[4:0] | opcode S-type
imm[31:12] | rd | opcode U-type
2.3 立即数操作
立即数的高20位是通过LUI加载的,如果立即数对应地址空间,那么地址可以看成段页式。具体作用就是页内只有12位地址空间(4K字节)段有1M个空间,和在一切就是32位的4G空间。
AUIPC则是PC现有值加上12位立即数存入RD寄存器。如果立即数为0,则直接取PC寄存器当前值。
3.RV32I指令列表说明(待续)
|
|