diff --git a/cva6/env/uvme/cvxif_vseq/uvme_cvxif_base_vseq.sv b/cva6/env/uvme/cvxif_vseq/uvme_cvxif_base_vseq.sv index b0cd88d03..cb47ecc3d 100644 --- a/cva6/env/uvme/cvxif_vseq/uvme_cvxif_base_vseq.sv +++ b/cva6/env/uvme/cvxif_vseq/uvme_cvxif_base_vseq.sv @@ -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"); diff --git a/cva6/env/uvme/cvxif_vseq/uvme_cvxif_vseq.sv b/cva6/env/uvme/cvxif_vseq/uvme_cvxif_vseq.sv index d4257db67..a253ad7ca 100644 --- a/cva6/env/uvme/cvxif_vseq/uvme_cvxif_vseq.sv +++ b/cva6/env/uvme/cvxif_vseq/uvme_cvxif_vseq.sv @@ -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; diff --git a/lib/uvm_agents/uvma_cvxif/src/uvma_cvxif_tdefs.sv b/lib/uvm_agents/uvma_cvxif/src/uvma_cvxif_tdefs.sv index 5725b235e..e272d18a3 100644 --- a/lib/uvm_agents/uvma_cvxif/src/uvma_cvxif_tdefs.sv +++ b/lib/uvm_agents/uvma_cvxif/src/uvma_cvxif_tdefs.sv @@ -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;