FPGA開発日記

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

自作RISC-Vアウトオブオーダコアの実装 (FPU命令のサポートとXLEN/FLENの違いによる実装変更)

自作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