FPGA開発日記

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

自作CPUの割込みコントローラとISS一致検証タイミングの検討 (2. MSTATUSのチェッカーの検討)

自作CPUに対して割込みコントローラの実装をしているが、久しぶりに時間ができたのでこれの修正を行っている。

  • 何が問題か?

    • CLINTが割り込みを挿入しても、次の命令フェッチのPCが切り替わるだけですぐに割込みが入るわけではない。
    • 一方でSpike割り込みを挿入した瞬間にレジスタが書き換えられ、割込みが挿入されるので、RTLとISSでタイミングがずれる
  • これを解決するためには、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側の修正だな...