Modify MSUB, NMADD, NMSUB behaviour to differs from other instructions. (#2712)
Some checks failed
bender-up-to-date / bender-up-to-date (push) Has been cancelled
ci / build-riscv-tests (push) Has been cancelled
ci / execute-riscv64-tests (push) Has been cancelled
ci / execute-riscv32-tests (push) Has been cancelled

MSUB = rs1 - rs2 - rs3
NMADD = ~(rs1 + rs2 + rs3)
NMSUB = ~(rs1 - rs2 - rs3)
This commit is contained in:
Guillaume Chauvon 2025-01-17 14:12:08 +01:00 committed by GitHub
parent e840a61e80
commit 3d2ff00b1c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 47 additions and 20 deletions

View file

@ -88,8 +88,32 @@ module copro_alu
rd_n = rd_i;
we_n = 1'b1;
end
cvxif_instr_pkg::ADD_RS3_R4: begin
result_n = NrRgprPorts == 3 ? registers_i[2] + registers_i[1] + registers_i[0] : registers_i[1] + registers_i[0];
cvxif_instr_pkg::MADD_RS3_R4: begin
result_n = NrRgprPorts == 3 ? (registers_i[0] + registers_i[1] + registers_i[2]) : (registers_i[0] + registers_i[1]);
hartid_n = hartid_i;
id_n = id_i;
valid_n = 1'b1;
rd_n = rd_i;
we_n = 1'b1;
end
cvxif_instr_pkg::MSUB_RS3_R4: begin
result_n = NrRgprPorts == 3 ? (registers_i[0] - registers_i[1] - registers_i[2]) : (registers_i[0] - registers_i[1]);
hartid_n = hartid_i;
id_n = id_i;
valid_n = 1'b1;
rd_n = rd_i;
we_n = 1'b1;
end
cvxif_instr_pkg::NMADD_RS3_R4: begin
result_n = NrRgprPorts == 3 ? ~(registers_i[0] + registers_i[1] + registers_i[2]) : ~(registers_i[0] + registers_i[1]);
hartid_n = hartid_i;
id_n = id_i;
valid_n = 1'b1;
rd_n = rd_i;
we_n = 1'b1;
end
cvxif_instr_pkg::NMSUB_RS3_R4: begin
result_n = NrRgprPorts == 3 ? ~(registers_i[0] - registers_i[1] - registers_i[2]) : ~(registers_i[0] - registers_i[1]);
hartid_n = hartid_i;
id_n = id_i;
valid_n = 1'b1;

View file

@ -18,8 +18,11 @@ package cvxif_instr_pkg;
DOUBLE_RS1 = 4'b0011,
DOUBLE_RS2 = 4'b0100,
ADD_MULTI = 4'b0101,
ADD_RS3_R4 = 4'b0110,
ADD_RS3_R = 4'b0111
MADD_RS3_R4 = 4'b0110,
MSUB_RS3_R4 = 4'b0111,
NMADD_RS3_R4 = 4'b1000,
NMSUB_RS3_R4 = 4'b1001,
ADD_RS3_R = 4'b1111
} opcode_t;
@ -105,7 +108,7 @@ package cvxif_instr_pkg;
32'b00000_00_00000_00000_0_00_00000_1000011, // MADD opcode
mask: 32'b00000_11_00000_00000_1_11_00000_1111111,
resp : '{accept : 1'b1, writeback : 1'b1, register_read : {1'b1, 1'b1, 1'b1}},
opcode : ADD_RS3_R4
opcode : MADD_RS3_R4
},
'{
// Custom Add Multi rs1 : cus_add rd, rs1, rs1
@ -113,7 +116,7 @@ package cvxif_instr_pkg;
32'b00000_00_00000_00000_0_00_00000_1000111, // MSUB opcode
mask: 32'b00000_11_00000_00000_1_11_00000_1111111,
resp : '{accept : 1'b1, writeback : 1'b1, register_read : {1'b1, 1'b1, 1'b1}},
opcode : ADD_RS3_R4
opcode : MSUB_RS3_R4
},
'{
// Custom Add Multi rs1 : cus_add rd, rs1, rs1
@ -121,7 +124,7 @@ package cvxif_instr_pkg;
32'b00000_00_00000_00000_0_00_00000_1001011, // NMSUB opcode
mask: 32'b00000_11_00000_00000_1_11_00000_1111111,
resp : '{accept : 1'b1, writeback : 1'b1, register_read : {1'b1, 1'b1, 1'b1}},
opcode : ADD_RS3_R4
opcode : NMSUB_RS3_R4
},
'{
// Custom Add Multi rs1 : cus_add rd, rs1, rs1
@ -129,7 +132,7 @@ package cvxif_instr_pkg;
32'b00000_00_00000_00000_0_00_00000_1001111, // NMADD opcode
mask: 32'b00000_11_00000_00000_1_11_00000_1111111,
resp : '{accept : 1'b1, writeback : 1'b1, register_read : {1'b1, 1'b1, 1'b1}},
opcode : ADD_RS3_R4
opcode : NMADD_RS3_R4
}
};

