首页/指令库/内存屏障
FENCE

RISC-V FENCE 指令详解

指令手册I-type

按 pred/succ 集合约束内存读写和设备 I/O 操作的可观察顺序。

指令语法

fence pred, succ
操作数说明
pred/succ:选择前序和后续操作集合,I/O 与内存 R/W 位需要分开理解。
FENCE.TSO 是 FENCE 的特定编码,不带普通寄存器操作数。
RV32I缓存与同步

指令编码

31..20
imm[11:0]
19..15
rs1
14..12
funct3
11..7
rd
6..0
opcode

FENCE 使用 opcode 0001111(0x0f)、funct3 000。FENCE 编码使用 pred/succ 和 fm 字段描述排序约束,不是普通寄存器运算格式。

格式: I-type
opcode: 0001111 (0x0f)
funct3: 000 (0x0)

指令行为说明

FENCE 使用 pred 和 succ 字段指定需要排序的前续和后续操作集合:I 表示设备输入,O 表示设备输出,R 表示内存读,W 表示内存写。它约束当前 hart 对其他 hart 或外部设备可观察到的内存与 I/O 操作顺序;标准软件应将保留字段 rd 和 rs1 置零。

快速理解与检索要点

FENCE 的重点不是“清缓存”,而是按 pred/succ 集合建立本 hart 的内存与设备 I/O 操作顺序约束。

pred 和 succ 分别列出要排序的前续与后续操作类别。
I/O 位用于设备输入/输出排序,R/W 位用于内存读写排序。

常见使用场景

内存排序

结合 «fence rw, rw # full memory barrier: prior reads+writes before subsequent reads+writes» 等实际代码理解该场景。

设备与 IO

结合 «fence rw, rw # full memory barrier: prior reads+writes before subsequent reads+writes» 等实际代码理解该场景。

并发同步

结合 «fence rw, rw # full memory barrier: prior reads+writes before subsequent reads+writes» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认 pred/succ 位覆盖需要排序的 I/O 或 R/W 操作集合。
  • 确认 FENCE 是排序约束,不是通用缓存刷新指令。
语义检查
  • 确认需要的是当前 hart 操作可见顺序约束。
  • 确认是否需要 I/O 位;FENCE.TSO 不排序设备 I/O。

容易混淆 / 常见误区

pred/succ 中 I/O 和 R/W 是不同类别;设备同步不要只写 RW。
FENCE 不排序通过非内存信号观察到的外部事件。
保留的 rd/rs1 字段应置零,避免未来兼容性问题。

常见问题

FENCE 会刷新缓存吗?

官方语义是排序约束,不是通用缓存刷新指令。

FENCE 会影响其他 hart 的执行吗?

不会。它约束当前 hart 的相关操作对其他观察者可见的顺序。