RiscV架构则定义了一些控制和状态寄存器(CSR),用于配置或记录一些运行的状态。CSR寄存器是处理器内核内部的寄存器,使用专有的12位地址编码空间,对一个hart,可以配置4k的CSR寄存器。

蜂鸟203支持以下的CSR寄存器:

类型 CSR地址 读写属性 名称 全称
riscv标准csr 0x001 MRW fflags 浮点累积异常(Floating accrued Exception)
0x002 MRW frm 浮点动态舍入模式(floating-point dynamic rounding
mode)
0x003 MRW fcsr 浮点控制和状态寄存器(floating-point control and status
register)
0x300 MRW mstatus 机器模式状态寄存器(machine status register)
0x301 MRW misa 机器模式指令集架构寄存器(machine ISA register)
0x304 MRW mie 机器模式中断使能寄存器(machine interrupt enable
register)
0x305 MRW mtvec 机器模式异常入口基地址寄存器(machine trap-vector base-address
register)
0x340 MRW mscratch 机器模式擦写寄存器(machine srcatch register)
0x341 MRW mepc 机器模式异常pc寄存器(machine exception program
counter)
0x342 MRW mcause 机器模式异常原因寄存器(machine cause register)
0x343 MRW mtval(mbadaddr) 机器模式异常值寄存器(machine trap value
register)
0x344 MRW mip 机器模式中断等待寄存器(machine interrupt pending
register)
0xb00 MRW mcycle 周期计数器的低32位(lower 32bits of cycle
counter)
0xb80 MRW mcycleh 周期计数器的高32位(upper 32bits of cycle
counter)
0xb02 MRW minstret 退休指令计数器的低32位(lower 32bits of instruction-retired
counter)
0xb82 MRW minstreth 退休指令计数器的高32位(upper 32bits of instruction-retired
counter)
0xf11 MRW mvendorid 机器模式供应商编号寄存器(machine vendor ID register),readonly,
供应商编号,如果为0,表示此寄存器未实现或不是一个商业核
0xf12 MRW marchid 机器模式架构编号寄存器(machine architecture ID
register),readonly,微架构编号,如果为0,表示未实现该寄存器
0xf13 MRO mimpid 机器模式硬件实现编号寄存器(machine implementation ID
register),readonly,硬件实现编号,如果为0,表示未实现该寄存器
0xf14 MRO mhartid hart编号寄存器(hart ID
register),readonly,hart的编号。多hart系统中,起码有一个hart编号为0
N/A MRO mtime 机器模式计时器寄存器(machine-mode timer
register)
N/A MRW mtimecmp 机器模式计数器比较寄存器(machine-mode timer compare
register)
N/A MRW msip 机器模式软件中断等待寄存器(machine-mode software interrupt pending
register)
e203自定义 0xbff MRW mcounterstop 自定义寄存器用于停止mtime, mcycle,
mcycleh,minstret,minstreth对应的计数器

常用的CSR寄存器详细介绍如下,先来看下一些概念。

Reserved Writes Preserve Values, Reads Ignore Values (WPRI)

Write/Read Only Legal Values (WLRL)

Write Any Values, Reads Legal Values (WARL)

misa

misa寄存器用于指示当前处理器所支持的架构特性。

最高两位表示当前处理器支持的架构位数,值为1表示当前为32位架构(RV32),值为2表示当前为RV64架构,值为3表示当前为128位架构(RV128)。

低26位表示当前支持的扩展指令集模块,如果支持某模块,则对应的位为1。比如E203,支持IMAC,则低26位为:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 x x x x 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1
bits 扩展指令集 描述
0 A Atomic extension
1 B Tentatively reserved for Bit-Manipulation
extension
2 C Compressed extension
3 D Double-precision floating-point
extension
4 E RV32E base ISA
5 F Single-precision floating-point
extension
6 G Additional standard extensions
present
7 H Hypervisor extension
8 I RV32I/64I/128I base ISA
9 J Tentatively reserved for Dynamically Translated
Languages extension
10 K Reserved
11 L Tentatively reserved for Decimal Floating-Point
extension
12 M Integer Multiply/Divide extension
13 N User-level interrupts supported
14 O Reserved
15 P Tentatively reserved for Packed-SIMD
extension
16 Q Quad-precision floating-point
extension
17 R Reserved
18 S Supervisor mode implemented
19 T Tentatively reserved for Transactional Memory
extension
20 U User mode implemented
21 V Tentatively reserved for Vector
extension
22 W Reserved
23 X Non-standard extensions present
24 Y Reserved
25 Z Reserved

