CSR 位字段

RISC-V stimecmp CSR 寄存器详解

地址 0x14D特权级 Supervisor 模式访问 读写 / 64Supervisor AIA、定时器与间接中断 CSR

stimecmp(0x14D)是 Sstc 定义的 64 位 Supervisor timer compare CSR;menvcfg.STCE=1 时,time 大于等于 stimecmp 产生 STIP 挂起条件;STCE=0 时 STIP 恢复未实现 Sstc 的行为。

字段映射

按 bit 字段理解 stimecmp

1 个关键字段
63:0

TIME_COMPARE

读写

64 位 supervisor timer compare 值;在 RV32 中低 32 位通过 stimecmp 访问,高 32 位通过 stimecmph 访问。

这个字段控制什么

  • - 64 位 supervisor timer compare 值;在 RV32 中低 32 位通过 stimecmp 访问,高 32 位通过 stimecmph 访问。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

↗打开官方手册
官方依据与检索要点

stimecmp 是 Sstc 提供的 S 模式定时器比较值。menvcfg.STCE=1 时,STIP 反映 time >= stimecmp,更新最终可见但可能不是立即可见;STCE=0 时 STIP 恢复未实现 Sstc 的行为。

官方定义 stimecmp 为 64 位,RV32 使用 stimecmp/stimecmph 分别访问低/高 32 位。
S 模式访问受 menvcfg.STCE 和 mcounteren.TM 控制;STCE=0 时 STIP 回到未实现 Sstc 时的行为。
menvcfg.STCE=1 时,STIP 反映 stimecmp 与 time 的比较结果,并按标准中断使能与委托规则进入 handler;STCE=0 时恢复未实现 Sstc 的行为。
handler 更新 stimecmp 后仍要允许偶发 spurious timer interrupt。

读这个 CSR 时先看什么

  • - stimecmp 的最低访问级为 S 模式。访问不存在 CSR 的指令为保留指令,不适用下述虚拟指令例外。权限不足而访问已实现的 CSR 通常触发非法指令异常;H 扩展下,VU 访问已实现且同种读写在 HS 模式允许(按 mstatus.TVM=0 判断)的 supervisor CSR 时,触发虚拟指令异常。
  • - 实现 Sstc 时,S/HS 模式访问 stimecmp 要求 menvcfg.STCE=1 且 mcounteren.TM=1;若其中任一门控为 0,低于 M 模式的访问触发非法指令异常。
  • - 读取保留、WPRI、WARL 或 WLRL 字段时不要假设固定值,应按官方规范和实现返回值解释。

写入前的风险检查

  • - 写入小于或等于当前 time 的值会使 STIP 挂起;写入大于当前 time 的值会清除该 timer interrupt 条件。
  • - 更新 stimecmp 后 STIP 的变化最终可见但不保证立即可见,handler 返回后可能遇到偶发 spurious timer interrupt。

放回真实流程里理解

1

读取 time 或由调度器决定下一次 S 模式 tick。

2

确认 Sstc 已实现且 menvcfg.STCE 与 mcounteren.TM 都允许 S 模式访问 stimecmp。

3

写入 stimecmp(RV32 同时维护 stimecmph 高半)设置下一次比较点。

4

按标准中断使能和委托规则处理 STIP;不要假设 STIP 立即下降。

常见问题

stimecmp 是 XLEN 宽吗?

不是。官方 Sstc 文本定义它是 64 位;RV32 通过 stimecmp 和 stimecmph 分半访问。

写 stimecmp 会立即清除 STIP 吗?

写入大于 time 的值会清除比较条件,但 STIP 变化只保证最终反映,不保证立即反映。