テストパタンを流してとりあえず最初のフェッチが上手く行くかどうかを見ていたのだが、どうも以下のアサーションエラーで落ちてしまう。
Assertion failed: 'A' channel Get carries invalid source ID (connected at MSRHTile.scala:163:21)
Aチャネルのエラーなのでフェッチのタイミングに何かエラーがあるんだろうかと思いながらデバッグしても全く意味が分からず、そしてVerilatorのシミュレーションでは_
の付いた信号はシミュレーション対象としてくれないので詳細が取れない。Verilatorのオプションで以下を追加してみる。
diff --git a/sims/verilator/Makefile b/sims/verilator/Makefile index 1b9276ac..acb4116a 100644 --- a/sims/verilator/Makefile +++ b/sims/verilator/Makefile @@ -125,7 +125,12 @@ $(model_mk): $(sim_vsrcs) $(sim_common_files) $(EXTRA_SIM_REQS) $(model_mk_debug): $(sim_vsrcs) $(sim_common_files) $(EXTRA_SIM_REQS) rm -rf $(model_dir_debug) mkdir -p $(model_dir_debug) - $(VERILATOR) $(VERILATOR_OPTS) -o $(sim_debug) --trace -Mdir $(model_dir_debug) -CFLAGS "-include $(model_header_debug)" + $(VERILATOR) $(VERILATOR_OPTS) -o $(sim_debug) --trace \ + --trace-params \ + --trace-structs \ + --trace-threads 4 \ + --trace-underscore \ + -Mdir $(model_dir_debug) -CFLAGS "-include $(model_header_debug)" touch $@
これで信号をひたすらトレースしていると、どうもDチャネルが邪魔をしているっぽいのが見て取れた。Dチャネルがバーストで複数サイクルを返しているので、それでAチャネルの次のリクエストと被っているらしい。
バスのサイズ自体を256ビットで仮定していたがシステムバスが64ビットなので4回バーストで返ってきているらしい。バスのサイズを修正する。
diff --git a/src/main/scala/ConfigMixins.scala b/src/main/scala/ConfigMixins.scala index 2c61a82..7e882e7 100644 --- a/src/main/scala/ConfigMixins.scala +++ b/src/main/scala/ConfigMixins.scala @@ -56,7 +56,7 @@ class WithNMSRHCores(n: Int) extends Config( * Setup default MSRH parameters. */ class WithNormalMSRHSys extends Config((site, here, up) => { - case SystemBusKey => up(SystemBusKey, site).copy(beatBytes = 8) + case SystemBusKey => up(SystemBusKey, site).copy(beatBytes = 32) case XLen => 64 case MaxHartIdBits => log2Up(site(MSRHTilesKey).size) })
この上で、MSRHのラッパーを修正する。
diff --git a/src/main/scala/MSRHTile.scala b/src/main/scala/MSRHTile.scala index 24bf9cf..756c7b1 100644 --- a/src/main/scala/MSRHTile.scala +++ b/src/main/scala/MSRHTile.scala @@ -248,19 +247,33 @@ class MSRHTileModuleImp(outer: MSRHTile) extends BaseTileModuleImp(outer){ outer.traceSourceNode.bundle map (t => t.valid := false.B) // } + val beatBytes = p(SystemBusKey).beatBytes + // connect the axi interface outer.memTLNode.out foreach { case (out, edgeOut) => out.a.valid := core.io.o_ic_req_valid - out.a.bits.opcode := core.io.o_ic_req_cmd + out.a.bits.opcode := tl_opcode out.a.bits.param := 0.U - out.a.bits.size := 0.U + out.a.bits.size := log2Ceil(beatBytes).U out.a.bits.source := core.io.o_ic_req_tag out.a.bits.address := core.io.o_ic_req_addr // out.a.bits.user := 0.U // out.a.bits.echo := 0.U - out.a.bits.mask := 0.U + out.a.bits.mask := Fill(beatBytes * 8, 1.U(1.W)) out.a.bits.data := 0.U out.a.bits.corrupt := 0.U core.io.i_ic_req_ready := out.a.ready + + core.io.i_ic_resp_valid := out.d.valid + core.io.i_ic_resp_tag := out.d.bits.source + core.io.i_ic_resp_data := out.d.bits.data + out.d.ready := core.io.o_ic_resp_ready } }
これらの修正で、一応フェッチがエラー無く動くようになった。これでやっとフェッチユニットのデバッグに移ることができる。