fflags

fflags 为浮点控制状态寄存器(fcsr)中的异常标志位域的别名。

详见https://www.cnblogs.com/mikewolf2002/p/9878603.html

frm

frm寄存器为浮点控制状态寄存器中浮点舍入模式域的别名。

详见https://www.cnblogs.com/mikewolf2002/p/9878603.html

fcsr

risc-v架构规定,如果支持单精度浮点指令或者双精度浮点指令,则需要增加一个浮点控制状态寄存器。该寄存器包含了浮点异常标志位域和浮点舍入模式域。

详见https://www.cnblogs.com/mikewolf2002/p/9878603.html

mtvec

Riscv 架构规定,在处理器的程序执行过程中,一旦发生异常,则终止当前的程序流,处理器被强行跳转到一个新的PC地址。该过程在RiscV的架构中定义为trap(陷阱)。

Riscv处理器trap后跳入的PC地址由一个叫做机器模式异常入口基地址寄存器mtvec的csr寄存器指定。mtvec是一个可读可写的寄存器,软件可以编程设定它的值。

mtvec格式如下,其中低2位是mode域,高30位是base域。

xlen-1                     2 1 0
Interrupt BASE[xlen-1:2](WARL)  
xlen-2 2

假设mode的值为0,则所有的异常响应时处理器均跳转到base值指示的pc地址。

假设mode的值为1,则狭义的异常发生时候,处理器均跳转到base值指示的pc地址。狭义的中断发生时候,处理器跳转到base+4*cause值指示的pc地址。cause的值表示中断对应的异常编号(exception code)。譬如,机器计时器中断(machine timer interrupt)的异常编号为7,则跳转地址为base+4*7=base+28=base+0x1c

mcause

Riscv架构规定,进入异常时候,机器模式异常原因寄存器mcause被同时更新,以反映当前的异常种类,软件可以通过读此寄存器查询造成异常的具体原因。

mcause寄存器格式如下,其中最高位为Interrupt位,为1表示是中断,否则为异常,低31位(对于RV32)为异常编号域。

xlen-1 xlen-2                       0
Interrupt 异常编码(WLRL)
1 xlen-1

异常编号域定义了中断和异常类型,如下表所示:

是否中断 异常编码 描述
1 0  User
software interrupt
1 1  Supervisor software interrupt
1 2  Reserved for future standard use
1 3  Machine software interrupt
1 4  User
timer interrupt
1 5  Supervisor timer interrupt
1 6  Reserved for future standard use
1 7  Machine timer interrupt
1 8  User
external interrupt
1 9  Supervisor external interrupt
1 10  Reserved for future standard use
1 11  Machine external interrupt
1  12–15  Reserved for future standard use
1  ≥16  Reserved for platform use
0 0  Instruction address misaligned
0 1  Instruction access fault
0 2  Illegal instruction
0 3  Breakpoint
0 4  Load
address misaligned
0 5  Load
access fault
0 6  Store/AMO address misaligned
0 7  Store/AMO access fault
0 8  Environment call from U-mode
0 9  Environment call from S-mode
0 10  Reserved
0 11  Environment call from M-mode
0 12  Instruction page fault
0 13  Load
page fault
0 14  Reserved for future standard use
0 15  Store/AMO page fault
0  16–23  Reserved for future standard use
0  24–31  Reserved for custom use
0  32–47  Reserved for future standard use
0  48–63  Reserved for custom use
0  ≥64  Reserved for future standard use

mepc

mepc是xlen位的读写寄存器,mepc[0]总是等于0,如果IALIGN=32,则mepc[1:0]总是等于0。

xlen-1                         0
mepc
xlen

Riscv架构定义异常的返回地址由机器模式异常PC寄存器mepc保存。在进入异常时候,硬件将自动更新mepc寄存器的值为当前遇到异常的指令PC值(即当前程序的停止执行点)。该寄存器的值将作为异常的返回地址,在异常结束后,能够使用它保存的pc值返回之前停止执行的程序点。注意:mepc虽然被自动更新,但它是可读可写的,软件可以直接读写该寄存器的值。

