自作RISC-Vコアの設計においては、LSU周りのデバッグをメインに行っているがあまりはっきりとした進捗が無いのでブログに書くネタがない。 一方でAtomic命令についてはいくつかテンプレートを作成した上で基本的な命令の動作記述を始めた。
アトミック命令については、まずは以下の命令をサポートしてみる。仕様書から抜粋。
テンプレートを作成した。これでデコーダを自動生成させる。
{ "name":"lr.w r[11:7],r[19:15]", "length":"32", "xlen":["64", "32"], "field":["00010", "XX", "00000", "XXXXX", "010", "XXXXX", "01011", "11"], "inst_cat": [["inst_cat", "lsu"]], "reg": [["rd", "r3"], ["r1", "r1"]], "lsu_ctrl": [["size", "w"], ["op", "lr"]] }, { "name":"sc.w r[11:7],r[19:15],r[24:20]", "length":"32", "xlen":["64", "32"], "field":["00011", "XX", "XXXXX", "XXXXX", "010", "XXXXX", "01011", "11"], "inst_cat": [["inst_cat", "lsu"]], "reg": [["rd", "r3"], ["r1", "r1"]], "lsu_ctrl": [["size", "w"], ["op", "sc"]] }, { "name":"amoswap.w r[11:7],r[24:20],(r[19:15])", "length":"32", "xlen":["64", "32"], "field":["00001", "XX", "XXXXX", "XXXXX", "010", "XXXXX", "01011", "11"], "inst_cat": [["inst_cat", "lsu"]], "reg":[["rd", "r3"], ["r1", "r1"], ["r2", "r2"]], "lsu_ctrl": [["size", "w"], ["op", "amoswap"]] }, { "name":"amoadd.w r[11:7],r[24:20],(r[19:15])", "length":"32", "xlen":["64", "32"], "field":["00000", "XX", "XXXXX", "XXXXX", "010", "XXXXX", "01011", "11"], "inst_cat": [["inst_cat", "lsu"]], "reg":[["rd", "r3"], ["r1", "r1"], ["r2", "r2"]], "lsu_ctrl": [["size", "w"], ["op", "amoadd"]] }, { "name":"amoxor.w r[11:7],r[24:20],(r[19:15])", "length":"32", "xlen":["64", "32"], "field":["00100", "XX", "XXXXX", "XXXXX", "010", "XXXXX", "01011", "11"], "inst_cat": [["inst_cat", "lsu"]], "reg":[["rd", "r3"], ["r1", "r1"], ["r2", "r2"]], "lsu_ctrl": [["size", "w"], ["op", "amoxor"]] },
オペコードに自動的にアトミック命令群が追加された。次に実装方法だが、L1Dとの兼ね合いもありいろいろと考えなければならない。まずはRocket-Chipの動作を調査しようかな。