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

RISC-V CSRRSI 指令详解

指令手册I-type

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

指令语法

csrrsi rd, csr, uimm
操作数说明
RV32/RV64 Zicsr 2.0;32 位 SYSTEM 编码,opcode=1110011、funct3=110。
rd=[11:7] 选择整数寄存器;csr=[31:20] 是 12 位地址,不是有符号算术立即数;uimm=[19:15] 为 0..31,零扩展到 XLEN。
读取 CSR 旧值,零扩展到 XLEN 写 rd(x0 丢弃结果);源掩码选择要置位的可写位。rd=x0 仍读取 CSR。
uimm=0 抑制 CSR 写入和写副作用;非零 uimm 仅直接选择低 5 位。
CSR 必须已实现且访问获准;只读 CSR 写尝试触发 illegal-instruction。具体字段的可写性、读回值和副作用规则仍适用。
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 写尝试显示异常,不提交结果。

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 访问

假设 0x7c0 自定义 CSR 已实现、访问获准、示例位均为普通可写位,旧 CSR=0xa:csrrsi x5,0x7c0,1 → x5=0xa, CSR=0xb

系统与特权

假设 0x7c0 自定义 CSR 已实现、访问获准、示例位均为普通可写位,旧 CSR=0xa:csrrsi x5,0x7c0,1 → x5=0xa, CSR=0xb

使用前检查清单

语法检查
  • RV32/RV64 Zicsr 2.0;32 位 SYSTEM 编码,opcode=1110011、funct3=110。
  • rd=[11:7] 选择整数寄存器;csr=[31:20] 是 12 位地址,不是有符号算术立即数;uimm=[19:15] 为 0..31,零扩展到 XLEN。
语义检查
  • 读取 CSR 旧值,零扩展到 XLEN 写 rd(x0 丢弃结果);源掩码选择要置位的可写位。rd=x0 仍读取 CSR。
  • uimm=0 抑制 CSR 写入和写副作用;非零 uimm 仅直接选择低 5 位。
  • CSR 必须已实现且访问获准;只读 CSR 写尝试触发 illegal-instruction。具体字段的可写性、读回值和副作用规则仍适用。

容易混淆 / 常见误区

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 写入。