View file

@ -70,25 +70,25 @@ Except for 4 of them using opcode `MADD, MSUB, NMADD, NMSUB`
**Format**: addi rd, rs1, rs2, rs3 -> |rs3|00|rs2|rs1|000|rd|100_0111|
**Description**: add register rs1, rs2 to rs3, and store the result in rd.
**Description**: subtract register rs2 and rs3 from rs1 and store the result in rd.
**Pseudocode**: x[rd] = x[rs1] + x[rs2] + x[rs3]
**Pseudocode**: x[rd] = x[rs1] - x[rs2] - x[rs3]
- **CUS_ADD_RS3_NMADD**: Custom Add with RS3 opcode == NMADD
**Format**: addi rd, rs1, rs2, rs3 -> |rs3|00|rs2|rs1|000|rd|100_1111|
**Description**: add register rs1, rs2 to rs3, and store the result in rd.
**Description**: add register rs1, rs2 to rs3, negate the sum, and store the result in rd.
**Pseudocode**: x[rd] = x[rs1] + x[rs2] + x[rs3]
**Pseudocode**: x[rd] = ¬(x[rs1] + x[rs2] + x[rs3])
- **CUS_ADD_RS3_NMSUB**: Custom Add with RS3 opcode == NMSUB
**Format**: addi rd, rs1, rs2, rs3 -> |rs3|00|rs2|rs1|000|rd|100_1011|
**Description**: add register rs1, rs2 to rs3, and store the result in rd.
**Description**: subtract register rs2 and rs3 from rs1, negate the difference, and store the result in rd.
**Pseudocode**: x[rd] = x[rs1] + x[rs2] + x[rs3]
**Pseudocode**: x[rd] = ¬(x[rs1] - x[rs2] - x[rs3])
- **CUS_ADD_RS3_RTYPE**: Custom Add with RS3, rd is x10 (a0)

View file

@ -378,31 +378,31 @@ task uvme_cvxif_vseq_c::do_instr_result();
end
"CUS_ADD_RS3_MSUB": begin
if (req_item.register.rs_valid == 3'b111) begin
resp_item.result.data = req_item.register.rs[0] + req_item.register.rs[1] + req_item.register.rs[2];
resp_item.result.data = req_item.register.rs[0] - req_item.register.rs[1] - req_item.register.rs[2];
resp_item.result.rd = req_item.issue_req.instr[11:7];
end
else if (req_item.register.rs_valid == 2'b11) begin
resp_item.result.data = req_item.register.rs[0] + req_item.register.rs[1];
resp_item.result.data = req_item.register.rs[0] - req_item.register.rs[1];
resp_item.result.rd = req_item.issue_req.instr[11:7];
end
end
"CUS_ADD_RS3_NMADD": begin
if (req_item.register.rs_valid == 3'b111) begin
resp_item.result.data = req_item.register.rs[0] + req_item.register.rs[1] + req_item.register.rs[2];
resp_item.result.data = ~(req_item.register.rs[0] + req_item.register.rs[1] + req_item.register.rs[2]);
resp_item.result.rd = req_item.issue_req.instr[11:7];
end
else if (req_item.register.rs_valid == 2'b11) begin
resp_item.result.data = req_item.register.rs[0] + req_item.register.rs[1];
resp_item.result.data = ~(req_item.register.rs[0] + req_item.register.rs[1]);
resp_item.result.rd = req_item.issue_req.instr[11:7];
end
end
"CUS_ADD_RS3_NMSUB": begin
if (req_item.register.rs_valid == 3'b111) begin
resp_item.result.data = req_item.register.rs[0] + req_item.register.rs[1] + req_item.register.rs[2];
resp_item.result.data = ~(req_item.register.rs[0] - req_item.register.rs[1] - req_item.register.rs[2]);
resp_item.result.rd = req_item.issue_req.instr[11:7];
end
else if (req_item.register.rs_valid == 2'b11) begin
resp_item.result.data = req_item.register.rs[0] + req_item.register.rs[1];
resp_item.result.data = ~(req_item.register.rs[0] - req_item.register.rs[1]);
resp_item.result.rd = req_item.issue_req.instr[11:7];
end
end