自作CPUにZicondの命令を実装した。
Zicondの仕様については以下で定義されている。
実装しなければならないのは以下の2命令だ。
czero.eqz rd, rs1, rs2 czero.nez rd, rs1, rs2
実装自体は非常に簡単なので、デコーダと論理を追加するだけだ。
[ { "name":"czero.eqz r[11:7],r[19:15],r[24:20]", "length":"32", "xlen":["32", "64"], "field": ["00001", "11", "XXXXX", "XXXXX", "101", "XXXXX", "01100", "11"], "inst_cat": [["inst_cat", "arith"]], "isa_ext": "zicond", "reg": [["rd", "rs1", "rs2"]], "alu_ctrl":[["op", "czero_eqz"]] }, { "name":"czero.nez r[11:7],r[19:15],r[24:20]", "length":"32", "xlen":["32", "64"], "field": ["00001", "11", "XXXXX", "XXXXX", "111", "XXXXX", "01100", "11"], "inst_cat": [["inst_cat", "arith"]], "isa_ext": "zicond", "reg": [["rd", "rs1", "rs2"]], "alu_ctrl":[["op", "czero_nez"]] } ]
always_comb begin o_valid = 1'b1; case (i_op) OP_CZERO_EQZ : begin o_out = i_rs2 == 'h0 ? 'h0 : i_rs1; end OP_CZERO_NEZ : begin o_out = i_rs2 != 'h0 ? 'h0 : i_rs1; end default : begin o_out = 'h0; o_valid = 1'b0; end endcase // case (i_op) end // always_comb
とりあえず、まだテストパタン自体が存在していないので、簡単にテストパタンを作成して検証してみようと思う。