WRS.NTO

RISC-V WRS.NTO 指令详解

指令手册I-type

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

指令语法

wrs.nto

没有显式操作数;需 Zawrs。等待目标内存写入时,先用 LR 建立包含目标字节的保留集。

32 位 SYSTEM I 型字段:funct12=000000001101、rs1=00000、funct3=000、rd=00000、opcode=1110011。

保留集有效、未观察到待处理中断时可停顿;没有内建的短超时。实现可偶尔因任意原因结束;软件须复查条件。

非 M 模式、TW=1 且未在实现定义的有界时间内完成时产生非法指令异常;VS/VU、TW=0、VTW=1 且同样未完成时产生虚拟指令异常。

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。32 位 SYSTEM I 型字段:funct12=000000001101、rs1=00000、funct3=000、rd=00000、opcode=1110011。

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

指令行为说明

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

快速理解与检索要点

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

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

常见使用场景

LR 保留集轮询

在轮询循环内,LR 为目标字节建立保留集,再按共享状态决定是否执行本指令。等待返回后重新读取并判断条件;返回不证明已有目标写入。

共享状态等待

在轮询循环内,LR 为目标字节建立保留集,再按共享状态决定是否执行本指令。等待返回后重新读取并判断条件;返回不证明已有目标写入。

使用前检查清单

语法检查
  • 没有显式操作数;需 Zawrs。等待目标内存写入时,先用 LR 建立包含目标字节的保留集。
  • 32 位 SYSTEM I 型字段:funct12=000000001101、rs1=00000、funct3=000、rd=00000、opcode=1110011。
语义检查
  • 保留集有效、未观察到待处理中断时可停顿;没有内建的短超时。实现可偶尔因任意原因结束;软件须复查条件。
  • 非 M 模式、TW=1 且未在实现定义的有界时间内完成时产生非法指令异常;VS/VU、TW=0、VTW=1 且同样未完成时产生虚拟指令异常。

容易混淆 / 常见误区

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

常见问题

WRS.NTO 能替代 LR/SC 吗?

不能。它等待 LR 已建立的保留集,不执行 LR 的加载或 SC 的条件存储。

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

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