自作RISC-V CPUコアに浮動小数点命令をサポートしたい。浮動小数点命令は大きく分けて単精度浮動小数点と倍精度浮動小数点命令があり、それぞれの命令を追加していく。 自作CPUコアでは命令定義をJSONで管理して、デコーダを自動生成するようにしているので、まずは命令群を追加していくことにしよう。
{ "name":"fadd.s f[11:7],f[19:15],f[24:20]", "length":"32", "xlen":["32", "64"], "field":["00000", "00", "XXXXX", "XXXXX", "XXX", "XXXXX", "10100", "11"], "inst_cat": [["inst_cat", "fpu"]], "reg": [["rd", "fd"], ["r1", "f1"], ["r2", "f2"]], "fpu_ctrl":[["size", "w"], ["op", "fadd"]] }, { "name":"fsub.s f[11:7],f[19:15],f[24:20]", "length":"32", "xlen":["32", "64"], "field":["00001", "00", "XXXXX", "XXXXX", "XXX", "XXXXX", "10100", "11"], "inst_cat": [["inst_cat", "fpu"]], "reg": [["rd", "fd"], ["r1", "f1"], ["r2", "f2"]], "fpu_ctrl":[["size", "w"], ["op", "fsub"]] }, { "name":"fmul.s f[11:7],f[19:15],f[24:20]", "length":"32", "xlen":["32", "64"], "field":["00010", "00", "XXXXX", "XXXXX", "XXX", "XXXXX", "10100", "11"], "inst_cat": [["inst_cat", "fpu"]], "reg": [["rd", "fd"], ["r1", "f1"], ["r2", "f2"]], "fpu_ctrl":[["size", "w"], ["op", "fmul"]] }, ...
これでデコーダ等々が自動生成されるようになるのでこれは良しとして、次の問題は浮動小数点レジスタファイルの追加だ。整数レジスタとは別に浮動小数点レジスタのリネーム処理を追加する。 浮動小数点命令向けに別のリネーム機構を用意して、整数と同時にリネームを行うように設計した。
浮動小数点演算としては、オープンソースのFPUとしてFPNewを使用する。Verilatorでもコンパイル可能だ(ただしWarningが出るのでWarning出力を許可しなければならない)。
演算パイプラインのラッパーを作ってFPNewをインスタンスしていく。一応コンパイルが通ったのでテストしてみよう。
まず最初の浮動小数点命令が認識されずに不正命令例外となってしまった。あれ?デコーダが足りないようだ。追加する。
GPR[11](6) <= 123456789abce000 2556 : 78 : PC=[00000000800001a0] (U,04,01) ef058593 addi a1, a1, -272 GPR[11](1) <= 123456789abcdef0 2561 : 79 : PC=[00000000800001a4] (U,05,01) 00000613 li a2, 0 GPR[12](9) <= 0000000000000000 2574 : RTL(10,1) Exception Cause = 27 2574 : 80 : PC=[0000000080000004] (M,10,01) 34202f73 csrr t5, mcause ========================================== Wrong PC: RTL = 0000000080000004, ISS = 00000000800001a8 ========================================== =============================== SIMULATION FINISH : FAIL (CODE=100) ===============================