手把手教你设计CPU-2

中断和异常

中断和异常最大区别在于中断往往时一种外因,而异常是由处理器内部事件或程序执行中的事件引起的,譬如本身硬件故障、程序故常。
中断和异常是狭义的划分,广义的异常,通常分为同步异常和异步异常。
RISC-V中断有机器模式、用户模式、监督模式。蜂鸟R200只实现了机器模式。

进入异常时,RISC-V架构规定的硬件行为可以简述如下。
(1)停止执行当前程序流,转而从CSR寄存器mtvec定义的PC地址开始执行。
(2)进入异常不仅会让处理器跳转到上述的PC地址开始执行,还会让硬件同时更新其他几个CSR寄存器,分别时以下4个
•机器模式异常原因寄存器mcause(Machine Cause Register)
•机器模式异常PC寄存器mepc(Machine Exception Program Counter)
•机器模式异常值寄存器mtval(Machine Trap Value Register)
•机器模式状态寄存器matatus(Machine Status Register)
1、从mtvec(Machine Trap-Vector Base-Address Register)定义的PC地址开始执行
遇到异常,强行跳转到一个新的PC地址。pc地址由一个叫做机器模式异常入口基地址寄存器mtevc的CSR寄存器指定。
(1)mtevc寄存器时一个可读可写的CSR寄存器,因此软件可以变成更改其中的值。
(2)mtevc寄存器的详细格式,低2bit时MODE域,高30bit时BASE域。
•假设MODE=0,跳转到BASE值指示的PC地址。
•假设MODE=1,异常发生时,跳转到BASE值指示的PC地址。中断发生时,跳转到地址为BASE+4*CAUSE值指示的地址,CAUSE的值表示中断对应的异常编号。

2、更新CSR寄存器mcause
RISC-V架构规定,进入异常时,机器模式异常原因寄存器mcause被同时更新,以反映当前的异常种类。
最高1bit为Interupt域,低31bit为异常编号域,用于指示RISC-V架构定义的12中中断类型和16种异常类型。

3、更新CSR寄存器mepc
RISC-V架构定义异常的返回地址由机器模式异常PC寄存器mepc保存。
(1)值得注意的是,虽然mepc寄存器会在异常发生自动被硬件更新,但是mepc寄存器本身也是一个可读可写的寄存器,因此软件也可以直接写高寄存器以修改其值。
(2)对于狭义的中断和狭义的异常而言,RISC-V返回地址由细微差别
•出现中断时,中断返回地址mepc的值被更新为下一条尚未执行的指令。
•出现异常时,中断返回地址mepc的值被更新为挡圈发生异常的指令PC。注意:如果异常由ecall或ebreak产生,由于mepc的值被更新为ecall或ebreak指令自己的PC。因此在异常返回时,如果直接使用 mepc 保存的 PC 值作为返回地址,则会再次
跳回 ecall 或者 ebreak 指令,从而造成死循环(执行 ecall 或者 ebreak 指令导致重新进入异常)。正确的做法是在异常处理程序中软件改变 mepc 指向下一条指令,由于现在 ecall/ebreak C 或 c.ebreak )是 4 c 或 2 ) 字节指令,因此改写设定 mepc=mepc+4(或+2 )即可 。

4、更新CSR寄存器mtval
RISC-V架构规定,在进入异常时,硬件将自动更新机器模式异常值寄存器mtval,以反映引起当前异常的存储器访问地址或者指令编码。
• 如果是由存储器访问造成的异常,譬如遭遇硬件断点、取指令、存储器读写造成的异常, 则将存储器访问的地址更新到 mtval 寄存器中 。
• 如果是由非法指令造成的异常,则将该指令的指令编码更新到 mtval 寄存器中。

5、更新CSR寄存器mstatus
RISC-V架构规定,在进入异常时,硬件将自动更新机器模式状态寄存器的某些域。
机器模式只用支持MIE、MPIE、MPP(2’b11) P245

