RV32I
用于寄存器-寄存器操作的 R 类型指令,
用于短立即数和访存 load 操作的 I 型指令,
用于访存 store 操作的 S 型指令,
用于条件跳转操作的 B 类型指令,
用于长立即数的 U 型指令
用于无条件跳转的 J 型指令
RV32I特点
- 指令只有六种格式,并且所有的指令都是 32 位长,这简化了指令解码
- RISC-V 指令提供三个寄存器操作数,当一个操作天然就需要有三个不同的操作数,但是 ISA 只提供了两个操作数时,编译器或者汇编程序程序员就需要多使用一条 move(搬运)指令,来保存目的寄存器的值
- 在 RISC-V 中对于所有指令,要读写的寄存器的标识符总是在同一位置,意味着在解码指令之前,就可以先开始访问寄存器
- 这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位。这意味着可能成为关键路径的立即数符号扩展,可以在指令解码之前进行
RISCV模拟器
二进制翻译—QEMU
模拟实际代码执行过程中的软硬件行为,提供指令级别的仿真—spike
硬件级别的仿真,针对特定的实现做周期级别的模拟—rocket-chip
RISC-V软件栈
RISC-V 指令
非特权指令
| Base | Version | Status | |
| RVWMO | 2.0 | Ratified | RVWMO内存一致性模型 |
| RV32I | 2.1 | Ratified | 32位基础整数指令集 |
| RV64I | 2.1 | Ratified | 64位基础整数指令集 |
| RV32E | 1.9 | Draft | 嵌入式,少16个寄存器 |
| RV128I | 1.7 | Draft | 128位基础整数指令集 |
| Extension | Version | Status | 含义 |
| Zifencei | 2.0 | Ratified | 栅栏指令 |
| Zicsr | 2.0 | Ratified | CSR指令 |
| M | 2.0 | Ratified | 乘除法 |
| A | 2.0 | Frozen | 原子指令 |
| F | 2.2 | Ratified | 单精度浮点 |
| D | 2.2 | Ratified | 双精度浮点 |
| Q | 2.2 | Ratified | 128位浮点 |
| C | 2.0 | Ratified | 压缩指令 |
| Ztso | 0.1 | Frozen | 执行比RVWMO更严格的内存一致性模型 |
| Counters | 2.0 | Draft | |
| L | 0.0 | Draft | 十进制浮点 |
| B | 0.0 | Draft | 位操作 |
| J | 0.0 | Draft | 动态翻译 |
| T | 0.0 | Draft | 事务性内存 |
| P | 0.2 | Draft | 打包simd扩展 |
| V | 0.7 | Draft | 向量扩展 |
| N | 1.1 | Draft | 用户级中断 |
| Zam | 0.1 | Draft | 允许不对齐的AMOs并指定它们的语义 |
大多数整数计算指令对保存在整数寄存器文件中的值的XLEN位进行操作
- R类型指令(寄存器-寄存器操作):ADD | SLT | SLTU | AND | OR | XOR | SLL | SRL | SUB | SRA | NOP
- I类型指令(寄存器直接操作):ADDI | SLTI[U] | ANDI | ORI | XORI | SLLI | SRLI | SRAI | LUI | AUIPC
LW | LH[U] | LB[U]
SYSTEM(CSR,ECALL,EBREAK)
- S类型指令:SW | SH | SB
- U类型指令:
- B类型指令:BEQ | BNE | BLT[U] | BGE[U](±4 KiB)
- J类型指令:JAL(±1 MiB) | JALR
- Zifencei类型指令:FENSE、FENSE.I
- M类型指令:MUL | MULH[[S]U] | MULW | DIV[U] | REM[U] | DIV[U]W | REM[U]W
- A类型指令:LR.W | SC.W,LR.D | SC.D(只在RV64可用),AMOs(AMOSWAP.W/D、AMOADD.W/D、AMOAND.W/D、AMOOR.W/D、AMOXOR.W/D、AMOMAX[U].W/D、AMOMIN[U].W/D)
- Zicsr类型指令:CSRR[W/S/C] | CSRR[W/S/C]
- F类型指令:FLW | FSW(只有当有效地址自然对齐时,FLW和FSW才保证原子执行) | FADD | FSUB | FMUL | FDIV | FSQRT | FMIN-MAX
- C类型指令:CR | CI | CSS(只能使用四个寄存器)CIW | CL | CS | CA | CB | CJ(可以使用32个寄存器)
RVWMO实现
x86
power
arm
Linux
atomic operations
assembly handbook
汇编伪指令
汇编器实现了许多方便的伪指令,这些伪指令由基本 ISA 中的指令形成,但具有隐式参数或在某些情况下具有反向参数,从而导致不同的语义。更多参考:https://mark.theis.site/riscv/asm
riscv-asm.md#pseudoinstructions
特权指令
执行环境接口(EEI)
- Linux应用程序二进制接口(ABI)
- 应用程序执行接口(AEE)
- RISC-V管理程序二进制接口(SBI)
- 管理器执行环境(SEE)
- hypervisor二进制接口(HBI)
- hypervisor执行环境(HEE)
简单的系统 传统的操作系统 虚拟机监视器配置
特权级别
U(用户级别):User/Application
S(管理员级别):Supervisor
M(机器级别):Machine
HS-mode:Hypervisor-extended supervisor mode
VU-mode:Virtual user mode
VS-mode:Virtual supervisor mode
ISA主要分为两类
- Zicsr扩展
- 其他特权指令
hart:独立运行单元(”硬件“线程,类似软件上下文)
CSR field
WPRI:一些完整的读/写字段被保留以备将来使用
WLRL:一些读/写CSR字段仅为可能的位编码子集指定行为,而其他位编码保留
WARL:有些读/写CSR字段仅为位编码的子集定义,但允许写入任何值,同时保证读取时返回合法值
Machine-Level ISA
各种寄存字段介绍
例如:
mstatus
SD WPRI TSR(Trap SRET) TW(Timeout Wait) TVM(Trap Virtual Memory) MXR SUM MPRV
XS[1:0] FS[1:0] MPP[1:0] WPRI SPP MPIE UBE SPIE WPRI MIE(machine中断使能) WPRI SIE(super中断使能) WPRI
mstatush
WPRI MBE SBE WPRI
physical memory attributes(PMA)
physical memory protection(PMP)
标量处理器——Rocket
Rocket采用Chisel(Constructing Hardware in an Scala Embedded Language)编写,这也是加州伯克利基于Scala语言设计的一种开源的硬件描述语言。Chisel充分利用了Scala(将面向对象和函数式编程结合在一种简洁的高级语言)的优势,将面向对象(object orientation)、函数式编程(functional programming)、类型参数化(parameterized types)、类型推断(type inference)等概念引入了硬件描述语言,提升了硬件描述的抽象级别,从而提供了硬件设计人员更加强大的硬件开发能力。
RoCC(Rocket Chip Coprocessor) 是 Rocket-core 的协处理器
超标量乱序执行处理器——BOOM
BOOM(Berkeley Out-of-Order Machine)是UCB设计的一款64位超标量、乱序执行处理器,支持RV64G,也是采用Chisel编写,利用Chisel的优势,只使用了9000行代码,并且复用了Rocket的大量代码。
处理器家族——SHAKTI
SHAKTI[4]是印度理工学院的一个计划,目标是设计一系列适合不同应用环境的、基于RISC-V的开源处理器,以及一些IP核,以便搭建SoC。这些处理器是E-Class、C-Class、I-Class、M-Class、S-Class、H-Class、T-Class、N-Class。
嵌入式应用处理器——ORCA
PicoRV32是由VectorBlox公司设计的一款32位标量处理器,目标是应用于嵌入式领域,采用VHDL编写,实现了RV32IM,也可以移除其中的M扩展,也就是移除乘法除法扩展,从而减少芯片占用资源,甚至可以移除与定时器有关的指令,从而仅仅实现RV32E。当将ORCA作为一个软核下载到FPGA上的时候,其资源占用与主频如表5所示。