FPGA開発日記

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

RISC-V Bit-Manipulation命令を自作RISC-Vシミュレータに実装解説 (1. 命令デコーダの実装)

f:id:msyksphinz:20200123091357p:plain:w300
Bit Manipulation 仕様書から抜粋

RISC-Vの命令エンコーディングのなかで、Bit-Manipulationはある程度仕様が固まってきている。 命令フォーマットは以下のドキュメントに記載されている。

f:id:msyksphinz:20200123091340p:plain

github.com

これをひたすら自作シミュレータの命令デコードJSONファイルに書き込んでいく。

[
    {"name":"andn      r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["01000", "00", "XXXXX", "XXXXX", "111", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"orn       r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["01000", "00", "XXXXX", "XXXXX", "110", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"xnor      r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["01000", "00", "XXXXX", "XXXXX", "100", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"slo       r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["00100", "00", "XXXXX", "XXXXX", "001", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"sro       r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["00100", "00", "XXXXX", "XXXXX", "101", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"rol       r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["01100", "00", "XXXXX", "XXXXX", "001", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"ror       r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["01100", "00", "XXXXX", "XXXXX", "101", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    {"name":"sh1add    r[11:7],r[24:20],r[19:15]",          "length":"32", "dlength":"32", "field": ["00100", "00", "XXXXX", "XXXXX", "010", "XXXXX", "01100", "11"], "category":"BIT", "func_suffix":"", "impl":[""], "inst_ctrl":[""]},
    ...

100を超える命令を実装してデコーダを吐かせてみるとエラーが検出された。どうもFSRI命令とSROI, RORIエンコーディングがぶつかっている様子。確かに、確認するとぶつかっていた。なんだこれは?

f:id:msyksphinz:20200123091426p:plain
FSRI命令のエンコーディング

GitHub Issuesを確認すると、これはSORI, RORIエンコーディングが過剰に予約されているようだ。immは7ビット予約されているのだがRV32の場合は上位の2ビットを0に固定、RV64の場合は上位の1ビットを1に固定する必要があるらしい。RV128の場合はすべての即値フィールドを使うのだが、その場合FSRIは定義されない。

この点を修正して再度デコーダを生成すると、特にエラーなくデコーダが出力された。次は中身の実装に入っていく。