Menu Close

RISC-V PLIC简介

1.中断

 

相关参考文章:

RISC-V教学教案

 

之前在RISC-V C语言编程2(3)中断及中断工程里介绍了中断的概念,这里再次复习,中断是指CPU在正常运行程序时,由于内部/外部事件引起CPU 中断当前运行的程序,而转到为内部/外部事件的服务程序中去, 当服务完毕后,又返回执行cpu的正常程序。

从mcause(machine trap cause),机器模式异常原因寄存器可以知道引起中断的理由,见图1。从图中可以看出,主要的中断种类有三种,软件中断,计时器中断和外部中断。三种中断可以在三种不同的模式下发生:用户模式,监控模式和机器模式,这里只讨论在机器模式下的中断。

mcause

图1 v1.9 特 权 架构中mcause寄存器的描述 [1]

RISC-V定义了以下的中断:

  • Software,架构定义的软件中断
  • Timer,架构定义的计时器中断
  • External,外围设备的中断,或外部中断
  • (可选的)Local,特定的外围设备中断,这里不做详细讨论

这里还有两个和处理中断相关的概念:

  • CLINT(core-local interrupt controller),本地核心中断控制器
  • PLIC(platform-level interrupt controller),平台级中断控制器
    • global interrupt(全局中断),支持所有类型,比如UART,GPIO,PWM等
    • 接收来自外围设备的中断信号,并进行仲裁,根据优先级处理这些信号
    • 这里主要介绍PLIC的设计和实现

 

2.PLIC架构设计

  • 127个外部中断源(中断ID),包括SPI,I2C,PWM等,详细见地址图(点击这里),如图2所示。

interrupt_id

图2 中断ID

  • 共有7个可由软件编写的中断优先级(periority level)

中断优先级0被预留为”永不发生中断”,中断优先级1-7为有效的中断优先级,优先级以此增加。如果在中断仲裁时有两个中断源优先级相同,先执行中断ID较小的中断源。设置中断优先级由相应寄存器的最低三位决定,如图3所示,优先级范围为0-7,7对应的优先级最高,0对应的优先级最低。

priority

图3 中断优先级设置

  • 中断ID 0被称为”没有中断”,所以实际上中断ID 1才是第一个全局中断,详情见图2,中断ID。
  • 中断悬挂位(interrupt pending bit)由4个全字节寄存器实现(4 x 32 = 128),分别对应128个中断源。第一个字节的bit 0被硬连线到0,代表不存在的中断ID 0。中断悬挂寄存器只可读(read-only)。

pending

图4 中断悬挂设置

  • 中断使能位(interrupt enable bit)同中断悬挂位类似,每一bit对应一个中断源,由4个全字节寄存器实现,为只读寄存器。

enable

图5 中断使能寄存器

  • 中断优先级阈值(priority thresholds)由7个级别组成。优先级小于或等于优先级阈值的外部中断都会被屏蔽。只使用相应寄存器的最低三位决定阈值/门限。举例:优先级阈值0允许除了0之外的所有优先级(1~7)外部中断;优先级阈值7会屏蔽所有的外部中断。

threshold

图6 中断优先级阈值/门限寄存器

  • 中断声明(interrupt claim),返回优先级最高的悬挂中断ID,如果没有任何中断悬挂,返回0。声明完成后会自动清除对应的中断悬挂位。中断声明不受到中断优先级阈值设置的干扰。注意:这里中断声明和中断完成是由同一寄存器的读写分别完成的。

complete

图7 中断声明/完成寄存器

  • 中断完成(interrupt completion),完成中断处理程序(interrupt handler)后,写入中断声明时接收到的相应中断ID。

 

3.文章参考

[1] Riscv.org, 2021. [Online]. Available: https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf. [Accessed: 22- Feb- 2021].

 

 

Posted in FPGA, RISC-V, RISC-V, RISC-V 外设, RISC-V 教案, 应用开发, 开发板, 教材与教案, 文章

发表评论

相关链接