BLOG

Record, summarize, and improve.

RISC-V ISA

RV32I

用于寄存器-寄存器操作的 R 类型指令,

用于短立即数和访存 load 操作的 I 型指令,

用于访存 store 操作的 S 型指令,

用于条件跳转操作的 B 类型指令,

用于长立即数的 U 型指令

用于无条件跳转的 J 型指令

RV32I特点

  1. 指令只有六种格式,并且所有的指令都是 32 位长,这简化了指令解码
  2. RISC-V 指令提供三个寄存器操作数,当一个操作天然就需要有三个不同的操作数,但是 ISA 只提供了两个操作数时,编译器或者汇编程序程序员就需要多使用一条 move(搬运)指令,来保存目的寄存器的值
  3. 在 RISC-V 中对于所有指令,要读写的寄存器的标识符总是在同一位置,意味着在解码指令之前,就可以先开始访问寄存器
  4. 这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位。这意味着可能成为关键路径的立即数符号扩展,可以在指令解码之前进行

RISCV模拟器

二进制翻译—QEMU

模拟实际代码执行过程中的软硬件行为,提供指令级别的仿真—spike

硬件级别的仿真,针对特定的实现做周期级别的模拟—rocket-chip

RISC-V软件栈

Image in a image block

RISC-V 指令

Image in a image block
Image in a image block
非特权指令
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个寄存器)

参考:risc-v-asm-manual.pdf

RVWMO实现

x86

Image in a image block

power

Image in a image block

arm

Image in a image block

Linux

Image in a image block

atomic operations

Image in a image block
Image in a image block

assembly handbook

Image in a image block
Image in a image block

汇编伪指令

汇编器实现了许多方便的伪指令,这些伪指令由基本 ISA 中的指令形成,但具有隐式参数或在某些情况下具有反向参数,从而导致不同的语义。更多参考:https://mark.theis.site/riscv/asm

riscv-asm.md#pseudoinstructions

特权指令

执行环境接口(EEI)

  • Linux应用程序二进制接口(ABI)
  • 应用程序执行接口(AEE)
  • RISC-V管理程序二进制接口(SBI)
  • 管理器执行环境(SEE)
  • hypervisor二进制接口(HBI)
  • hypervisor执行环境(HEE)

简单的系统 传统的操作系统 虚拟机监视器配置

Image in a image block

特权级别

U(用户级别):User/Application

S(管理员级别):Supervisor

M(机器级别):Machine

HS-mode:Hypervisor-extended supervisor mode

VU-mode:Virtual user mode

VS-mode:Virtual supervisor mode

ISA主要分为两类

  1. Zicsr扩展
  2. 其他特权指令

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所示。