mirror of
https://github.com/openhwgroup/cva6.git
synced 2025-04-23 13:47:13 -04:00
Merge pull request #2005 from ThalesSiliconSecurity/cvxif
CVXIF : Fix value of user mode & cus_exc decode
This commit is contained in:
commit
c720ad63ed
3 changed files with 18 additions and 9 deletions
|
@ -75,15 +75,17 @@ function string uvme_cvxif_base_vseq_c::decode(input logic [31:0] instr);
|
|||
if (func7 == 7'b0000000 && rd == 0 && rs1 == 0 && rs2 == 0) begin
|
||||
return ("CUS_NOP");
|
||||
end
|
||||
if (func7 == 7'b1000000 && instr[24:13] == 12'b000000000001) begin
|
||||
return ("CUS_EXC");
|
||||
end
|
||||
end
|
||||
if (func3 == 3'b001) begin
|
||||
if (func7 == 7'b0000000) begin
|
||||
return ("CUS_ADD");
|
||||
end
|
||||
end
|
||||
if (func3 == 3'b010 && rd == 0 && rs2 == 0) begin
|
||||
if (func7 == 7'b1100000) begin
|
||||
return ("CUS_EXC");
|
||||
end
|
||||
end
|
||||
end
|
||||
return ("ILLEGAL");
|
||||
|
||||
|
|
11
cva6/env/uvme/cvxif_vseq/uvme_cvxif_vseq.sv
vendored
11
cva6/env/uvme/cvxif_vseq/uvme_cvxif_vseq.sv
vendored
|
@ -143,7 +143,7 @@ task uvme_cvxif_vseq_c::do_issue_resp();
|
|||
resp_item.issue_resp.exc = 1;
|
||||
end
|
||||
"CUS_U_ADD" : begin
|
||||
if (req_item.issue_req.mode == 2'b00 && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111) begin
|
||||
if (req_item.issue_req.mode == PRIV_LVL_U && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111) begin
|
||||
resp_item.issue_resp.writeback = 1;
|
||||
resp_item.issue_resp.accept = 1;
|
||||
end
|
||||
|
@ -154,7 +154,7 @@ task uvme_cvxif_vseq_c::do_issue_resp();
|
|||
end
|
||||
end
|
||||
"CUS_S_ADD" : begin
|
||||
if (req_item.issue_req.mode == 2'b01 && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111) begin
|
||||
if (req_item.issue_req.mode == PRIV_LVL_S && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111) begin
|
||||
resp_item.issue_resp.writeback = 1;
|
||||
resp_item.issue_resp.accept = 1;
|
||||
end
|
||||
|
@ -237,7 +237,8 @@ task uvme_cvxif_vseq_c::do_instr_result();
|
|||
end
|
||||
"CUS_EXC": begin
|
||||
resp_item.result.exc = 1;
|
||||
resp_item.result.exccode[5:0] = req_item.issue_req.instr[12:7];
|
||||
resp_item.result.exccode[4:0] = req_item.issue_req.instr[19:15];
|
||||
resp_item.result.exccode[5] = 1'b0;
|
||||
`uvm_info(info_tag, $sformatf("EXCCODE: %d", resp_item.result.exccode), UVM_LOW);
|
||||
end
|
||||
"CUS_ADD_RS3": begin
|
||||
|
@ -250,7 +251,7 @@ task uvme_cvxif_vseq_c::do_instr_result();
|
|||
end
|
||||
end
|
||||
"CUS_U_ADD": begin
|
||||
if (req_item.issue_req.mode == 2'b11 && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111)
|
||||
if (req_item.issue_req.mode == PRIV_LVL_U && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111)
|
||||
resp_item.result.data = req_item.issue_req.rs[0] + req_item.issue_req.rs[1];
|
||||
else begin
|
||||
resp_item.result.exc = 1;
|
||||
|
@ -259,7 +260,7 @@ task uvme_cvxif_vseq_c::do_instr_result();
|
|||
end
|
||||
end
|
||||
"CUS_S_ADD": begin
|
||||
if (req_item.issue_req.mode == 2'b01 && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111)
|
||||
if (req_item.issue_req.mode == PRIV_LVL_S && req_item.issue_req.rs_valid == 2'b11 || req_item.issue_req.rs_valid == 3'b111)
|
||||
resp_item.result.data = req_item.issue_req.rs[0] + req_item.issue_req.rs[1];
|
||||
else begin
|
||||
resp_item.result.exc = 1;
|
||||
|
|
|
@ -36,10 +36,16 @@ typedef struct packed {
|
|||
logic [5:0] exccode;
|
||||
} result_t ;
|
||||
|
||||
typedef enum logic[1:0] {
|
||||
PRIV_LVL_M = 2'b11,
|
||||
PRIV_LVL_S = 2'b01,
|
||||
PRIV_LVL_U = 2'b00
|
||||
} priv_lvl_t;
|
||||
|
||||
typedef struct packed {
|
||||
logic [31:0] instr;
|
||||
logic [X_ID_WIDTH-1:0] id;
|
||||
logic [1:0] mode;
|
||||
priv_lvl_t mode;
|
||||
logic [X_NUM_RS-1:0][X_RFR_WIDTH-1:0] rs;
|
||||
logic [X_NUM_RS-1:0] rs_valid;
|
||||
} x_issue_req;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue