更多精彩,请点击上方
蓝字关注我
前言:
RISC-V(发音为“risk-five”)是一种新的指令集架构(ISA),最初的设计目的是支持计算机架构的研究和教育,但随着近些年的发展,它已经成为工业实现中的一个标准化、免费且开放的架构。
RISC-V 指令集的一大优势是其可扩展性,用户可根据具体应用需求,选择合适的扩展指令集。本文介绍RISC-V的控制和状态寄存器(CSR)。
一、CSR地址映射规范
CSR使用12位地址空间(csr[11:0]),最多支持4,096个寄存器。其编码规则如下:
csr[11:10]:表示读写权限
00、01、10:读/写寄存器11:只读寄存器csr[9:8]:编码最低可访问特权级别
00:用户级(U-mode)01:监督级(S-mode)10:Hypervisor/VS级11:机器级(M-mode)
执行访问不存在的 CSR 的指令是非法的。 在没有适当特权级别的情况下访问 CSR 会引发非法指令异常, 或者引发虚拟指令异常。 写入只读寄存器会引发非法指令异常。 一个可读写的寄存器也可能包含一些只读位, 在这种情况下, 对只读位的写入将被忽略。
此外,机器模式的标准读写 CSR 0x7A0-0x7BF 保留给调试系统使用。 在这些 CSR 中, 0x7A0-0x7AF 对机器模式可访问, 而 0x7B0-0x7BF 仅对调试模式可见。 实现应在机器模式访问后一组寄存器时引发非法指令异常。
二、CSR列表
下列表中列出了当前已分配 CSR 地址的 CSR, 需要注意的是, 并非所有寄存器在所有实现中都是必需的。
下面列出了一些常用CSR
非特权级CSR地址(部分)
| 地址 | 权限 | 名称 | 描述 |
|---|---|---|---|
| 0x001 | URW | fflags | 浮点异常标志 |
| 0x002 | URW | frm | 浮点舍入模式 |
| 0x003 | URW | fcsr | 浮点控制和状态寄存器 |
| 0xC00 | URO | cycle | 周期计数器 |
| 0xC01 | URO | time | 计时器 |
| 0xC02 | URO | instret | 已执行指令计数器 |
监督级CSR地址(部分)
| 地址 | 权限 | 名称 | 描述 |
|---|---|---|---|
| 0x100 | SRW | sstatus | 监督器状态寄存器 |
| 0x104 | SRW | sie | 监督器中断使能 |
| 0x105 | SRW | stvec | 监督器陷阱向量基地址 |
| 0x140 | SRW | sscratch | 监督器临时寄存器 |
| 0x141 | SRW | sepc | 监督器异常程序计数器 |
机器级CSR地址(部分)
| 地址 | 权限 | 名称 | 描述 |
|---|---|---|---|
| 0x300 | MRW | mstatus | 机器状态寄存器 |
| 0x301 | MRW | misa | 机器ISA寄存器 |
| 0x305 | MRW | mtvec | 机器陷阱向量基地址 |
| 0x341 | MRW | mepc | 机器异常程序计数器 |
| 0x342 | MRW | mcause | 机器陷阱原因 |
三、CSR字段规范类型
文档定义了三种主要的CSR字段规范:
1. WPRI(保留位写保持值,读忽略)
保留位在写入时保持原值,读取时返回0
用于未来扩展,保证软件兼容性
2. WLRL(只写合法值,读合法值)
只能写入预定义的合法值
读取时始终返回合法值
3. WARL(写任意值,读合法值)
可以写入任意值,但读取时返回硬件接受的最近合法值
用于处理不同配置下的值约束
四、其它重要特性
1. 隐式CSR读取
某些指令会隐式读取CSR值(如陷阱处理时)
不影响显式CSR访问语义
2. CSR宽度调制
CSR宽度可能受XLEN(当前ISA宽度)影响
RV32与RV64的CSR布局可能不同
3. 跨特权级访问
高特权级别可以访问低特权级别的CSR
低特权级别访问高特权CSR会触发异常
4. 虚拟化支持
为实现高效虚拟化,部分CSR采用影子寄存器机制
只读CSR在低特权级可能在高特权级变为读/写
相关阅读:
目前RISC-V官方Ratified spec主要包括:

