FPGA開発日記

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

RISC-VのLinuxブート環境をbuildrootで構築する (6. Read Modify Writeの修正とブートシーケンスデバッグ)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。

Read Modify Writeについていくつかの修正を加えたのと、LR/SCについて簡単な実装を行った。 LR/SCはどちらも最も古い命令になってから実行する、投機的実行をしない方式で実行している。LRがパイプラインを走ると、Reservedフラグを立て、SCを実行して、同じアドレスであれば落とす。 1コアだと超シンプルな構成でよいが、マルチコアになるとSnoopなどによって挙動を変えなければならなくなる。

これで、Linuxのブートシーケンスをかなり進めることができるようになったが、まだ問題がある。Spikeを使用したLinuxブートシーケンスはなぜか途中で止まってしまい、 イメージをうまくロードすることができていない。これを今度は解決していく必要がある。

850万命令まで正しく実行してタイムアウトした。 ここから先はLinuxのブートシーケンスを理解する必要がある。

99999474 : L1D Load-In     : 80017ea0(00490) : 0000000a_00000800_00000000_00000000
99999474 : Load ISS Check  : 80017ea0        : 0000000a_00000800_00000000_80017ee0
99999478 : L1D Stq Store  : 80017ea0(00490) : 0000000a_00000800__________________
99999478 : STQ  ISS Check : 80017ea0        : 0000000a_00000800_00000000_80017ee0
24999894 : 8506282 : PC=[0000000080002126] (M,11,01) 00008aa6 c.mv    s5, s1
GPR[21](15) <= 0000000000000002
24999900 : RTL(12,1) Exception Cause = CSR Update Flush(27) PC=000080002128, Inst=34302a73, csrr    s4, mtval
24999900 : 8506283 : PC=[0000000080002128] (M,12,01) 34302a73 csrr    s4, mtval
GPR[20](27) <= 0000000000000000
24999917 : 8506284 : PC=[000000008000212c] (M,04,01) 04800513 li      a0, 72
GPR[10](33) <= 0000000000000048
24999918 : 8506285 : PC=[0000000080002130] (M,05,01) 78a000ef jal     pc + 0x78a
GPR[01](8) <= 0000000080002134
24999924 : RTL(6,1) Exception Cause = CSR Update Flush(27) PC=0000800028ba, Inst=301027f3, csrr    a5, misa
24999924 : 8506286 : PC=[00000000800028ba] (M,06,01) 301027f3 csrr    a5, misa
GPR[15](39) <= 8000000000141105
24999935 : 8506287 : PC=[00000000800028be] (M,13,01) 0000cf85 c.beqz  a5, pc + 56
24999936 : 8506288 : PC=[00000000800028c0] (M,14,01) fbf5061b addiw   a2, a0, -65
GPR[12](37) <= 0000000000000007
24999937 : 8506289 : PC=[00000000800028c4] (M,15,01) 0ff67593 andi    a1, a