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

RISC-V FENCE 指令详解

指令手册I-type

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

指令语法

fence pred, succ
操作数说明
确认 pred/succ 位覆盖需要排序的 I/O 或 R/W 操作集合。
确认 FENCE 是排序约束,不是通用缓存刷新指令。
RV32I缓存与同步

指令行为说明

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

FENCE 指令解析与排序动画

展示 FENCE opcode 编码、fm/pred/succ 字段,以及当前 hart 操作可见顺序约束;不模拟 cache、总线或流水线。

pred
succ
fence
,
执行环境当前 hart 可见顺序约束不刷新 cache
31..28
27..24
23..20
19..15
14..12
11..7
6..0
0000
fm
0011
pred
0011
succ
00000
rs1=x0
000
funct3
00000
rd=x0
0001111
MISC-MEM
instruction
0x0330000F
opcode
0001111 -> MISC-MEM/FENCE
fm
0000
pred
0011 -> RW
succ
0011 -> RW
reserved
rs1=x0, rd=x0, funct3=000
ordering
约束前续 RW 操作先于后续 RW 操作被观察到
complete
ordering constraint complete

该动画只展示 RISC-V 非特权 ISA 定义的 FENCE/PAUSE 架构语义;不表示任何具体处理器的暂停时长、缓存行为、互连协议或执行成本。

快速理解与检索要点

FENCE 的重点不是清缓存,而是用 pred/succ 位集合描述“哪些前续操作”必须先于“哪些后续操作”被其他观察者看到。

pred 和 succ 分别列出要排序的前续与后续操作类别。
I/O 位用于设备输入/输出排序,R/W 位用于内存读写排序。
普通 FENCE 的 fm=0;FENCE.TSO 使用特定 fm 编码。
rd 和 rs1 是保留字段,标准软件应置零。

常见使用场景

内存排序

结合 «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 是排序约束,不是通用 cache flush 或 pipeline flush 指令。
pred 或 succ 为空时不会建立实际前后操作排序。
保留的 rd/rs1 字段应置零,避免未来兼容性问题。

常见问题

FENCE 会刷新缓存吗?

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

fence rw,rw 是否排序设备 I/O?

不排序 I/O 位代表的设备输入/输出;需要设备顺序时应包含 I 或 O 位。

FENCE 会直接在其他 hart 上执行吗?

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