FPGA開発日記

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

自作CPUにZicondの命令を実装

自作CPUにZicondの命令を実装した。

Zicondの仕様については以下で定義されている。

github.com

実装しなければならないのは以下の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

とりあえず、まだテストパタン自体が存在していないので、簡単にテストパタンを作成して検証してみようと思う。