PLIC介绍:《手把手教你设计CPU——RISC-V处理器篇》第13章,附录C
PLIC chisel代码:Rocketchip代码,https://github.com/chipsalliance/rocket-chip/blob/master/src/main/scala/devices/tilelink/Plic.scala
Verilog代码:https://github.com/SI-RISCV/e200_opensource/blob/master/rtl/e203/perips/sirv_plic_man.v
PLIC应用:sifive U540 https://static.dev.sifive.com/FU540-C000-v1.0.pdf
蜂鸟e200 https://github.com/SI-RISCV/e200_opensource
文中参考蜂鸟e200 相关资料 ,如有错误之处还请不吝赐教!
RISC-V的PLIC中断控制器,在蜂鸟平台下实现如下图:
在SIfive平台下定义的中断控制器如下图所示:
其中都使用了通用的PLIC中断控制器。
下面讲介绍PLIC中断控制器的总体框架。
1、PLIC中断源
PLIC理论支持多个任意中断源,每个中断源可以是不同触发类型,电平触发或者边沿触发、PLIC为每个中断源分配了
- 闸口和IP
- 编号(ID)
- 优先级(priority)
- 使能(Enable)
1.1 PLIC中断源之闸口(Gateway)和IP
- 闸口将不同出发类型的外部中断传换成统一的内部中断请求
- 对于每个中断而言,闸口保证只发送一个中断请求,中断请求经过闸口发送后,硬件自动将对应的IP寄存器置高。
- 闸口发送一个中断请求后则启动屏蔽,如果此中断没有被处理完成,则后续的中断将会被闸口屏蔽。
1.2 PLIC中断源之编号
PLIC为每个中断源分配了一个独一无二的编号(ID)。ID编号0被预留,作为表示“不存在的中断”,因此有效的中断ID从1开始。
譬如,假设某个PLIC的硬件实现支持1024个ID,则ID应为0-1023,其中,除了0被预留表示“不存在的中断之外”,编号1~1023对应的中断源接口信号线可以用于连接有效的外部中断源。
1.3 PLCI中断源之优先级(Prioity)
PLIC的每个中断源均可以设定特定的优先级,其要点如下:
- 每个中断源的优先级寄存器应该是存储器地址映射的可读可写寄存器,从而使得软件可以对其编程配置不同的优先级。
- PLIC架构理论上可以支持任意多个优先级,硬件实现时可以选择具体的优先级个数。譬如,假设硬件实时选择优先级寄存器的有效位位3位,则其可以支持的优先级个数位0~7这8个优先级。
- 优先级的数字越大,表示优先级越高
- 优先级0意味着“不可能中断”,相当于中断源屏蔽。
1.4 PLIC中断源之中断使能(Enable)
每个中断目标的中断源均分配了一个中断使能寄存器,其要点如下。
IE寄存器应该是寄存器地址映射的可读可写寄存器,从而使得软件对其编程
- 如果IE寄存器被配置为0,则意味着此中断源对应中断目标被屏蔽
- 如果IE寄存器被配置为1,则意味着此中断源对应中断目标被打开。