对于狭义的中断和狭义的异常而言,RiscV架构定义其返回地址,稍有差异。

  • 出现中断时候,中断返回地址mepc的值被更新为下一条尚未执行的指令。
  • 出现异常时候,中断返回地址mepc的值被更新为当前发生异常的指令pc。注意:如果异常是有ecall和ebreak产生,由于mepc的值被更新为ecall或者ebreak指令自己的PC。因此,在异常返回时候,如果直接使用mepc保存的pc值作为返回地址,则会再次进入异常,形成死循环。正确的做法是在异常处理程序中软件改变mepc指向下一条指令,由于现在ecall/ebreak(c.ebreak)是4字节(2字节)指令,因此更改设定mepc=mepc+4(或+2)即可。

mtval(mbadaddr)

mtval是一个读写寄存器,它的格式如下:

mtval xlen-1                         0
mtval
xlen

Riscv规定,在进入异常时候,硬件将自动更新机器模式异常值寄存器mtval,以反映引起当前异常的存储器访问地址或者指令编码。

  • 如果是由访问存储器造成的异常,比如硬件断点,取指令,存储器读写造成的异常,则将存储器访问的地址更新到mtval。
  • 如果是由非法指令造成的异常,则将该指令的指令编码更新到mtval寄存器中。

mstatus

mstatus是机器模式下的状态寄存器。在E203中我们仅关注SD,XS,FS,MPP,MPIE,MIE。

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SD WPRI TSR TW TVM MXR SUM MPRV XS[1] XS[0] FS[1] FS[0] MPP[1] MPP[0] WPRI SPP MPIE WPRI SPIE UPIE MIE WPRI SIE UIE
  1. MIE域表示全局中断使能。当该MIE域值为1时,表示所有中断的全局开关打开,当MIE域的值为0时候,表示全局关闭所有中断。
  2. MPIE用于保存进入异常之前MIE域的值。
  3. XS作用于FS域类似,用于维护和反映用户自定义的扩展指令单元状态,标准riscv架构中,XS域是只读的,在e200中,将XS域设计为可读可写,用它来打开和关闭协处理器。
  4. SD域是一个只读域,其反映了XS域或者FS域处于脏(dirty)状态,其逻辑关系表达式为:SD=((FS==11) or (XS==11))
  5. MPP用于保存进入异常之前特权模式的值。处理器进入异常时候:MPIE域的值被更新为MIE的值。MIE的值被更新为0(意味着进入异常,中断被屏蔽)。MPP的值被更新为异常发生前的模式(如果只实现机器模式,则MPP的值永远为11)。
  6. FS域用于维护和反映浮点单元的状态,编码如下:
Status  FS
Meaning XS
 Meaning
0  Off  All off
1  Initial  None
dirty or clean,some on
2  Clean None dirty, some clean
3  Dirty Some dirty

FS域的更新准则如下:FS上电后默认值为0,意味着浮点单元的状态为off。因此为了能够正常使用浮点单元,软件需要使用CSR写指令将FS的值改写为非0值,以打开浮点单元的功能。如果FS的值为1或2,当执行了任何的浮点指令之后,FS的值都会自动切换到3,表示浮点单元的状态为脏(dirty)(状态发生了改变 ) 。如果处理器不想使用浮点运算单元,可以使用csr写指令将mstatus寄存器的FS域设置为0,从而关闭浮点单元的功能。当浮点单元功能关闭后,任何访问浮点csr或者执行浮点指令的行为都会除法非法指令异常。

Riscv架构规定,进入异常时候,硬件自动更新机器模式状态寄存器mstatus中的某些域。MPIE的值被更新为异常发生前MIE域的值。MPIE的作用是在异常结束后,能够使用MPIE的值恢复出异常发生之前的MIE值。MIE的值被更新为0,意味着进入异常服务程序后,中断被全局关闭,所有的中断不被响应。MPP的值被更新为异常发生前的模式(如果只实现机器模式,则MPP的值永远为11),MPP域的作用是在异常结束后,能够恢复到之前的工作模式。

当异常程序处理完成后,最终要从异常服务程序中退出,并返回主程序。riscv中定义了一组退出指令mret,sret,和uret,对于机器模式,对应mret。

