自作CPUに対して割込みコントローラの実装をしているが、久しぶりに時間ができたのでこれの修正を行っている。
何が問題か?
これを解決するためには、RTL側が割り込みが挿入され、それに基づきフロントエンドがフェッチを変えたことをROBの最後まで記憶しておき、コミット時に同じタイミングでSpikeに伝えることになる。
これにより、RTLに
SIMULATION
記述を追加し、割込みによりフローが変わったことを示し、コミット時にそれをSpikeに通知する信号が必要になる。
タイマー割込みがかかったときに、MSTATUSが変更されることによりMSTATUSの値が変化してしまう。 これはBOOMなどのコアではどのように対応しているのか?
一つの考え方としては、割込みをつかさどる下位の13ビットまでは、一致していなくても警告で済ますということはどうだろう?
つまり、MSTATUSのチェッカーを以下のようにして下位の13ビットをチェックしないようにしてしまう。かなりセコいけれども。
bool inline is_equal_xlen(int64_t val1, int64_t val2, int compare_lsb = 0) { val1 = val1 & ~((1 << compare_lsb) - 1); val2 = val2 & ~((1 << compare_lsb) - 1); if (g_rv_xlen == 32) { return (val1 & 0xffffffffULL) == (val2 & 0xffffffffULL); } else if (g_rv_xlen == 64) { return val1 == val2; } else { fprintf(compare_log_fp, "rv_xlen should be 32 or 64\n"); exit(-1); } }
とりあえずこれでエラーはなくなったが、今度は割込みがかからなくなった。今度はRTL側の修正だな...