自作CPUに対して割込みコントローラの実装をしているが、久しぶりに時間ができたのでこれの修正を行っている。
RTL側の割込みのかけ方の問題について。思考をまとめておく。
一番単純に思ったのは、割込み要求信号が上がると、これをそのままS2ステージの
int_valid
信号につなげてしまい、割込みが発生することを通知すること。- この方式では、割込み発生後に正しくPCを切り替えることができない。どう頑張ってもフェッチステージで正しく割込み先へフェッチを発生させる必要がある。
- フェッチステージで正しく割込みを挿入できれば、後は通常のRerunを用いて正しくフェッチできるはずのため、あとは「現在割込みがかかっています」という状態を通知してコミット時にSpikeを切り替えるように指示すればよい。
割込み要求信号は、MSTATUSを触って落とさない限りは上がり続けているので、割込みに動作が切り替わっている最中は、PCがカウントアップされるようにケアする必要がある。
- つまり、割込み信号が上がったエッジを捕まえて、割込み信号が上がると一度だけPCを切り替え、それ以降は通常のフェッチを繰り返す
- 一方で一度フェッチに失敗すると再度エッジを捕まえなおす必要があり、この辺りを正しく処理する必要がある。
このフェッチに失敗した場合の処理だが、基本的にはフェッチの2番目のステージ(s2)で判定されるはずなので、s2ステージでclear(ハザード)が発生していればもう一度同じアドレスからやり直すことになる。 意外と割込みの制御は、割込みが入ってからのコントロールが大変だ。
あるいは、割込み要求信号が一度フェッチモジュールでAcceptされると、それ以降は割込み挿入リクエストを取り下げてしまったほうがいいかもしれない。そっちのほうが楽そうな気がする。