andeyqi 发表于 2024-11-28 23:29

【读书】《RISC-V 体系结构编程与实践(第2版)》-- RISC-V CSR 指令集学习

本帖最后由 andeyqi 于 2024-11-28 23:47 编辑

## 简介

RISC-V 除了通用寄存器外,还定义了CSR 系统控制与状态寄存器,来实现中断控制及系统状态获取等功能,这些特殊的寄存器的访问需要使用特定的 CSR 指令来读取,设置。对于CSR 指令的验证依然在 RARS 模拟器上进行验证,RARS 定义了 U Mode 下的CSR 寄存器,模拟器的寄存器定义如下。


以下书中对U mode 下的CSR 寄存器说明


以下是书中对CSR 指令的说明


### CSRRW 指令测试验证
指令格式:csrrw rd,csr,rs1
指令描述:原子的交换CSR 和 rs1 寄存器的值,读取CSR旧值,写入到rd寄存器中,与此同时rs1 寄存器的旧值被写入到CSR中,对应伪代码如下
rd = csr,csr = rs1
以下是CSRW 指令说明。

上述当rd 为 x0 时,不进行读操作,编写如下代码验证csrrw 指令运行效果。

```c
li x2,0x55
csrrw x1,fcsr,x2
nop
```
上述代码执行后会将fcsr 寄存器的值(0xaa)更新到x1,将x2 的值0x55 更新到fcsr 寄存器
**csrrw x1,fcsr,x2** 执行后x1 被更新为0xaa


同时fcsr 寄存器更新为x2 的值0x55


### CSRRS 指令测试验证
指令格式:csrrs rd,csr,rs1
指令说明:原子的读取CSR 的值并且设置CSR中相应的位。对应伪代码如下
rd = csr,csr |= rs1
CSRRS 指令说明如下
> The CSRRS (Atomic Read and Set Bits in CSR) instruction reads the value of the CSR, zeroextends the value to XLEN bits, and writes it to integer register rd. The initial value in integer
register rs1 is treated as a bit mask that specifies bit positions to be set in the CSR. Any bit that
is high in rs1 will cause the corresponding bit to be set in the CSR, if that CSR bit is writable.
Other bits in the CSR are unaffected (though CSRs might have side effects when written).

添加如下测试代码,fcsr 初始值为0xaa, 设置rs1 = 0x55 掩码跟新fcsr bit0-3 ,按照上述说明执行后fcsr 更新为0xff.

```c
li x2,0x55
csrrs x1,fcsr,x2
nop
```


另外的csrrc/csrrwi/csrrsi/csrrci 指令跟上述处理也是类似,再此就不额外赘述了。

CSR寄存器 指令还可以通过以下伪指令来访问,伪指令会被被转化成相应的CSR指令来更新寄存器

Jacktang 发表于 2024-11-29 07:26

<p>好书,RISC-V 体系结构该讲的都讲到了</p>

andeyqi 发表于 2024-11-29 10:24

Jacktang 发表于 2024-11-29 07:26
好书,RISC-V 体系结构该讲的都讲到了

<p>嗯 很适合座位学习RISC-V 的入门书籍</p>
页: [1]
查看完整版本: 【读书】《RISC-V 体系结构编程与实践(第2版)》-- RISC-V CSR 指令集学习