CSR 位字段

RISC-V fcsr CSR 寄存器详解

地址 0x003特权级 U模式访问 读写 / 32用户级浮点状态 CSR

浮点控制与状态寄存器,组合了frm(舍入模式)和fflags(异常标志)。

字段映射

按 bit 字段理解 fcsr

7 个关键字段
7:5

FRM

读写

浮点动态舍入模式:000 RNE,001 RTZ,010 RDN,011 RUP,100 RMM;101/110 保留;111 在 frm/fcsr 中为保留编码(DYN 仅用于指令 rm 字段)。

这个字段控制什么

  • - 浮点动态舍入模式:000 RNE,001 RTZ,010 RDN,011 RUP,100 RMM;101/110 保留;111 在 frm/fcsr 中为保留编码(DYN 仅用于指令 rm 字段)。

常见取值

000RNE

Round to Nearest, ties to Even。

001RTZ

Round towards Zero。

010RDN

Round Down,向负无穷。

011RUP

Round Up,向正无穷。

100RMM

Round to Nearest, ties to Max Magnitude。

101保留

保留舍入模式编码。

110保留

保留舍入模式编码。

111DYN/保留

在指令 rm 字段中选择动态舍入模式;在 frm CSR 中为保留编码。

4:0

FFLAGS

读写

累计浮点异常标志,位序为 NV、DZ、OF、UF、NX。

这个字段控制什么

  • - 累计浮点异常标志,位序为 NV、DZ、OF、UF、NX。

常见取值

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

4

NV

读写

无效操作异常标志。

这个字段控制什么

  • - 无效操作异常标志。

常见取值

00

NV 异常标志未置位。

11

NV 异常标志已累积置位;RISC-V F 扩展要求软件显式检查这些标志。

3

DZ

读写

除零异常标志。

这个字段控制什么

  • - 除零异常标志。

常见取值

00

DZ 异常标志未置位。

11

DZ 异常标志已累积置位;RISC-V F 扩展要求软件显式检查这些标志。

2

OF

读写

上溢异常标志。

这个字段控制什么

  • - 上溢异常标志。

常见取值

00

OF 异常标志未置位。

11

OF 异常标志已累积置位;RISC-V F 扩展要求软件显式检查这些标志。

1

UF

读写

下溢异常标志。

这个字段控制什么

  • - 下溢异常标志。

常见取值

00

UF 异常标志未置位。

11

UF 异常标志已累积置位;RISC-V F 扩展要求软件显式检查这些标志。

0

NX

读写

不精确异常标志。

这个字段控制什么

  • - 不精确异常标志。

常见取值

00

NX 异常标志未置位。

11

NX 异常标志已累积置位;RISC-V F 扩展要求软件显式检查这些标志。

官方依据与检索要点

fcsr 是 用户级浮点状态 CSR 中的 读写 CSR,地址为 0x003。先确认当前特权级和扩展实现情况,再根据位字段判断该 CSR 影响的架构状态。

fcsr 的地址、最低访问特权级和读写属性按官方 CSR 表核对:0x003,U模式,读写。
先按 用户级浮点状态 CSR 理解它影响的架构状态,再看页面中的位字段说明。
写入前只修改目标字段并保留未修改位;WPRI/保留字段应按官方规范和实现返回值解释。

读这个 CSR 时先看什么

  • - 先确认当前 hart 是否实现 fcsr,未实现或权限不足的访问会触发非法指令异常。
  • - 结合地址 0x003 和最低访问特权级(User)判断软件是否可以直接读取。
  • - 读取保留位或 WARL/WLRL 位时不要假设固定值,应按规范和实现返回值解释。

写入前的风险检查

  • - 写入前保留未修改的位,避免把保留位或实现定义位写成非规范值。
  • - 优先使用 CSRRS/CSRRC 做局部置位或清位,避免 CSRRW 覆盖并发更新的状态位。

放回真实流程里理解

1

初始化或进入相关特权流程时,软件先读取 fcsr 了解当前状态。

2

根据字段定义只修改目标位,保留其余位的原值。

3

修改后再次读取或通过后续 trap/中断/上下文切换行为验证配置是否生效。

常见问题

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

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

写 fcsr 时最容易忽略什么?

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