退出异常
RISC-V定义了一组专门退出异常指令,包括MRET、SRET、URET,机器模式只需要支持MRET。
机器模式退出异常时,软件必须使用MRET指令,处理器执行MRET指令后的硬件行为如下。
•停止执行当前程序流,转而从CSR寄存器mepc定义的PC地址开始执行
•执行MRET指令不仅会让处理器跳转到上述的PC地址开始执行,还会让硬件同时更新CSR寄存器机器模式状态寄存器mstatus。P246
具体如下:
1、从mepc定义的PC地址开始执行
进入异常时·, mepc 寄存器被同时更新,以反映当时遇到异常的指令的 PC 值。通过这个机制,意味着MRET 指令执行后处理器回到了当时遇到异常的指令的 PC 地址,从而可以继续执行之前被中止的程序流 。
2、更新CSR寄存器mstatus
RISC-V 架构规定,执行MRET指令退出异常时有如下情况。
• mstatus 寄存器MIE域的值被更新为当前 MPIE 的值。
• mstatus 寄存器 MPIE 域的值则被更新为 1。

RISC-V架构中断定义
RISC-V架构定义的中断类型分为4种
•外部中断(External Interrupt),来自处理器外部的中断,譬如UART、GPIO。
•计时器中断(Timer Interrupt)
•软件中断(Software Interrupt)
•调试中断(Debug Interrupt)

3、软件中断
软件定义的中断,msip寄存器,注意此寄存器和mip寄存器中的MSIP域命名不可混淆。

4、调试中断
此中断专用于实现调试器。

中断屏蔽
RISC-V架构规定狭义上的异常是不可以屏蔽的。但狭义上的中断则可以被屏蔽掉,定义了CSR寄存器机器模式中断使能寄存器mie(Machine Interrupt Enable Register)可以用于中断的屏蔽。
在这里插入图片描述

(1)分为MEIE,MTIE,MSIE屏蔽外部、计时器、软件下的中断屏蔽
(2)蜂鸟E200只实现机器模式 ,不关注 (CSEIE、 UEIE 、 STIE 、 UTIE 、 SSIE 和 USIE )

中断等待
查询中断寄存器的等待状态。
(1)分为MEIP,MTIP,MSIP屏蔽外部、计时器、软件下的中断屏蔽
(2)蜂鸟E200只实现机器模式 ,不关注 (SEIP 、 UEIP, STIP 、 UTIP, SSIP 和 USIP )
(3)若果某bit为1,表示当前有计时器中断正在等待pending。即便mie寄存器中的MTIE为0(被屏蔽)
(4)MEIP/MTIP/MSIP域的属性均为只读,软件无法直接写这些域改变其值。

中断与中断优先级
优先级EI > SI > TI

