CSR 位字段

RISC-V mcounteren CSR 寄存器详解

地址 0x306特权级 M模式访问 读写 / 32 位Machine 委托、环境配置与状态使能 CSR

机器计数器使能寄存器;控制硬件性能监控计数器对下一个较低特权级的可访问性。

字段映射

按 bit 字段理解 mcounteren

5 个关键字段
0

CY

WARL

控制较低特权级读取 cycle。

这个字段控制什么

  • - 控制较低特权级读取 cycle。

常见取值

0禁止访问

较低特权级访问相应 CSR 会触发非法指令异常。

1允许访问

允许下一个已实现的较低特权级访问相应 CSR;若存在 hcounteren 等更低层控制,还需满足那些控制。

1

TM

WARL

控制较低特权级读取 time;清零时也阻止低于 M 的特权级访问 stimecmp 或 vstimecmp。

这个字段控制什么

  • - 控制较低特权级读取 time;清零时也阻止低于 M 的特权级访问 stimecmp 或 vstimecmp。

常见取值

0禁止访问

较低特权级访问相应 CSR 会触发非法指令异常。

1允许访问

允许下一个已实现的较低特权级访问相应 CSR;若存在 hcounteren 等更低层控制,还需满足那些控制。

2

IR

WARL

控制较低特权级读取 instret。

这个字段控制什么

  • - 控制较低特权级读取 instret。

常见取值

0禁止访问

较低特权级访问相应 CSR 会触发非法指令异常。

1允许访问

允许下一个已实现的较低特权级访问相应 CSR;若存在 hcounteren 等更低层控制,还需满足那些控制。

31:3

HPMn

WARL

控制较低特权级读取 hpmcounter3 到 hpmcounter31。

这个字段控制什么

  • - 控制较低特权级读取 hpmcounter3 到 hpmcounter31。

常见取值

0禁止访问

较低特权级访问相应 CSR 会触发非法指令异常。

1允许访问

允许下一个已实现的较低特权级访问相应 CSR;若存在 hcounteren 等更低层控制,还需满足那些控制。

63:32

Reserved/RO0 (RV64)

只读零

mcounteren 是 32 位寄存器;在 RV64 CSR 视图中,上 32 位没有计数器使能位并读为零。

这个字段控制什么

  • - mcounteren 是 32 位寄存器;在 RV64 CSR 视图中,上 32 位没有计数器使能位并读为零。

常见取值

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

官方依据与检索要点

mcounteren 决定较低特权级是否能读取 cycle、time、instret 和 hpmcounter3-31。它不影响计数器是否继续递增。

所有 mcounteren 字段都是 WARL,并且可实现为只读零。
TM 位除了 time 访问外,还控制低于 M 的特权级对 stimecmp/vstimecmp 的访问。
mcounteren 只控制可访问性,不是 counter inhibit 寄存器。

读这个 CSR 时先看什么

  • - mcounteren 是 32 位寄存器;实现 U 模式的 hart 必须实现它,没有 U 模式的 hart 不应有它。
  • - 所有字段都是 WARL,并且可以是只读零。
  • - 这些设置只控制可访问性;即使访问被禁止,底层计数器仍继续递增。

写入前的风险检查

  • - CY、TM、IR 或 HPMn 位为 0 时,较低特权级读取相应计数器 CSR 会触发非法指令异常。
  • - TM 位为 0 时,还会阻止低于 M 的特权级访问 stimecmp 或 vstimecmp。
  • - 不要把 mcounteren 当作计数器停止控制;需要停止时应使用规范定义的相关 inhibit/configuration CSR。

放回真实流程里理解

1

决定下一个较低特权级可以读取哪些计数器。

2

只设置相应 WARL 使能位,并读回确认实现接受的值。

3

在适用场景下,还需结合 hcounteren/scounteren 或 state-enable 控制作为更低层门控。

常见问题

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

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

写 mcounteren 时最容易忽略什么?

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