自作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のアップデート条件に入れていなかったせいだ。修正は簡単。