首页/指令库/CSR立即数读写
CSRRWI

RISC-V CSRRWI 指令详解

指令手册I-type

读取 CSR 旧值到 rd,并把零扩展的 5-bit uimm 写入 CSR;rd=x0 时抑制 CSR 读取

指令语法

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

指令行为说明

CSRRWI 是 CSRRW 的立即数形式:读取 CSR 旧值并零扩展到 XLEN 写入 rd,再把 5-bit 无符号 uimm 零扩展后写入目标 CSR。若 rd=x0,指令不读取 CSR,也不产生 CSR 读副作用;但无论 uimm 是否为 0,写操作仍按 CSRRWI 语义执行。

CSRRWI 指令解析与执行动画

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

rd
csr
uimm
csrrwi
,
,
执行环境

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

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

拿到 CSRRWI 的 32-bit SYSTEM 编码

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

encoding: 0x7C01D2F3
syntax : csrrwi t0(x5), 0x7C0, 3
result : t0(x5) = 0x0000000A; CSR = 0x00000003
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
0
1
1
write value
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

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

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

快速理解与检索要点

CSRRWI 使用 5-bit uimm 作为写入 CSR 的源值。rd=x0 时不读 CSR;uimm=0 仍表示写入零。

uimm[4:0] 零扩展到 XLEN 后作为写入值。
rd=x0 时不读取 CSR,也不产生读副作用。
CSRRWI 的 uimm=0 与 CSRRSI/CSRRCI 的 uimm=0 行为不同。
CSRRWI 的 uimm=0 仍会写入零;具体 CSR 的可写位、读回值和字段副作用由该 CSR 的规范决定。

常见使用场景

CSR 访问

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

系统与特权

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

使用前检查清单

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

容易混淆 / 常见误区

uimm 只有 5 位,合法范围是 0..31。
uimm=0 会写入零;不要把它和 CSRRSI/CSRRCI 的不写特例混淆。
rd=x0 抑制读取,但不会抑制写入。

常见问题

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

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

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

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