FPGA開発日記

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

Chipyardで独自コアシミュレーション環境構築方法の調査 (バス幅拡張とアサーション修正)

テストパタンを流してとりあえず最初のフェッチが上手く行くかどうかを見ていたのだが、どうも以下のアサーションエラーで落ちてしまう。

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チャネルの次のリクエストと被っているらしい。

f:id:msyksphinz:20210125004037p:plain

バスのサイズ自体を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
   }
 }

これらの修正で、一応フェッチがエラー無く動くようになった。これでやっとフェッチユニットのデバッグに移ることができる。

f:id:msyksphinz:20210125004051p:plain
f:id:msyksphinz:20210125004059p:plain