首页/指令库/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 任何具体平台字段含义。

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 行为不同。
CSR 地址高两位为 11 的只读 CSR 不能通过会写 CSR 的形式写入;这类写入会触发 illegal-instruction,CSRRS/CSRRC 的零源只读特例除外。

常见使用场景

原子与同步

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

系统与特权

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

使用前检查清单

语法检查
  • 确认当前指令格式为 I-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

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