FPGA開発日記

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

Chipyardで独自コアシミュレーション環境構築方法の調査 (Verilatorでシミュレーション実行)

Chipyard環境上で独自CPUコアのシミュレーション環境を構築しようとしているが、いくつか環境の変更を行っている。

  • src/main/scala/MSRHCoreBlackbox.scala
class MSRHCoreBlackbox(
  xLen: Int
)
  extends BlackBox
  with HasBlackBoxResource
{
  val io = IO(new Bundle {
    val i_clk = Input(Clock())
/* ... */
    val i_ic_resp_tag   = Input(UInt(4.W))
    val i_ic_resp_data  = Input(UInt(512.W))
    val o_ic_resq_ready = Input(Bool())
  })

  // pre-process the verilog to remove "includes" and combine into one file
  val make = "make -C generators/msrh/src/main/resources/vsrc default "
  val proc = make
  require (proc.! == 0, "Failed to run preprocessing step")

  // add wrapper/blackbox after it is pre-processed
  addResource("/vsrc/MSRHCoreBlackbox.preprocessed.sv")
}

このブラックボックスの構成はArianeのものから取ってきた。ブラックボックスの定義を行っているのだが、最後にコマンドを実行しているようだ。Makeコマンドを実行してMSRHのVerilog構成のすべてをMSRHCoreBlackbox.preprocessed.svに集約するようになっている。generators/msrh/src/main/resources/vsrc/MakefileはすべてのVerilogファイルをcatして1つのファイルに集約する。

  • generators/msrh/src/main/resources/vsrc/Makefile
SRC_VLOG  =
SRC_VLOG += ./msrh/src/riscv64_pkg.sv
SRC_VLOG += ./msrh/src/mrh_pkg.sv
SRC_VLOG += ./msrh/src/l2_if.sv
SRC_VLOG += ./msrh/src/bit_oh_or.sv
SRC_VLOG += ./msrh/src/data_array.sv
SRC_VLOG += ./msrh/src/icache.sv
SRC_VLOG += ./msrh/src/tag_array.sv
SRC_VLOG += ./msrh/src/frontend.sv
SRC_VLOG += ./msrh/src/tlb.sv
SRC_VLOG += ./msrh/src/mrh_tile.sv
SRC_VLOG += ./msrh/src/mrh_tile_wrapper.sv

default:
        cat $(SRC_VLOG) > MSRHCoreBlackbox.preprocessed.sv

これで再度Verilogの生成に挑戦する。

$ make CONFIG=MSRHConfig debug -j4 2>&1 | tee msrhconfig.log

Verilatorでコンパイルが動き出すところまで来たぞ。地味にエラーが出るので直していきたいと思う。

%Error: /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.top.v:235874:6: Pin is not an in/out/inout/param/interface: 'o_ic_req_valid'
235874 |     .o_ic_req_valid(core_o_ic_req_valid),
       |      ^~~~~~~~~~~~~~
%Error: Exiting due to 3 error(s)

この辺だが、毎回Verilogの文法エラーを直して再度ChiselのWrapperを再処理するのに時間がかかりすぎて面倒なので、いくつかの要点だけはコマンドを取り出してすぐに確認できるようにしている。

  • 全てのSystemVerilog実装を1つのファイルに要約したMSRHCoreBlackbox.preprocessed.svの再生成
# at generators/msrh/src/main/resources/vsrc
make && mv MSRHCoreBlackbox.preprocessed.sv ../../../../../../sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/MSRHCoreBlackbox.preprocessed.sv
verilator --cc --exe -O3 -CFLAGS " -O1 -std=c++11 -I/home/msyksphinz/riscv64//include -I/home/msyksphinz/work/riscv/chipyard/chipyard_msh/tools/DRAMSim2 -D__STDC_FORMAT_MACROS  -DTEST_HARNESS=VTestHarness -DVERILATOR" -CFLAGS "-I/home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig -include /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.plusArgs -include /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/verilator.h" -LDFLAGS " -L/home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator -lpthread" /home/msyksphinz/riscv64//lib/libfesvr.a /home/msyksphinz/work/riscv/chipyard/chipyard_msh/tools/DRAMSim2/libdramsim.a --timescale 1ns/1ps --top-module TestHarness -Wno-fatal --assert --output-split 10000 --output-split-cfuncs 100 --max-num-width 1048576 -f /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/sim_files.common.f /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.top.v /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.harness.v /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.top.mems.v /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.harness.mems.v +define+PRINTF_COND=\$c\(\"verbose\",\"\&\&\"\,\"done_reset\"\) +define+STOP_COND=\$c\(\"done_reset\"\) -o /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/simulator-chipyard-MSRHConfig-debug --trace -Mdir /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.debug -CFLAGS "-include /home/msyksphinz/work/riscv/chipyard/chipyard_msh/sims/verilator/generated-src/chipyard.TestHarness.MSRHConfig/chipyard.TestHarness.MSRHConfig.debug/VTestHarness.h"

色々と試行錯誤して、一応Verilatorでシミュレーションが動くようになってきた。ただしまだTileLinkのスペックに則っていない部分があるので、アサーションで落ちてしまう。この辺りを修正していこう。

./simulator-chipyard-MSRHConfig-debug --vcd dhrystone.msrh.vcd --verbose $RISCV/riscv64-unknown-elf/share/riscv-tests/benchmarks/dhrystone.riscv 2>&1 | tee dhrystone.msrh.log

f:id:msyksphinz:20210123174030p:plain