FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VのPlatform Level Interrupt Controller(PLIC)の構造について (2. 仕様書を読み解く)

以下のPLICのオープンソース実装を使って自作CPUに接続していたのだが、どうもメモリマップが違う気がする。 かなり古い実装なので、現在の仕様と違うのはやむなしか...

github.com

なんか結局は自分で実装しなければならないような気がしているので、一生懸命仕様書を読んでいる。

github.com

仕様書を読み漁って、なんとなく必要なレジスタ群が分かってきた。

  • Priorityレジスタ (割り込みソースの数だけ用意される)
    • 割り込みソースの優先度を指定するレジスタ。 1要素毎に4バイトの領域を確保される。優先度のサイズに応じて書き込めるレジスタの大きさは異なる。
    • 例えばSiFiveの実装だと、HARTの数に応じてPriorityの最大値が変わるようだ。
    • Priority = 0は割り込み禁止に相当する。
base + 0x000000: Reserved (interrupt source 0 does not exist)
base + 0x000004: Interrupt source 1 priority
base + 0x000008: Interrupt source 2 priority
...
base + 0x000FFC: Interrupt source 1023 priority
  • Pendingレジスタ (割り込み要求が通知され、まだCompleteしていない状態)
    • 割り込みソースの数だけ定義される。ビット列としてレジスタ定義される。つまり、32ビットレジスタで32個の割り込みソースを表現する。
base + 0x001000: Interrupt Pending bit 0-31
...
base + 0x00107C: Interrupt Pending bit 992-1023
  • Enableビット (割り込み要求許可をしたソースおよびHARTの組)
    • 各HARTにつき定義される。割り込み要求許可をしたソースをビット列として定義する。つまり、32ビットレジスタで32ビットの割り込みソースを表現する。

    • HART0向けのEnableレジスタ

base + 0x002000: Enable bits for sources 0-31 on context 0
base + 0x002004: Enable bits for sources 32-63 on context 0
...
base + 0x00207C: Enable bits for sources 992-1023 on context 0
base + 0x002080: Enable bits for sources 0-31 on context 1
base + 0x002084: Enable bits for sources 32-63 on context 1
...
base + 0x0020FC: Enable bits for sources 992-1023 on context 1
base + 0x1FFFFC: Reserved
base + 0x200000: Priority threshold for context 0
base + 0x200004: Claim/complete for context 0
base + 0x200008: Reserved
base + 0x201000: Priority threshold for context 1
base + 0x201004: Claim/complete for context 1
...