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によるSystemVerilogのコンパイル
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