FPGA開発日記

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

RISC-VのLinuxブート環境をbuildrootで構築する (2.RTLによるシミュレーション試行)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行してみようと思う。

まずは簡単にブートローダから。これはELF形式で格納されているので簡単に実行することができる。

しかし、ロード直後に落ちてしまった。あれえ、なんでこんなところで落ちるんだ?

Set ToHost Addr 80018608
initial_spike opening /home/msyksphinz/work/riscv/linux/riscv64-linux/output/images/fw_jump.elf ...
spike iss done
25650 : 0 : PC=[0000000080000000] (M,00,01) 00050433 add     s0, a0, zero
GPR[08](32) <= 0000000000000000
25650 : 1 : PC=[0000000080000004] (M,00,02) 000584b3 add     s1, a1, zero
==========================================
Wrong GPR[09](64): RTL = 0000000000000000, ISS = 0000000000001020
==========================================
===============================
SIMULATION FINISH : FAIL (CODE=100)
===============================

よくよく見てみると、RTL環境では最初のBootROM (0x1000)を無視しているのだった。これにより、x10とx11にあらかじめ設定された値が使用できなくなっている(x11dtbの場所を示しているアドレスだった)。

$ sed 's/(/DASM(/g' sim_rv64imc_standard/linux/spike.log | spike-dasm
core   0: 3 0x0000000000001000 auipc   t0, 0x0 x 5 0x0000000000001000
core   0: 3 0x0000000000001004 addi    a1, t0, 32 x11 0x0000000000001020
core   0: 3 0x0000000000001008 csrr    a0, mhartid x10 0x0000000000000000
core   0: 3 0x000000000000100c ld      t0, 24(t0) x 5 0x0000000080000000 mem 0x0000000000001018
core   0: 3 0x0000000000001010 jr      t0
core   0: 3 0x0000000080000000 add     s0, a0, zero x 8 0x0000000000000000
core   0: 3 0x0000000080000004 add     s1, a1, zero x 9 0x0000000000001020

fw_jump.elfではこの情報を実際に使用しているためFailとなっているようだった。これは、RTL側もBootROMをまじめに用意しなければならない。シミュレーション環境の変更が必要だ...