WRS.NTO

RISC-V WRS.NTO 指令详解

指令手册I-type

等待保留集存储事件(无超时)

指令语法

wrs.nto
操作数说明
WRS.NTO 没有显式汇编操作数;它使用固定的 SYSTEM I-type 编码。
funct12 固定为 000000001101,rs1=x0、funct3=000、rd=x0,opcode=1110011。
reservation set 的有效性、pending interrupt 和实现定义的停顿时间是隐式架构或实现状态,不是汇编寄存器或立即数操作数。
Zawrs缓存与同步

指令编码

31..20
funct12
19..15
rs1=x0
14..12
funct3
11..7
rd=x0
6..0
opcode

WRS-NTO 使用 opcode 1110011(0x73)、funct3 000、funct12 000000001101、rs2 固定 x0。该固定 SYSTEM 编码没有显式汇编寄存器或立即数操作数;funct12、rs1、funct3、rd 和 opcode 必须与手册列出的常量一致。

格式: SYSTEM I 型字段
opcode: 1110011 (0x73)
funct3: 000 (0x0)
funct12: 000000001101 (0x00d)
rs2: 固定 x0

指令行为说明

当保留集有效且未观察到待处理中断(即使该中断被禁用)时,hart 可临时在低功耗状态停顿。它与 LR 建立的保留集配合用于轮询;实现也可因任何原因偶尔结束停顿。

快速理解与检索要点

WRS.NTO 是 Zawrs 等待保留集指令:在保留集有效且未观察到待处理中断时,hart 可以临时停顿;LR 用来建立该保留集。

若要等待目标字节被写入,应先用 LR 建立包含它们的保留集;该指令本身不指定地址操作数。
WRS.NTO 没有短超时,但可因写入保留集、观察到中断或实现选择而结束。
这些指令在所有特权模式可用;WRS.NTO 在 mstatus.TW=1 的非 M 模式会有受限时间后的非法指令异常;在 VS/VU 模式,mstatus.TW=0 且 hstatus.VTW=1 时则为虚拟指令异常。

常见使用场景

原子与同步

结合 «retry: lr.w x10, (x11) ; ... ; wrs.nto ; j retry» 等实际代码理解该场景。

并发与多核

结合 «retry: lr.w x10, (x11) ; ... ; wrs.nto ; j retry» 等实际代码理解该场景。

调试与监控

结合 «retry: lr.w x10, (x11) ; ... ; wrs.nto ; j retry» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

若要等待某个内存位置被写入,应先用 LR 建立包含其字节的保留集。
mstatus.TW=1 时,非 M 模式的 WRS.NTO 若未在实现定义的有界时间内完成,会产生非法指令异常;在 VS/VU 模式,mstatus.TW=0 且 hstatus.VTW=1 时,同一未完成条件会产生虚拟指令异常。
没有短超时保证,但实现仍可因写入保留集、中断或自身选择结束等待;软件必须循环复查条件。

常见问题

WRS.NTO 能替代 LR/SC 吗?

不能。它只等待已有保留集相关事件;同步算法仍需要 LR/SC、AMO 或 CAS 等原子操作完成状态更新。

WRS.NTO 一定会睡到内存变化吗?

不一定。官方允许实现因任何原因偶尔结束停顿,软件必须在循环中重新检查条件。