在机器模式下退出异常时候,软件必须使用mret。riscv架构规定,处理器执行完mret指令后,硬件行为如下:

  • 停止执行当前程序流,转而从csr寄存器mepc定义的pc地址开始执行。
  • 执行mret指令不仅会让处理器跳转到上述的pc地址开始执行,还会让硬件同时更新csr寄存器机器模式状态寄存器mstatus。mstatus寄存器MIE域被更新为当前MPIE的值。MPIE 域的值则更新为1。

mie/mip

Riscv架构中定义的中断类型分为4种。

  • 外部中断
  • 计时器中断
  • 软件中断
  • 调试中断

外部中断是指来自于处理器核外部的中断,比如uart,gpio等产生的中断。

Riscv架构上定义的异常是不可屏蔽的,但狭义上的中断是可以屏蔽的,通过设置mie寄存器来屏蔽中断。mip寄存器用于查询中断的等待状态,软件可以通过读mip寄存器达到查询中断状态的结果。

机器模式下外部中断的屏蔽由csr寄存器mie中MEIE域控制,等待标志(pending)则反映在csr寄存器mip的MEIP域。mip和mie寄存器的高20位可以用于扩展其它的自定义中断类型。

机器模式下定时器中断的屏蔽由mie中的MTIE域控制,等待标志(pending)则反映在csr寄存器mip的MTIP域。

机器模式下软件中断的屏蔽由mie中的MSIE域控制,等待标志(pending)则反映在csr寄存器mip的MSIP域。

mip xlen-1 11 10 9 8 7 6 5 4 3 2 1 0
WPRI MEIP WPRI SEIP UEIP MTIP WPRI STIP UTIP MSIP WPRI SSIP USIP
xlen-12 1 1 1 1 1 1 1 1 1 1 1 1
mie xlen-1 11 10 9 8 7 6 5 4 3 2 1 0
WPRI MEIE WPRI SEIE UEIE MTIE WPRI STIE UTIE MSIE WPRI SSIE USIE
xlen-12 1 1 1 1 1 1 1 1 1 1 1 1

机器模式外部中断可以作为处理器核的一个单比特输入信号,如果处理器要支持多个外部中断,可以采用平台级别的中断控制器(PLIC),可以用于多个外部中断源的优先级仲裁和派发。

mscratch

mscratch寄存器用于机器模式下的程序临时保存某些数据。mscratch寄存器可以提供一种快速的保存、恢复机制。比如,在进入机器模式的异常处理程序后,将应用程序的某个通用寄存器的值临时存入mscratch寄存器中,然后在退出异常处理程序之前,将mscratch寄存器中的值读出恢复至通用寄存器。

mcycle和mcycleh

riscv架构定义了一个64位的时钟周期计数器,用于反映处理器成功执行了多少个时钟周期。只要处理器处于执行状态,此计数器便会自增计数,其自增的频率由处理器硬件实现自定义。

mcycle寄存器反映了该计数器低32位的值,mcycleh寄存器反映了该计数器高32位的值

minstret和minstreth

riscv架构定义了一个64位的执行指令计数器,用于反映处理器成功执行了多少条指令。只要处理器每成功执行一条指令,此计数器便会自增计数。

minstret寄存器反映了该计数器低32位的值,minstreth寄存器反映了该计数器高32位的值。

mtime/mtimecmp/msip

Riscv架构定义了系统平台中必须有一个计时器,并给该计时器定义了两个64位宽的寄存器mtime和mtimecmp。mtime寄存器用于反应当前计数器的计数值,mtimecmp用于设置计数器的比较值。当mtime中的计数值大于或者等于mtimecmp中设置的比较值时,计时器便会产生计时器中断。计时器中断会一直拉高,直到软件重写mtimecmp寄存器的值,使得其大于mtime中的值,从而清除计时器中断。

Riscv架构并没有定义mtime和mtimecmp寄存器为csr寄存器,而定义其为存储器地址映射的系统寄存器。具体的存储器映射,riscv并没有规定,而是交于soc系统集成者实现。

riscv架构定义的mtime定时器为实时计时器,系统必须以一种恒定的频率作为计时器的时钟。该恒定的时钟频率必须为低速的电源常开的时钟。低速是为了省电,常开是为了提供准确的及时。

