CSR 位字段

RISC-V scounteren CSR 寄存器详解

地址 0x106特权级 S模式访问 读写 / 32Supervisor 环境配置与状态使能 CSR

监管者计数器使能寄存器,控制 U 模式以及启用 H 扩展时 VU 模式能否读取标准计数器和 HPM 计数器。

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

按 bit 字段理解 scounteren

5 个关键字段
0

CY

WARL/可为只读零

控制 U 模式读取 `cycle`;启用 H 扩展时也参与 VU 模式计数器访问判定。若该位清零,U/VU 模式读取 `cycle` 会异常;若该位和 `mcounteren.CY` 都置位,则 U 模式允许读取;VU 模式还要求 `hcounteren.CY` 置位。

这个字段控制什么

  • - 控制 U 模式读取 `cycle`;启用 H 扩展时也参与 VU 模式计数器访问判定。若该位清零,U/VU 模式读取 `cycle` 会异常;若该位和 `mcounteren.CY` 都置位,则 U 模式允许读取;VU 模式还要求 `hcounteren.CY` 置位。

常见取值

0关闭

U 模式读取 cycle 触发非法指令异常;启用 H 扩展时,VU 模式读取也因 `scounteren.CY=0` 而异常。

1开启

S 模式授权 U/VU 模式读取 cycle;U 模式仍要求 mcounteren.CY 置位,VU 模式还要求 hcounteren.CY 置位。

1

TM

WARL/可为只读零

控制 U 模式读取 `time`;启用 H 扩展时也参与 VU 模式计数器访问判定。若该位清零,U/VU 模式读取 `time` 会异常;若该位和 `mcounteren.TM` 都置位,则 U 模式允许读取;VU 模式还要求 `hcounteren.TM` 置位。

这个字段控制什么

  • - 控制 U 模式读取 `time`;启用 H 扩展时也参与 VU 模式计数器访问判定。若该位清零,U/VU 模式读取 `time` 会异常;若该位和 `mcounteren.TM` 都置位,则 U 模式允许读取;VU 模式还要求 `hcounteren.TM` 置位。

常见取值

0关闭

U 模式读取 time 触发非法指令异常;启用 H 扩展时,VU 模式读取也因 `scounteren.TM=0` 而异常。

1开启

S 模式授权 U/VU 模式读取 time;U 模式仍要求 mcounteren.TM 置位,VU 模式还要求 hcounteren.TM 置位。

2

IR

WARL/可为只读零

控制 U 模式读取 `instret`;启用 H 扩展时也参与 VU 模式计数器访问判定。若该位清零,U/VU 模式读取 `instret` 会异常;若该位和 `mcounteren.IR` 都置位,则 U 模式允许读取;VU 模式还要求 `hcounteren.IR` 置位。

这个字段控制什么

  • - 控制 U 模式读取 `instret`;启用 H 扩展时也参与 VU 模式计数器访问判定。若该位清零,U/VU 模式读取 `instret` 会异常;若该位和 `mcounteren.IR` 都置位,则 U 模式允许读取;VU 模式还要求 `hcounteren.IR` 置位。

常见取值

0关闭

U 模式读取 instret 触发非法指令异常;启用 H 扩展时,VU 模式读取也因 `scounteren.IR=0` 而异常。

1开启

S 模式授权 U/VU 模式读取 instret;U 模式仍要求 mcounteren.IR 置位,VU 模式还要求 hcounteren.IR 置位。

31:3

HPMn

WARL/可为只读零

每一位控制 U 模式读取对应的 `hpmcounter3` 到 `hpmcounter31`;启用 H 扩展时也参与 VU 模式计数器访问判定。任何位都可为只读零,表示对应计数器在 U/VU 模式读取会异常。

这个字段控制什么

  • - 每一位控制 U 模式读取对应的 `hpmcounter3` 到 `hpmcounter31`;启用 H 扩展时也参与 VU 模式计数器访问判定。任何位都可为只读零,表示对应计数器在 U/VU 模式读取会异常。

常见取值

0关闭

U 模式读取对应 hpmcounter 触发非法指令异常;启用 H 扩展时,VU 模式读取也因对应 scounteren 位为 0 而异常。

1开启

S 模式授权 U/VU 模式读取对应 hpmcounter;U 模式仍要求 mcounteren 对应位置位,VU 模式还要求 hcounteren 对应位置位。

63:32

Reserved

只读零

`scounteren` 是 32 位 CSR;RV64 视图中的位 63:32 保留为零。

这个字段控制什么

  • - `scounteren` 是 32 位 CSR;RV64 视图中的位 63:32 保留为零。

常见取值

0保留零

这些位不承载计数器授权语义。

官方依据与检索要点

scounteren 控制 U 模式读取 `cycle`、`time`、`instret` 和 `hpmcounter3-31`;启用 H 扩展时也参与 VU 模式计数器访问判定。任意位可为只读零,U 模式仍需要 `mcounteren` 对应位同时置位,VU 模式还需要 `hcounteren` 对应位。

官方 Supervisor-Level ISA 将 `scounteren` 定义为 32 位寄存器。
清零的 CY/TM/IR/HPMn 位使 U 模式读取对应计数器触发非法指令异常;启用 H 扩展时也会阻止 VU 模式读取。
`mcounteren` 的设置不影响 `scounteren` 位是否可写,但 U 模式访问要求两级对应位都置位;VU 模式还要求 `hcounteren` 对应位置位。

读这个 CSR 时先看什么

  • - `scounteren` 是必须实现的 32 位 S 模式 CSR,但任意位都可以是只读零。
  • - U 模式访问对应计数器需要 `scounteren` 和 `mcounteren` 的对应位同时置位;启用 H 扩展时,VU 模式还要求 `hcounteren` 对应位置位。

写入前的风险检查

  • - 不要假设所有位都可写;写后按 WARL/只读零行为读回确认。
  • - 设置 `scounteren` 不会绕过 `mcounteren` 或 `hcounteren`,也不决定计数器是否递增。

放回真实流程里理解

1

确认 M 模式已经通过 `mcounteren` 授权相应计数器;若检查 VU 模式,还要确认 `hcounteren`。

2

S 模式设置 `scounteren` 中对应 CY、TM、IR 或 HPMn 位。

3

在 U/VU 模式读取相应计数器,未授权时预期触发非法指令异常或适用的虚拟指令异常。

常见问题

scounteren 可以在任意特权级访问吗?

不能只看 CSR 名称判断。官方 CSR 地址编码和表格给出最低访问特权级;scounteren 当前记录为 S模式,权限不足或未实现时访问会触发非法指令异常。

写 scounteren 时最容易忽略什么?

不要把整个 CSR 当普通整数覆盖。应只修改目标字段,保留未修改位,并按规范处理 WARL、WLRL、WPRI 或保留字段。