自作RISC-Vアウトオブオーダコアの実装、FPUを実装している。XLENとFLENが異なるコンフィグレーションをいくつも作って、自分の実装が正しいことを確認していきたい。
ここでは6つのコンフィグレーションを用意した。 - RV32IMC (XLEN=32, FLEN=0) - RV64IMC (XLEN=64, FLEN=0) - RV32IMFC (XLEN=32, FLEN=32) - RV64IMFC (XLEN=64, FLEN=32) - RV32IMFDC (XLEN=32, FLEN=64) - RV64IMFDC (XLEN=64, FLEN=64)
これらをそれぞれ用意してリグレッションテストを流していく。もともとRV32の実装で5つのコンフィグレーション、RV64で5つのコンフィグレーションを持っていたので、合計で5x3x2=30個のコンフィグレーションが用意されたことになる。なんてこった。
riscv-testsを流すにあたって、例えばFLEN=0の実装に対してFADDのテストパタンを流すと、テストケース自体はFAILとなり終了となる。ただしこのFAILは想定通りで、シミュレータと全く同じ動きをしていれば良しということで、「テスト自体はFAILだが、Spikeと動きが一致している」という結果状態である「MATCH」を用意した。
rv32mi-p-shamt : ERROR rv32si-p-csr : ERROR rv32ud-p-fadd : MATCH rv32ud-p-fclass : MATCH rv32ud-p-fcmp : MATCH rv32ud-p-fcvt_w : MATCH rv32ud-p-fmin : MATCH rv32ud-v-fadd : ERROR rv32ud-p-ldst : MATCH rv32ud-p-fmadd : MATCH rv32ud-p-recoding : MATCH
RV32IMCの実装においてMATCHが発生した。ただしrv32ud-v-fadd
においてERRORが発生したのはなんでだ?リグレッションテストを見返すと、ERRORが発生しているのはFPU命令の仮想化モード(v)の時のテストケースばかりだ。
rv32mi-p-csr : ERROR rv32mi-p-illegal : ERROR rv32mi-p-ma_fetch : ERROR rv32mi-p-shamt : ERROR rv32si-p-csr : ERROR rv32ud-v-fadd : ERROR rv32ud-v-fmadd : ERROR rv32ud-v-ldst : ERROR rv32ud-v-fclass : ERROR rv32ud-v-fmin : ERROR rv32ud-v-fcvt_w : ERROR rv32ud-v-fcvt : ERROR rv32ud-v-fdiv : ERROR rv32ud-v-fcmp : ERROR rv32ud-v-recoding : ERROR rv32uf-v-fcvt : ERROR rv32uf-v-fclass : ERROR rv32uf-v-fadd : ERROR rv32uf-v-fcmp : ERROR rv32uf-v-fmin : ERROR rv32uf-v-recoding : ERROR rv32uf-v-ldst : ERROR rv32uf-v-move : ERROR rv32uf-v-fdiv : ERROR rv32uf-v-fmadd : ERROR rv32uf-v-fcvt_w : ERROR
エラーの内容は以下の通りだった。うーん、swでアクセスフォルトが発生している?そんなことはないと思うのだが、波形を見ながらデバッグが必要かもしれない。
18005 : RTL(9,1) Exception Cause = SRET Flush(25) PC=0000ffc00140, Inst=10200073, sret 18005 : 4360 : PC=[00000000ffc00140] (M,09,01) 10200073 sret 18049 : RTL(13,1) Exception Cause = Illegal Instruction(2) PC=0000000029e0, Inst=00301073, csrw fcsr, zero ========================================== 18049 : Exception Happened(13,1) : Cause = Illegal Instruction(2) ========================================== 18076 : 4360 : PC=[0000000080000008] (M,01,01) 3040206f j pc + 0x2304 GPR[00](0) <= 00000000 18103 : 4362 : PC=[000000008000230c] (M,03,01) ff010113 addi sp, sp, -16 GPR[02](30) <= fffffff0 18117 : 4363 : PC=[0000000080002310] (M,04,01) 34900513 li a0, 841 GPR[10](8) <= 00000349 18117 : RTL(4,2) Exception Cause = Store Access Fault(7) PC=000080002314, Inst=00112623, sw ra, 12(sp) ========================================== 18117 : Exception Happened(4,2) : Cause = Store Access Fault(7) ========================================== 18131 : 4364 : PC=[0000000080000008] (M,07,01) 3040206f j pc + 0x2304 MW4(0xfffffffffffffffc)=>00000000