CSR 位字段

RISC-V mtval CSR 寄存器详解

地址 0x343特权级 M模式访问 读写 / MXLENMachine 状态、trap 与中断 CSR

机器陷阱值 CSR;进入 M 模式陷阱时保存 0 或异常相关的附加信息。

字段映射

按 bit 字段理解 mtval

1 个关键字段
MXLEN-1:0

VALUE

WARL 或只读零

附加陷阱值。若平台规定没有异常写入非零 mtval,则该 CSR 可为只读零,但实现 H 扩展时不得为只读零;否则为 WARL,必须能保存所有有效虚拟地址和 0,并在支持非法指令位返回时保存小于 2^min(MXLEN, ILEN) 的值。

这个字段控制什么

  • - 附加陷阱值。若平台规定没有异常写入非零 mtval,则该 CSR 可为只读零,但实现 H 扩展时不得为只读零;否则为 WARL,必须能保存所有有效虚拟地址和 0,并在支持非法指令位返回时保存小于 2^min(MXLEN, ILEN) 的值。

常见取值

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

官方依据与检索要点

mtval 是地址 0x343 的 MXLEN 位机器陷阱值 CSR。进入 M 模式陷阱时,它保存 0 或异常相关附加信息;是否有非零值、具体含义必须先由 mcause 和平台规则决定。

官方 CSR 表列出 mtval 地址 0x343,M 模式读写。
进入 M 模式陷阱时,mtval 写入 0 或异常相关信息;哪些异常必须、可以或不会提供非零值由硬件平台规定。
若不是只读零,mtval 是 WARL,必须能保存所有有效虚拟地址和 0;实现 H 扩展时 mtval 不得为只读零。

读这个 CSR 时先看什么

  • - mtval 是 MXLEN 位 M 模式 CSR,地址 0x343。
  • - 进入 M 模式陷阱时,mtval 被置为 0 或写入异常相关信息;具体哪些异常提供有意义非零值由硬件平台规定。
  • - 必须先根据 mcause 判断陷阱类型,再解释 mtval。

写入前的风险检查

  • - 若 mtval 不是只读零,则它是 WARL;实现可在写入前把无效地址转换为另一个可保存的无效地址。
  • - 不要假设所有异常都会写入非零 mtval;对其他陷阱,mtval 设为 0。

放回真实流程里理解

1

陷阱处理程序先读取 mcause 确定异常类型。

2

若该异常类型和平台可能提供 mtval 信息,再读取 mtval。

3

按异常类型解释 mtval:出错虚拟地址、非法指令位、软件检查原因码或 0。

常见问题

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

不能只看 CSR 名称判断。官方 CSR 地址表给出最低访问特权级;mtval 位于 0x343,最低访问级为 M 模式。权限不足或访问未实现 CSR 时会触发非法指令异常。

写 mtval 时最容易忽略什么?

写 mtval 时必须先确认它不是只读零,并按 WARL 规则处理。读取 mtval 时也不能脱离 mcause:同一个数值可能表示地址、指令位、软件检查原因,或仅表示没有附加信息。