FPGAでの自作CPUの挙動がどうしてもデバッグできなくなってきたので、FPGA向けRTLシミュレーションの環境を自分で構築することにした。
問題は、LiteXのVerilatorシミュレーション環境と、FPGA向けの論理合成環境は、生成されるRTLが異なる点だと思う。 たとえば、シリアル通信のためのデバイスの制御や、割り込み、シリアル通信FIFOのオーバーフロー制御などの確認が足りない。
rm -rf obj_dir/
make -C . -f Makefile \
CC_SRCS="--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/tb/sim_pkg.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/litex_defines.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/riscv_common_pkg.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/riscv_fpu_imafdc_pkg.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/riscv64_pkg.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/configs/scariv_boomv3_conf_pkg.sv \
/* ... 途中省略 ... */
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/scariv_bootrom.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/distributed_ram.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/distributed_mp_ram.sv \
--cc ${LITEX_WORK}litex-work/pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/distributed_1rd_ram.sv" \
OPT_LEVEL=O3 \
TRACE_FST=1
さらに、テストベンチの環境を作り上げてみる。
- tb.v
module tb; logic clk; logic cpu_reset; digilent_nexys_video u_dut ( .clk100 (clk), .cpu_reset (cpu_reset), .ddram_a (), /* ... 途中省略 ... */ .user_led6(), .user_led7(), .vadj0() ); initial begin clk = 1'b0; cpu_reset = 1'b1; $display("Simulation Start"); #1000; cpu_reset = 1'b0; $display("Simulation Reset Release"); #100000000; $display("Simulation Finish"); $finish; end initial begin $dumpfile("dump.fst"); $dumpvars(100, tb); $dumpon; end initial begin forever begin clk = 1'b0; #1; clk = 1'b1; #1; end end always_ff @ (posedge clk) begin if (u_dut.main_basesoc_uart_tx_fifo_rdport_re) begin $write("%c", u_dut.storage[u_dut.main_basesoc_uart_tx_fifo_rdport_adr]); $fflush; end end
すると、だんだん何が起きているのかわかってきた:
- 割り込み挿入時のジャンプアドレスがおかしい
- 割り込み挿入時のどの命令を殺すかの選択がおかしい
この辺を修正すると、RTLシミュレーションでもLiteXのBIOSが起動するようになってきた。
__ _ __ _ __
/ / (_) /____ | |/_/
/ /__/ / __/ -_)> <
/____/_/\__/\__/_/|_|
Build your hardware, easily!
(c) Copyright 2012-2024 Enjoy-Digital
(c) Copyright 2007-2015 M-Labs
BIOS built on Apr 29 2024 00:47:29
BIOS CRC passed (f2e8460c)
LiteX git sha1: 573e23072
--=============== SoC ==================--
CPU: Scariv @ 30MHz
BUS: wishbone 32-bit @ 4GiB
CSR: 32-bit data
ROM: 128.0KiB
SRAM: 8.0KiB
L2: 8.0KiB
SDRAM: 512.0MiB 16-bit @ 240MT/s (CL-7 CWL-5)
MAIN-RAM: 512.0MiB
--========== Initialization ============--
Initializing SDRAM @0x40000000...
Switching SDRAM to software control.
Read leveling:
m0, b00: |000000000000000
もうちょっと、デバッグだな。