Skip to content

PLIC Datasheet

中文说明

Overview

The plic(platform level interrupt controller) IP is a fully parameterised soft IP recording the SoC architecture and ASIC backend informations. The IP features an APB4 slave interface, fully compliant with the AMBA APB Protocol Specification v2.0.

Feature

  • Compatible with RISCV PLIC 1.0.0 standard
  • One hart target support only
  • Up to 31 external peripheral interrupt
  • 16 interrupt prority levels support
  • Rising edge and high level trigger types configuration
  • Programmable pending counter to queue edge trigger interrupt requests
  • Independent maskable and pending bit for every interrupt source
  • Static synchronous design
  • Full synthesizable

Interface

port nametypedescription
apb4interfaceapb4 slave interface
plic ->interfaceplic interface
plic.irq_iinputplic interrupt source input
plic.irq_ooutputplic interrupt output

Register

nameoffsetlengthdescription
CTRL0x04control register
TM0x44trigger mode register
PRIO10x84priority 1 register
PRIO20xC4priority 2 register
PRIO30x104priority 3 register
PRIO40x144priority 4 register
IP0x184interrupt pend register
IE0x1C4interrupt enable register
THOLD0x204interrupt threshold register
CLAIMCOMP0x244interrupt claim/complete register

Control Register

bitaccessdescription
[31:PLIC_GWP_WIDTH]nonereserved
[PLIC_GWP_WIDTH-1:1]RWTNM
[0:0]RWEN

reset value: 0x0000_0000

  • TNM: gateway max trigger number

  • EN: plic core enable

    • EN=1'b0: disable plic core
    • EN=1'b1: otherwise

Trigger Mode Register

bitaccessdescription
[31:31]RWTM31
[30:30]RWTM30
...
[1:1]RWTM1
[0:0]RWTM0

reset value: 0x0000_0000

  • TM[i]: trigger mode for irq[i]
    • TM[i]=1'b0: level trigger
    • TM[i]=1'b1: edge trigger

Priority 1 Reigster

bitaccessdescription
[31:28]RWPRIO7
...
[7:4]RWPRIO1
[3:0]RWPRIO0

reset value: 0x0000_0000

  • PRIO1[i]: trigger mode for irq[i]

Priority 2 Reigster

bitaccessdescription
[31:28]RWPRIO15
...
[7:4]RWPRIO9
[3:0]RWPRIO8

reset value: 0x0000_0000

  • PRIO1[i]: trigger mode for irq[i]

Priority 3 Reigster

bitaccessdescription
[31:28]RWPRIO23
...
[7:4]RWPRIO17
[3:0]RWPRIO16

reset value: 0x0000_0000

  • PRIO1[i]: trigger mode for irq[i]

Priority 4 Reigster

bitaccessdescription
[31:28]RWPRIO31
...
[7:4]RWPRIO25
[3:0]RWPRIO24

reset value: 0x0000_0000

  • PRIO1[i]: trigger mode for irq[i]

Interrupt Pend Reigster

bitaccessdescription
[31:31]ROIP31
...
[1:1]ROIP1
[0:0]ROIP0

reset value: 0x0000_0000

  • IP[i]: interrupt pend for irq[i]

Interrupt Enable Reigster

bitaccessdescription
[31:31]RWIE31
...
[1:1]RWIE1
[0:0]RWIE0

reset value: 0x0000_0000

  • IE[i]: interrupt enable for irq[i]

Interrupt Threshold Reigster

bitaccessdescription
[31:PLIC_IRQ_WIDTH]nonereserved
[PLIC_IRQ_WIDTH-1:0]RWTHOLD

reset value: 0x0000_0000

  • THOLD: interrupt trigger threshold

Interrupt Claim/Complete Register

bitaccessdescription
[31:PLIC_IRQ_WIDTH]nonereserved
[PLIC_IRQ_WIDTH-1:0]RWCLAIMCOMP

reset value: 0x0000_0000

  • CLAIMCOMP: interrupt claim or comp
    • read CLAIMCOMP to return interrupt irq number
    • write CLAIMCOMP to clear interrupt irq

Program Guide

These registers can be accessed by 4-byte aligned read and write. C-like pseudocode init operation:

c
plic.CTRL.TNM = TNM_bit     // set the edge trigger max number
plic.TM       = TM_32_bit   // set trigger mode for irq[31-0]
plic.PRIO1    = PRO1_32_bit // set priority for irq[7-0]
plic.PRIO2    = PRO2_32_bit // set priority for irq[15-8]
plic.PRIO3    = PRO3_32_bit // set priority for irq[23-16]
plic.PRIO4    = PRO4_32_bit // set priority for irq[31-24]
plic.THOLD    = THOLD_bit   // set the trigger threshold for target 0
plic.IE       = IE_32_bit   // set interrupt enable for irq[31-0]
plic.CTRL.EN  = 1           // enable plic core

claim/comp operation:

c
void plic_handle() {
    uint32_t id    = plic.CLAIMCOMP // get irq id
    ...                             // handle specified extern irq
    ...
    plic.CLAIMCOMP = id             // clear irq
}

Resoureces

References

Revision History

文档以中文为第一语言,并提供对应英文版本。