自作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 }
これによりフェッチリクエストが受理されるまでステートマシンが停止するので、パイプラインは停止するが正しく命令をフェッチして動作することができる。
Diplomacyの構成図を見てみる。正しく接続できたことを確認できた。次はデータアクセス側のバスの調整を行う。