CSR 位字段

RISC-V scountinhibit CSR 寄存器详解

地址 0x120特权级 Supervisor 模式访问 读写 / 32Supervisor 计数器与溢出 CSR

scountinhibit(0x120)由 Smcdeleg/Ssccfg 定义,是 32 位 mcountinhibit 的 masked alias,用于 S 模式访问已委托计数器的 inhibit 位。

位作用速览
bit 3 = 只有第 3 位;bits 12..11 = 第 12 到第 11 位
高位 MSB低位 LSB
字段映射

按 bit 字段理解 scountinhibit

1 个关键字段
31:0

INHIBIT_ALIAS

读写/未委托位只读 0

已委托给 S 模式的 counter 对应 mcountinhibit 位可通过 scountinhibit 访问;未委托 counter 的对应位读为 0。

这个字段控制什么

  • - 已委托给 S 模式的 counter 对应 mcountinhibit 位可通过 scountinhibit 访问;未委托 counter 的对应位读为 0。

常见取值

delegated inhibit bit
0计数允许

仅对已委托给 S-mode 且通过 scountinhibit 可访问的对应 mcountinhibit 位:0 表示该 counter 不由此位禁止递增;非委托位读为 0 且没有此可写语义。

1计数禁止

仅对已委托给 S-mode 且通过 scountinhibit 可访问的对应 mcountinhibit 位:1 表示该 counter 被禁止递增;非委托位读为 0 且没有此可写语义。

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

scountinhibit 不是独立计数器配置寄存器;它是 32 位 mcountinhibit 的 masked alias,只暴露已委托给 S 模式的 counter inhibit 位。

Smcdeleg/Ssccfg 要求 menvcfg.CDE 启用相关访问。
scountinhibit 是 mcountinhibit 的 masked alias;mcountinhibit 是 32 位 WARL counter-inhibit 寄存器。
未委托 counter 的 scountinhibit 位为只读 0。

读这个 CSR 时先看什么

  • - 先确认当前 hart 实现 Smcdeleg/Ssccfg;未实现或权限不足的 CSR 访问会触发非法指令异常。
  • - scountinhibit 是 32 位 mcountinhibit 的 masked alias,不是 XLEN 宽的普通状态 CSR。
  • - 未委托 counter 的对应位读为 0;已委托位按 mcountinhibit inhibit 语义解释。

写入前的风险检查

  • - 当 menvcfg.CDE=0 时访问 scountinhibit 会触发非法指令异常。
  • - 启用 Supervisor Counter Delegation 后,VS/VU 模式访问 scountinhibit 会触发 virtual-instruction exception。

放回真实流程里理解

1

确认 Smcdeleg/Ssccfg 可用,并且 menvcfg.CDE 允许 S 模式访问委托计数器状态。

2

读取 scountinhibit 查看已委托 counter 的 inhibit 位;未委托位按只读 0 处理。

3

只对已委托 counter 写入 inhibit 位,写后读回确认实际生效值。

常见问题

scountinhibit 和 scounteren 有什么区别?

scountinhibit 控制已委托 counter 的 inhibit 位;scounteren 控制 U 模式能否读取 counter。