FPGA開発日記

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

RISC-VのPLIC(Platform-Level Interrupt Controller)について

RISC-VのPLIC(Platform-Level Interrupt Controller)について調査している。 以下はRISC-V Privileged Architecture Manualからの抜粋。

Draft Privileged ISA Specification v1.10 - RISC-V Foundation

プラットフォームレベル割り込みコントローラ (PLIC)

7.1 PLIC概要

図7.1に、PLICの簡単な構造を示す。 PLICの主な役割は、I/Oデバイスとして接続されている「グローバル割り込みソース」から、「割り込みターゲット(通常はHARTコンテキスト)」に接続する役割を担う。

複数の割り込みソースからの割り込み通知を、「割り込みゲートウェイ」により制御して単一の「割り込みリクエスト」として出力する。 PLICコアには、各ターゲットに対して選択する割り込みを制御するためのIE(割り込みイネーブル)の組み合わせ表が存在している。 もしターゲットが割り込みイネーブルペンディングしているならば、「割り込み通知」をターゲットに対して送信する。 ターゲットが外部割り込みを受領すると、「割り込みの獲得(interrupt claim)」信号が通知され、該当する割り込みのペンディングbitが解除される。 ターゲットが割り込み処理を完了すると、関連する割り込みゲートウェイに「割り込み処理完了(interrupt completion)」メッセージが送信され、次に別の割り込みリクエストが受信できるようになる。

f:id:msyksphinz:20171209191655p:plain

7.2 割り込みソース

RISC-VのHARTはローカル割り込みとグローバル割り込みを持っている。 このうち、グローバル割り込みだけがPLICで処理される。

ローカル割り込みソース

ローカル割り込みはPLICで処理されず、標準的なソフトウェア割り込みやタイマ割り込みなどが実行される。 ローカル割り込みはグローバル割り込みに比べて応答速度が速く、割り込み要因もmcauseレジスタを通じてすぐに参照することが出来る。

ローカル割り込みはレベルベースであり、対応する割り込み要因のmipビットが設定されると、ペンディングされる。 割り込みハンドラから戻ってきたときに、もう一度同じ割り込みを受け付けないようにするために、割り込みハンドラがハードウェアの通知条件ビットをクリアする必要がある。

標準搭載していないローカル割り込みソースは、マシンモードにてmip/mieレジスタを参照することで確認できる。

グローバル割り込みソース

グローバル割り込みソースはPLICにて処理される。 プラットフォーム独自のPLICの実装に依存するが、どのようなグローバル割り込みソースも、どのようなHARTのコンテキストにも転送される必要がある。

グローバル割り込みソースは様々な形で受け付けることが出来る。 例えば、レベルトリガ方式やエッジトリガ方式、メッセージシグナル方式で受け取ることが出来る。 いくつかのソースはキューを設置し、複数の割り込みリクエストを受理することが出来る。 全てのグローバル割り込みソースは、PLIC内部で処理するために、共通の割り込みリクエストフォーマットに変換される。

7.3 割り込みターゲットとHARTコンテキスト

割り込みターゲットは、通常はHARTコンテキストであり、HARTは権限モードを持っている。 全てのコンテキストが割り込みを受け取る必要はなく、もしプロセッサが割り込みを譲渡する機能を持っていなければ、低い権限のコンテキストは割り込みを受け付ける機能を持つ必要はない。 PLICによる割り込みの発生はmip/sip/uieレジスタmeip/seip/ueipビットに通知される。

各プロセッサコアは割り込みの受付に関するポリシを決定する必要がある。 簡単な例では、ひとつのHARTコンテキストしか動いていない場合は、もっとも高い優先度の高いコンテキストが割り込みハンドラを実行する。 マルチスレッドのようなプロセッサでは複数のスレッドが独立に動いているため、ぷろえっさはHARTコンテキストのうちどれが割り込みの処理に使用されるかを示さなければならない。

PLICはそれぞれの割り込みターゲットを独立に扱い、複数の割り込みターゲットに対する優先度のスキームを考慮しない。 PLICは割り込みのプリエンプションもしくは割り込みのネストのような仕組みについて、考慮することはない。

7.5 割り込みID

グローバル割り込みのソースには、符号無し整数の値が割り当てられる。初期値は1であり、0は割り込みが存在しないことを示す。

割り込みIDは、複数の割り込みが通知され、その優先度が同一だったときに使用される。 この場合、小さい数字の割り込みIDが通知される。

7.6 割り込みの優先度

割り込みの優先度は符号なしの整数で管理されており、0が割り込みが発生していない状況、そして数字が大きくなるとより高い割り込み優先度であることを示す。

各グローバル割り込みソースは、関連する割り込み優先度が割り当てられている。 異なる割り込みソースは同一の優先度セットをサポートする必要はない。 割り込みソースの優先度レジスタはWARLフィールドであり、ソフトウェアが読み書きできるビットを指定できる。 サポートしている優先度の値を見つけるのを簡単にするために、レジスタ内の2bitが有効優先度として有効であるならば、その組み合わせである4つの値はすべて有効な優先度レベルとして取り扱われなければならない。

7.12 割り込みフロー

図7.2に、PLICを通じて割り込み制御を行う場合のメッセージフローを示す。

ゲートウェイは一度に一つの割り込みリクエストしか通知せず、割り込み完了の信号がくるまでは後続の割り込みをフォワードしない。 PLICはゲートウェイから割り込みリクエストを受け取るとIPビットを設定し、ターゲットへの割り込み通知を遅らせる。 ターゲットは新しい割り込みが通知されてから応答するまでに時間がかかるが、割り込みIDを確保するために割り込み獲得リクエストをPLICに対して通知する。 PLICコアはIDをアトミックに通知し、該当するIPビットを開放する。 ハンドラが割り込みを処理すると、割り込み完了通知がゲートウェイに対して送信され、新しい割り込みのリクエストを許可する。

f:id:msyksphinz:20171209191651p:plain

7.13 PLICコア仕様

PLICの操作は非決定性有限オートマトンとして制御されており、入出力のメッセージキューにおいてステートマシンが動作する。

  • レジスタ書き込み : レジスタ書き込みリクエストがキューから取り出されると、内部レジスタに優先度の高い、IEビットのレジスタ書き込みが発生する。
  • リクエスト受領 : 該当する割り込みソースのIPビットがクリアされると、メッセージを含んだ割り込みリクエストがゲートウェイから取り出され、IPビットがセットされる。
  • プロセス獲得 : 割り込み獲得のメッセージがキューから取り出される。ターゲットに対して有効な割り込みリクエストの中で最も優先度の高いものが、IDとともに割り込みキューに設定される。割り込みソースのIPビットがクリアされる。