counterstop

counterstop是蜂鸟自定义csr寄存器。用于控制mtime,mcycle,minstreth,mtimeh,mcycleh,minstreth的运行和停止,以便节省功耗。

xlen-1                   2 1 0
reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved instret timer cycle
reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved 1 1 1

0/1/2 三位如果为1,则相应计数器停止工作,如果为0,则开始工作,上电默认值为0.

E203 CSR寄存器的更多相关文章

  1. E203 CSR rtl实现分析

    CSR状态控制寄存器,每个hart都有自己的CSR.对于每个hart,可以配置的状态寄存器是4k.CSR寄存器的功能见:https://www.cnblogs.com/mikewolf2002/p/1 ...

  2. SD/MMC相关寄存器的介绍

    1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前,我们先来看看SD卡的内部架构是怎么样的,如下图所示: 2.SD/MMC相关寄存器的介绍 从上图中总结出:SD卡内部有7个寄存器. 一.OCR,CI ...

  3. RISCV 入门 (学习笔记)

    文章目录 1. risv 相关背景 1.1 arm 授权费 1.2 riscv 发展历史 1.3 riscv 风险 2. 指令集 2.1 可配置的通用寄存器组 2.2 规整的指令编码 2.3 简洁的存 ...

  4. exynos 4412 eMMC配置及使用方法

    /** ****************************************************************************** * @author    Maox ...

  5. Cortex-M0系统滴答定时器Systick详解

    上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...

  6. PSAM读卡芯片TDA8007BHL开发

    WWT:Work Waiting Time ATR:Answer To Reset,复位应答 etu =F/Df 1.     PSAM概述和应用 PSAM(PurchaseSecure Access ...

  7. [置顶] 自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

    花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别. 代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看 在<自娱自乐1&g ...

  8. 2.5 非透明PCI桥

    PCI桥规范定义了透明桥的实现规则,本篇在第2.3.1节中详细介绍了这种桥片.通过透明桥,处理器系统可以以HOST主桥为根节点,建立一颗PCI总线树,在这个树上的PCI设备共享同一个PCI总线域上的地 ...

  9. 【高速接口-RapidIO】4、Xilinx RapidIO核详解

    一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconnect Specification rev2.2,它支持1x,2x和4x三种模式,每通道的速度支持1.25G ...

随机推荐

  1. SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门

    1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...

  2. [Spring]:java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'

    错误信息 11月 05, 2019 9:32:15 下午 org.springframework.test.context.TestContextManager prepareTestInstance ...

  3. 松软科技web课堂:JavaScript 事件

    HTML 事件是发生在 HTML 元素上的“事情”. 当在 HTML 页面中使用 JavaScript 时,JavaScript 能够“应对”这些事件. HTML 事件 HTML 事件可以是浏览器或用 ...

  4. bay——巡检RAC日志.txt

    -查找超过800M大小文件,并显示查找出来文件的具体大小,可以使用下面命令 find . -type f -size +400M -print0 | xargs -0 du -h --查看当前目录下每 ...

  5. Shell—常见报错问题

    bash:$'\r': command not found 造成这个问题的原因是Windows环境下换行的“\r”到了Linux环境下不能够识别了,因为Linux环境下默认的换行符为“\n”,我们只需 ...

  6. MarkDown使用小技巧

    写作目的 笔者看完一些MarkDown入门文字后,发现很多文档对一些容易遇到的细微问题缺少解释.本文意欲稍作补充. 目标读者 使用MarkDown仅为了排版出更好看的文章,而不关注技术细节,不懂HTM ...

  7. 【转载】C++:switch红色下划线,Error:控制传输跳过的实例化解决办法

    转载链接:https://blog.csdn.net/figoleon/article/details/50072029

  8. 【心得】Lattice EPC3 PCS使用经验

    [博客导航] [导航]FPGA相关 一.目的 将使用过程中遇到的问题随时记录,共享经验心得. 二.心得随笔 1.仿真脚本 为避免生成PCS IP之后,仿真时忘记添加参数文件,可以在仿真脚本中添加以下代 ...

  9. 第05组 Beta冲刺(4/4)

    第05组 Beta冲刺(4/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  10. go 创建自己的区块

    package main import ( "time" "crypto/sha256" "bytes" ) //区块体 type Bloc ...