FPGA開発日記

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

自作CPUのISA拡張表記に応じた命令デコーダの対応

RISC-VのISA拡張は、RV64IMAFDCなどの表記に応じてどのような命令がサポートされるのかが決まっている。

例えば、RV64IMAFDCはアトミック命令"A"をサポートしているが、RV64IMFDCはアトミック命令"A"をサポートしていない。

このような区別をするために、自作CPUのデコード情報を生成するJSONファイルに"isa_ext"情報を追加した。

diff --git a/src/riscv_decoder.json b/src/riscv_decoder.json
index d8b5433..57c6f95 100644
--- a/src/riscv_decoder.json
+++ b/src/riscv_decoder.json
@@ -3,7 +3,7 @@
         "name":"lui        r[11:7],h[31:12]",
         "length":"32", "xlen":["32", "64"],
         "field": ["XXXXX", "XX", "XXXXX", "XXXXX", "XXX", "XXXXX", "01101", "11"],
-        "inst_cat": [["inst_cat", "arith"]],
+        "inst_cat": [["inst_cat", "arith"]], "isa_ext": "i",
         "reg": [["rd", "r3"]],
         "alu_ctrl":[["op", "sign_lui"], ["imm", "s"]]
     },

これに応じて、拡張表記が生成対象に入っていなければその命令の定義をスキップする。

--- a/src/build_decoder.rb
+++ b/src/build_decoder.rb
@@ -29,7 +29,8 @@ end
 ctrl_idx = ARGV[0]
 xlen = ARGV[1].to_s
 flen = ARGV[2].to_s
-if ARGV.size != 3 then
+isa  = ARGV[3].to_s
+if ARGV.size != 4 then
   STDERR.print "Please specify signal fields in JSON file\n"
 end

@@ -110,6 +111,9 @@ $arch_table.each{ |arch|
   if arch.key?("flen") and not arch["flen"].include?(flen) then
     next
   end
+  if arch.key?("isa_ext") and not isa.include?(arch["isa_ext"]) then
+    next
+  end
   tmp_file.print arch["field"].join.gsub('X', '-')
   tmp_file.print ' '
   ctrl_fields.each {|ctrl|

これによって、ISAの拡張表記に応じてデコーダを厳密に生成しなおすことができるようになった。