首页/指令库/CSR立即数读后置位
CSRRSI

RISC-V CSRRSI 指令详解

指令手册I-type

读取 CSR 旧值到 rd,并以 5-bit uimm 为掩码置位 CSR;uimm=0 时不写 CSR

指令语法

csrrsi rd, csr, uimm
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
ZicsrCSR操作系统

指令行为说明

CSRRSI 是 CSRRS 的立即数形式:读取 CSR 旧值并零扩展到 XLEN 写入 rd,再把 5-bit 无符号 uimm 作为低位掩码,对应置位目标 CSR。若 uimm=0,指令不写 CSR,也不产生 CSR 写副作用;此时仍读取 CSR。

CSRRSI 指令解析与执行动画

展示 Zicsr CSR 读-改-写的 ISA 可见流程:解析 SYSTEM 编码、读取 CSR、按写/置位/清位语义计算,再更新 rd 与 CSR。

rd
csr
uimm
csrrsi
,
,
执行环境

CSR 名称/地址属于指令语法;旧 CSR 值和 rs1 示例值属于执行上下文。动画按显示位可写来计算示例结果;实际 CSR 的可写位、读回值和字段副作用须遵循该 CSR 的规范。

31..20
19..15
14..12
11..7
6..0
011111000000
csr[11:0]
00101
uimm[4:0]
110
funct3
00101
rd
1110011
opcode
执行数据路径
instruction
0x7C02E2F3
opcode
1110011 -> SYSTEM
funct3
110 -> CSRRSI
operands
rd=t0(x5), csr=0x7C0, uimm=5
CSR read
0x7C0 -> 0x0000000A
uimm source
5 -> 0x00000005
CSR update
CSR = 0x0000000F
rd update
t0(x5) = 0x0000000A
当前步骤

拿到 CSRRSI 的 32-bit SYSTEM 编码

CSRRSI 是 Zicsr 定义的 I-type SYSTEM 指令,CSR 地址位于 bits 31..20。

encoding: 0x7C02E2F3
syntax : csrrsi t0(x5), 0x7C0, 5
result : t0(x5) = 0x0000000A; CSR = 0x0000000F
CSR 位级结果
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
old CSR
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
mask
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

位级视图显示当前 XLEN 的 CSR 值计算。

该动画只展示 Zicsr 定义的 ISA 可见 CSR 读写、副作用抑制和位掩码语义;不模拟具体 CSR 字段含义、异常处理器、流水线或时序。

快速理解与检索要点

CSRRSI 用 5-bit uimm 的 1 位作为置位掩码。uimm=0 时读 CSR 但不写 CSR。

uimm[4:0] 是零扩展的 5-bit 掩码。
uimm=0 抑制 CSR 写入和写副作用。
对普通读写位,CSRRSI 的位运算是 old_csr OR uimm_mask;特殊 CSR 字段仍受官方读回值与副作用规则约束。
CSRRSI 的 uimm=0 只读形式不写 CSR;具体 CSR 的可写位、读回值和字段副作用由该 CSR 的规范决定。

常见使用场景

CSR 访问

结合 «csrrsi x5, 0x7c0, 1 # x5 = old CSR; set bit 0» 等实际代码理解该场景。

系统与特权

结合 «csrrsi x5, 0x7c0, 1 # x5 = old CSR; set bit 0» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认立即数字段在有效范围内。
  • 确认源寄存器 rs1 指向正确的操作数。
语义检查
  • 确认立即数符号扩展是否符合预期。
  • 确认结果寄存器 rd 的用途是否明确。

容易混淆 / 常见误区

uimm 只能作为低 5 位掩码,不能直接影响更高 CSR 位。
uimm=0 是只读特例,不执行 CSR 写入;非零 uimm 只直接选择低 5 位掩码,但特殊 CSR 字段仍受官方读回值与字段副作用规则约束。
rd=x0 丢弃旧值,但不抑制 CSRRSI 的 CSR 读取。

常见问题

CSR 指令里的 atomic 是内存原子吗?

不是。Zicsr 里的 atomic 指 CSR 读和写在同一条 CSR 指令中完成,不是对内存地址执行 AMO。

rd=x0 和 rs1/uimm=0 的效果一样吗?

不一样。rd=x0 只在 CSRRW/CSRRWI 中抑制 CSR 读取;rs1=x0 或 uimm=0 只在 CSRRS/CSRRC 及其立即数形式中抑制 CSR 写入。