中断嵌套
• 进入异常之后, mstatus 寄存器中的MIE域将会被硬件自动更新成为 0 (意味着中断被全局关闭,从而无法响应新的中断)。
• 退出中断后,MIE域才被硬件自动恢复成中断发生之前的值(通过 MPIE 域得到),从而再次全局打开中断。
由上可见,一旦响应中断进入异常模式后,中断被全局关闭再也无法响应新的中断,因此 RlSC-V 架构定义的硬件机制默认无法支持硬件中断嵌套行为 。
如果一定要支持中断嵌套,需要使用软件的方式达到中断嵌套的目的,从理论上来讲,可采用如下方法 。
(1)进入异常后,软件通过查询mcause寄存器确认这是相应中断造成的异常,并跳入相应的中断服务器中,在这期间,由于mstatus 寄存器中的MIE域被硬件自动更新成为 0,因此新的中断都不会被响应 。
(2 )待程序跳入中断服务程序中后,软件可以强行改写 mstatus寄存器的值,而将阳E域的值改为 1 , 意味着将中断再次全局打开。从此时起,处理器将能够再次响应中断。但是在强行打开 MIE 域之前,需要注意如下事项。
• 假设软件希望屏敲比其优先级低的中断,而仅允许优先级比它高的新来打断当前中断,那么软件需要通过配置 mie 寄存器中的 MEIE/MTIE/MSIE 域,来有选择地屏蔽不同类型的中断 。
• 对于 PLIC 管理的众多外部中断而言,由于其优先级受 PLIC 控制,假设软件希望屏蔽比其优先级低的中断,而仅允许优先级比它高的新来中断打断当前中断,那么软件需要通过配置 PLIC 阈值( Threshold)寄存器的方式来有选择地屏蔽不同类型的中断。
(3 )在中断嵌套的过程中,软件需要注意保存上下文至存储器堆栈中,或者从存储器堆栈中将上下文恢复(与函数嵌套同理),
(4 )在中断嵌套的过程中,软件还需要注意将 mepc 寄存器,以及为了实现软件中断嵌套被修改的其他 CSR 寄存器的值保存至存储器堆枝中,或者从存储器堆核中恢复(与函数嵌套同理) 。
除此之外, RlSC-V 架构也允许用户实现自定义的中断控制器实现硬件中断嵌套功能。

在这里插入图片描述
异常处理的硬件实现
蜂鸟E200支持的中断和异常总结如表
在这里插入图片描述
在这里插入图片描述
蜂鸟E200处理器对于mepc处理
• 对于同步异常,mepc值更新为当前发生异常的指令PC值
• 对于精确异步异常(即中断),mepc值更新为下一条尚未执行的指令PC值
• 对于非精确异步异常,mepc值更新为当前发生异常的指令PC值
• 蜂鸟E200处理器核实现中同步异常,精确异步异常以及非精确异步异常如下表
在这里插入图片描述
在这里插入图片描述
CLINT:软件中断,计时器中断
PLIC:接收多个外部中断后将其仲裁后生成一根外部中断信号
调试模式:生成一根调试中断
所有中断信号均有蜂鸟E200处理器核的交付模块进行处理
在这里插入图片描述
CLINT称为处理器核局部中断控制器(Core Local Interrupts Controller),是一个存储器地址映射的模块
在这里插入图片描述

PLIC称为平台级别中断控制器(Platform Level Interrupt Controller),主要用于多个外部中断源的优先级仲裁和派发。
PLIC是一个存储区地址映射模块,挂载在处理器核为其实现的专用总线接口上。
在这里插入图片描述
在这里插入图片描述
PLIC在SOC中连接了GPIO、UART、PWM等多个外部中断源,分配如下表
在这里插入图片描述
在这里插入图片描述
蜂鸟E200处理器交付模块对中断和异常的处理
1、异常处理
• 交付模块接收来自ALU的交付请求,对于每一条ALU执行的指令,可能发生异常。如果没有发生异常,则该指令顺利执行;如果发生了异常,则会造成流水线冲刷。ALU指令造成的异常均为同步异常,同步异常均来自ALU模块。因此mepc寄存器中更新的PC值即为当前正在交付指令(来自于ALU接口)的PC
• 交付模块接收来自长指令写回时的交付请求,每一条长指令可能发生异常。如果没有发生异常,则该指令顺利交付;如果发生了异常,则会造成流水线冲刷。长指令写回的异常均为非精确异步异常。即mepc寄存器中更新的PC值为此指令的PC。
2、中断的处理
• 交付模块接收来自CLINT和PLIC的3根中断信号的请求。mepc寄存器更新的PC值为下一条待交付的指令(来自于ALU接口)的PC
• 当异步异常和ALU造成的同步异常以及中断同时发生时,优先级一次为:长指令造成的异步异常优先级最高,中断造成的异步异常其次,ALU造成的同步异常最后。
• 异常一旦发生,便会冲刷流水线,将后续的指令取消掉,并向IFU模块发送冲刷请求和重新取指令的PC,用以重新从新的PC地址开始取指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值