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
もうちょっと、デバッグだな。