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の拡張表記に応じてデコーダを厳密に生成しなおすことができるようになった。