FPGA開発日記

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

Chisel + DiplomacyでのCPUコアデバッグ

自作CPUの構成をマルチコアに変更したので、いくつか問題が表面化してしまっている。命令フェッチのシーケンサが1サイクルでメモリの応答が返ってくる仕様になっているのでこれは良くない。修正しよう。シーケンサを拡張してステートマシンを構築した。

  val fetch_sm = RegInit(FetchSM.sInit)

  switch (fetch_sm) {
    is(FetchSM.sInit) {
      when(io.run) {
        fetch_sm := FetchSM.sReqWait
      }
    }
    is(FetchSM.sReqWait) {
      when(io.inst_bus.req && io.inst_bus.ready) {
        fetch_sm := FetchSM.sAckWait
      }
    }
    is(FetchSM.sAckWait) {
      when(io.inst_bus.ack) {
        when (dec_stall_en) {
          fetch_sm := FetchSM.sWaitStall
        } .otherwise {
          fetch_sm := FetchSM.sReqWait
        }
      }
    }
    is (FetchSM.sWaitStall) {
      when (!dec_stall_en) {
        fetch_sm := FetchSM.sReqWait
      }
    }
  }

ステートマシンのEnumの定義にはChiselのChiselEnumを使用した。これはこれまでのEnumに比べてかなり便利だ。

  object FetchSM extends ChiselEnum {
    val sInit, sReqWait, sAckWait, sWaitStall = Value
  }

これによりフェッチリクエストが受理されるまでステートマシンが停止するので、パイプラインは停止するが正しく命令をフェッチして動作することができる。

f:id:msyksphinz:20201204000925p:plain

Diplomacyの構成図を見てみる。正しく接続できたことを確認できた。次はデータアクセス側のバスの調整を行う。

f:id:msyksphinz:20201204000938p:plain