FPGA開発日記

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

LiteXのBIOSソフトウェアを独自に構築する方法調査 (3. シミュレーション環境の確認)

msyksphinz.hatenablog.com

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

もうちょっと、デバッグだな。