tinyriscv-csr和clint

目录

目录

目录

CSR寄存器模块

八个控制状态寄存器(csr):

ex模块读(组合逻辑)写(时序逻辑):

clint模块读(组合逻辑)写(时序逻辑)操作:

clint中断仲裁控制模块

5个写csr寄存器状态定义

 4个写csr寄存器状态定义

同步中断(异常),异步中断

整体流程




CSR寄存器模块

八个控制状态寄存器(csr):

1.  mtvec Machine Trap Vector 它保存发生异常时处理器需要跳转到的地址。
         Riscv 架构规定,在处理器的程序执行过程当中,一旦发生异常,则终止当前的程序流,处理器被强行跳转到一个新的PC地址。该过程在RiscV的架构中定义为trap(陷阱)。
        Riscv处理器trap后跳入的PC地址由一个叫作(机器模式异常入口基地址寄存器mtvec)的csr寄存器指定。mtvec是一个可读可写的寄存器,软件能够编程设定它的值。mtvec格式以下,其中低2位是mode域,高30位是base域。

        假设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*
2.  mepc( Machine Exception PC 它指向发生异常的指令。

        Riscv架构定义异常的返回地址由机器模式异常CSR寄存器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)便可.

3.  mcause(Machine Exception Cause 它指示发生异常的种类。

        Riscv架构规定,进入异常时候,机器模式异常缘由寄存器mcause被同时更新,以反映当前的异常种类,软件能够经过读此寄存器查询形成异常的具体缘由。

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

4.  mie( Machine Interrupt Enable )它指出处理器目前能处理和必须忽略的中断。
5.  mip Machine Interrupt Pending )它列出目前正准备处理的中断。
6.  mtval Machine Trap Value )它保存了陷入( trap )的附加信息:地址例外中出错 的地址、发生非法指令例外的指令本身,对于其他异常,它的值为 0
7.  mscratch Machine Scratch )它暂时存放一个字大小的数据。
8.  mstatus Machine Status )它保存全局中断使能,以及许多其他的状态。

9.  mcycle和mcycleh(Machine Cycle)riscv架构定义了一个64位的时钟周期计数器,用于反映处理器成功执行了多少个时钟周期。只要处理器处于执行状态,此计数器便会自增计数,其自增的频率由处理器硬件实现自定义。mcycle寄存器反映了该计数器低32位的值,mcycleh寄存器反映了该计数器高32位的值


ex模块读(组合逻辑)写(时序逻辑):

判断为scr寄存器操作指令时,对应读写scr寄存器。


clint模块读(组合逻辑)写(时序逻辑)操作:

异常发生时:

        1.  异常指令的 PC 被保存在 mepc 中, PC 被设置为 mtvec 对于同步异常, mepc 指向导致异常的指令;对于中断,它指向中断处理后应该恢复执行的位置。)
        2.  根据异常来源设置 mcause(如图 10.3 所示),并将 mtval 设置为出错的地址或 者其它适用于特定异常的信息字。
        3.  把控制状态寄存器 mstatus 中的 MIE(mstatus[3]) 位置零以禁用中断,并把先前的 MIE(mstatus[3]) 值保 留到 MPIE(mstatus[7])中。
        

clint中断仲裁控制模块

5个写csr寄存器状态定义

S_CSR_IDLE                                                       
S_CSR_MSTATUS                                      写mstatus
S_CSR_MEPC                                             
S_CSR_MSTATUS_MRET                          写mstatus(中断返回时修改MIE为MPIE)
S_CSR_MCAUSE      

        


 4个写csr寄存器状态定义

S_INT_IDLE                                                                   
S_INT_MRET                                                   中断返回           
S_INT_SYNC_ASSERT                                   同步中断
S_INT_ASYNC_ASSERT                                 异步中断

同步中断(异常),异步中断

同步中断:是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。而中断则是由于系统中某事件引起的,该事件与现行指令无关。

异步中断: 是指由于外部设备事件所引起的中断,如通常的定时器中断等;

整体流程

int_state中断状态 组合逻辑   :                                                                                                         

当中断发生时判断是同步异步还是中断返回,修改成对应标志。

csr_state CSR状态控制时序逻辑  :

1.IDLE:在发生同步中断或异步中断时csr_state 由IDLE修改为MEPC同时修改inst_addr(中断返回时的地址)和cause(中断原因),若如果中断标志时中断返回则修改为MSTATUS_MRET

2.MEPC:将mepc寄存器修改为inst_addr,MEPC修改成MSTATUS

3.MSTATUS:MIE全局中断关闭,MSTATUS修改MCAUSE

4.MCAUSE:将mcause寄存器修改为cause,MCAUSE修改成IDLE,发出中断进入信号int_assert_o,中断地址修改为csr_mtvec(新的pc地址),在ex中判断中断发生后将jump_addr_o修改为csr_mtvec(组合逻辑)最终给pc。

5.MSTATUS_MRET:MIE赋值为MPIE,MSTATUS_MRET修改成IDLE,   发出中断进入信号int_assert_o,中断地址修改为csr_mepc(中断返回地址),在ex中判断中断发生后将jump_addr_o修改为csr_mepc(组合逻辑)最终给pc。     

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值