RISC-Vの割り込み

RISC-Vの話題が出てるところで割り込みやデバッグの話が少ないというのをどこかで見たことがある。

たしかに、「RISC-VでCPUを作ってみた」とか「RISC-Vのエミュレータを作ってみた」とかの話題は多い。

なんで、割り込みってあまり話題に上がらないのか?

RISC-Vに限らず、割り込みって面倒なのか?

そうこう考えながら、RISC-Vの割り込み周辺をデバッグしていた。

割り込み周辺の範囲は単にCPU的に割り込みが入るだけではなく、次のこともちゃんと動作することを検証してみた。

  • 当然、CPUレベルで割り込み制御が行えること
  • 割り込みに遷移した後、元のPC(プログラマブルカウンタ)に戻ること
  • C言語でアプリから確認できること
  • アプリケーションから割り込み設定を行えること

結果から書くと・・・

  • CPUレベルの割り込みはInterruptが発生したらCSRのmtvecに設定しているアドレスに遷移すれば良い
    • ハードウェア的にPCをmtvecのアドレスに変えればよいだけです
    • CSRのmtvecが設定されている必要がある
    • これはRISC-Vの仕様だけど、無視して独自の割り込み機構を持ったハードウェアを作っても問題ない
  • CSRのmieがEnableになっている必要がある
    • これはRISC-Vの仕様なんだけど、別に無視して作っても問題ない
  • アプリからはアセンブラレベルで制御する必要がある
    • mtvecやmieのCSRへの読み書きはアセンブラレベルで記述する必要がある
  • アプリ側で割り込み時にレジスタの退避と復元が必要である
    • 割り込み遷移時にアプリ側で割り込み前のレジスタの退避と復元をしなければいけない
    • 退避するレジスタはコンパイラ依存である

ざっくりとこれぐらいだろう。

これを検証するのに必要なのは?

次の3項目になるのでハードとソフトの両方になるので面倒だということが分かる。

  • CPUの検証
  • コンパイラの検証
  • アプリの検証

これ面倒なのかな・・・?

p.s.

ハードとソフトの境界はどこなんだろうねぇ?

検証はCPUはFPGA上でアプリはホストPCからなので私自身はどちらもソフトウェア感覚で作成して、検証しているけど・・・

実際のところ、どうなんだろうねぇ?