FPGA開発日記

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

自作RISC-Vコアにおける浮動小数点命令サポートの検討

自作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出力を許可しなければならない)。

github.com

演算パイプラインのラッパーを作って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)
===============================

f:id:msyksphinz:20220212223227p:plain
FPNewをインスタンス化してシミュレーションを動作させる