自作RISC-Vコアの実装がかなり安定してきたので、AAPGでさらなるテストを流している。
もともとshakti向けに提供されている例を使って検証を拡充してみることにした。
落ちた命令を大きく区分けしてみた。半分以上が、csrwi命令によるFRMレジスタへの書き込み時の例外対応ミスとなっている。
$ tail -n20 */*.rv64imafdc.standard.log | grep -B3 Wrong | grep PC= | grep -v Exception | cut -f8 -d' ' | sort | uniq -c
2 beqz
46 c.addi16sp
4 c.ldsp
13 c.sdsp
121 csrwi
1 fadd.s
4 fcvt.l.s
1 fcvt.lu.s
1 fcvt.s.l
2 fcvt.wu.d
1 fle.s
2 fmadd.s
1 fmin.s
2 fmv.w.x
1 fmv.x.w
1 fsgnj.s
2 fsgnjn.s
1 fsqrt.d
178542 : L1D Load-In : 80098000(01536) : 00000000_9724142c_00000000_00000000_00000000_9724142c_00000000_00000000_00000000_9724142c_00000000_00000000_00000000_9724142c_00000000_00000000 178542 : Load ISS Check : 80098000 : 09a26f00_9d804d79_442c2712_8d862c55_117d4b7d_9e7732fd_474f43fe_42ebdf50_58cfd8b0_97620d05_00000000_00000000_00000000_9724142c_3fd5920f_b7a9ff86 44635 : RTL(33,1) Exception Cause = CSR Update Flush(27) PC=0000800016a0, Inst=0023d073, csrwi frm, 7 44635 : 3475 : PC=[00000000800016a0] (M,33,01) 0023d073 csrwi frm, 7 ========================================== Wrong PC: RTL = 00000000800016a0, ISS = 00000000800001e0 ==========================================
これはおそらくmstatus.FSをCSRのアップデート条件に入れていなかったせいだ。修正は簡単。