diff --git a/rtl/ibex_core.sv b/rtl/ibex_core.sv index b5ff81acec..92942d335a 100644 --- a/rtl/ibex_core.sv +++ b/rtl/ibex_core.sv @@ -14,44 +14,44 @@ * Top level module of the ibex RISC-V core */ module ibex_core import ibex_pkg::*; #( - parameter bit PMPEnable = 1'b0, - parameter int unsigned PMPGranularity = 0, - parameter int unsigned PMPNumRegions = 4, - parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst, - parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst, - parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, - parameter int unsigned MHPMCounterNum = 0, - parameter int unsigned MHPMCounterWidth = 40, - parameter bit RV32E = 1'b0, - parameter rv32m_e RV32M = RV32MFast, - parameter rv32b_e RV32B = RV32BNone, - parameter bit BranchTargetALU = 1'b0, - parameter bit WritebackStage = 1'b0, - parameter bit ICache = 1'b0, - parameter bit ICacheECC = 1'b0, - parameter int unsigned BusSizeECC = BUS_SIZE, - parameter int unsigned TagSizeECC = IC_TAG_SIZE, - parameter int unsigned LineSizeECC = IC_LINE_SIZE, - parameter bit BranchPredictor = 1'b0, - parameter bit DbgTriggerEn = 1'b0, - parameter int unsigned DbgHwBreakNum = 1, - parameter bit ResetAll = 1'b0, - parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault, - parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault, - parameter bit SecureIbex = 1'b0, - parameter bit DummyInstructions= 1'b0, - parameter bit RegFileECC = 1'b0, - parameter int unsigned RegFileDataWidth = 32, - parameter bit MemECC = 1'b0, - parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32, - parameter int unsigned DmBaseAddr = 32'h1A110000, - parameter int unsigned DmAddrMask = 32'h00000FFF, - parameter int unsigned DmHaltAddr = 32'h1A110800, - parameter int unsigned DmExceptionAddr = 32'h1A110808, + parameter bit PMPEnable = 1'b0, + parameter int unsigned PMPGranularity = 0, + parameter int unsigned PMPNumRegions = 4, + parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst, + parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst, + parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, + parameter int unsigned MHPMCounterNum = 0, + parameter int unsigned MHPMCounterWidth = 40, + parameter bit RV32E = 1'b0, + parameter rv32m_e RV32M = RV32MFast, + parameter rv32b_e RV32B = RV32BNone, + parameter bit BranchTargetALU = 1'b0, + parameter bit WritebackStage = 1'b0, + parameter bit ICache = 1'b0, + parameter bit ICacheECC = 1'b0, + parameter int unsigned BusSizeECC = BUS_SIZE, + parameter int unsigned TagSizeECC = IC_TAG_SIZE, + parameter int unsigned LineSizeECC = IC_LINE_SIZE, + parameter bit BranchPredictor = 1'b0, + parameter bit DbgTriggerEn = 1'b0, + parameter int unsigned DbgHwBreakNum = 1, + parameter bit ResetAll = 1'b0, + parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault, + parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault, + parameter bit SecureIbex = 1'b0, + parameter bit DummyInstructions = 1'b0, + parameter bit RegFileECC = 1'b0, + parameter int unsigned RegFileDataWidth = 32, + parameter bit MemECC = 1'b0, + parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32, + parameter int unsigned DmBaseAddr = 32'h1A110000, + parameter int unsigned DmAddrMask = 32'h00000FFF, + parameter int unsigned DmHaltAddr = 32'h1A110800, + parameter int unsigned DmExceptionAddr = 32'h1A110808, // mvendorid: encoding of manufacturer/provider - parameter logic [31:0] CsrMvendorId = 32'b0, + parameter logic [31:0] CsrMvendorId = 32'b0, // marchid: encoding of base microarchitecture - parameter logic [31:0] CsrMimpId = 32'b0 + parameter logic [31:0] CsrMimpId = 32'b0 ) ( // Clock and Reset input logic clk_i, @@ -331,11 +331,11 @@ module ibex_core import ibex_pkg::*; #( logic [31:0] csr_mepc, csr_depc; // PMP signals - logic [33:0] csr_pmp_addr [PMPNumRegions]; - pmp_cfg_t csr_pmp_cfg [PMPNumRegions]; - pmp_mseccfg_t csr_pmp_mseccfg; - logic pmp_req_err [PMPNumChan]; - logic data_req_out; + logic [PMP_ADDR_MSB:0] csr_pmp_addr [PMPNumRegions]; + pmp_cfg_t csr_pmp_cfg [PMPNumRegions]; + pmp_mseccfg_t csr_pmp_mseccfg; + logic pmp_req_err [PMPNumChan]; + logic data_req_out; logic csr_save_if; logic csr_save_id; @@ -1170,10 +1170,10 @@ module ibex_core import ibex_pkg::*; #( `ASSERT_KNOWN_IF(IbexCsrWdataIntKnown, cs_registers_i.csr_wdata_int, csr_op_en) if (PMPEnable) begin : g_pmp - logic [31:0] pc_if_inc; - logic [33:0] pmp_req_addr [PMPNumChan]; - pmp_req_e pmp_req_type [PMPNumChan]; - priv_lvl_e pmp_priv_lvl [PMPNumChan]; + logic [31:0] pc_if_inc; + logic [PMP_ADDR_MSB:0] pmp_req_addr [PMPNumChan]; + pmp_req_e pmp_req_type [PMPNumChan]; + priv_lvl_e pmp_priv_lvl [PMPNumChan]; assign pc_if_inc = pc_if + 32'd2; assign pmp_req_addr[PMP_I] = {2'b00, pc_if}; @@ -1206,10 +1206,10 @@ module ibex_core import ibex_pkg::*; #( ); end else begin : g_no_pmp // Unused signal tieoff - priv_lvl_e unused_priv_lvl_ls; - logic [33:0] unused_csr_pmp_addr [PMPNumRegions]; - pmp_cfg_t unused_csr_pmp_cfg [PMPNumRegions]; - pmp_mseccfg_t unused_csr_pmp_mseccfg; + priv_lvl_e unused_priv_lvl_ls; + logic [PMP_ADDR_MSB:0] unused_csr_pmp_addr [PMPNumRegions]; + pmp_cfg_t unused_csr_pmp_cfg [PMPNumRegions]; + pmp_mseccfg_t unused_csr_pmp_mseccfg; assign unused_priv_lvl_ls = priv_mode_lsu; assign unused_csr_pmp_addr = csr_pmp_addr; assign unused_csr_pmp_cfg = csr_pmp_cfg; diff --git a/rtl/ibex_cs_registers.sv b/rtl/ibex_cs_registers.sv index 29e0b8dcb9..11c181b8ce 100644 --- a/rtl/ibex_cs_registers.sv +++ b/rtl/ibex_cs_registers.sv @@ -9,28 +9,28 @@ `include "prim_assert.sv" -module ibex_cs_registers #( - parameter bit DbgTriggerEn = 0, - parameter int unsigned DbgHwBreakNum = 1, - parameter bit DataIndTiming = 1'b0, - parameter bit DummyInstructions = 1'b0, - parameter bit ShadowCSR = 1'b0, - parameter bit ICache = 1'b0, - parameter int unsigned MHPMCounterNum = 10, - parameter int unsigned MHPMCounterWidth = 40, - parameter bit PMPEnable = 0, - parameter int unsigned PMPGranularity = 0, - parameter int unsigned PMPNumRegions = 4, - parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst, - parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst, - parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, - parameter bit RV32E = 0, - parameter ibex_pkg::rv32m_e RV32M = ibex_pkg::RV32MFast, - parameter ibex_pkg::rv32b_e RV32B = ibex_pkg::RV32BNone, +module ibex_cs_registers import ibex_pkg::*; #( + parameter bit DbgTriggerEn = 0, + parameter int unsigned DbgHwBreakNum = 1, + parameter bit DataIndTiming = 1'b0, + parameter bit DummyInstructions = 1'b0, + parameter bit ShadowCSR = 1'b0, + parameter bit ICache = 1'b0, + parameter int unsigned MHPMCounterNum = 10, + parameter int unsigned MHPMCounterWidth = 40, + parameter bit PMPEnable = 0, + parameter int unsigned PMPGranularity = 0, + parameter int unsigned PMPNumRegions = 4, + parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst, + parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst, + parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, + parameter bit RV32E = 0, + parameter ibex_pkg::rv32m_e RV32M = ibex_pkg::RV32MFast, + parameter ibex_pkg::rv32b_e RV32B = ibex_pkg::RV32BNone, // mvendorid: encoding of manufacturer/provider - parameter logic [31:0] CsrMvendorId = 32'b0, + parameter logic [31:0] CsrMvendorId = 32'b0, // mimpid: encoding of processor implementation version - parameter logic [31:0] CsrMimpId = 32'b0 + parameter logic [31:0] CsrMimpId = 32'b0 ) ( // Clock and Reset input logic clk_i, @@ -71,7 +71,7 @@ module ibex_cs_registers #( // PMP output ibex_pkg::pmp_cfg_t csr_pmp_cfg_o [PMPNumRegions], - output logic [33:0] csr_pmp_addr_o [PMPNumRegions], + output logic [PMP_ADDR_MSB:0] csr_pmp_addr_o [PMPNumRegions], output ibex_pkg::pmp_mseccfg_t csr_pmp_mseccfg_o, // debug @@ -128,8 +128,6 @@ module ibex_cs_registers #( input logic div_wait_i // core waiting for divide ); - import ibex_pkg::*; - // Is a PMP config a locked one that allows M-mode execution when MSECCFG.MML is set (either // M mode alone or shared M/U mode execution)? function automatic logic is_mml_m_exec_cfg(ibex_pkg::pmp_cfg_t pmp_cfg); @@ -149,7 +147,7 @@ module ibex_cs_registers #( // All bitmanip configs enable non-ratified sub-extensions localparam int unsigned RV32BExtra = (RV32B != RV32BNone) ? 1 : 0; localparam int unsigned RV32MEnabled = (RV32M == RV32MNone) ? 0 : 1; - localparam int unsigned PMPAddrWidth = (PMPGranularity > 0) ? 33 - PMPGranularity : 32; + localparam int unsigned PMPAddrWidth = (PMPGranularity > 0) ? PMP_ADDR_MSB - PMPGranularity : 32; // misa localparam logic [31:0] MISA_VALUE = @@ -1185,7 +1183,7 @@ module ibex_cs_registers #( // When MSECCFG.MML is set cannot add new regions allowing M mode execution unless MSECCFG.RLB // is set assign pmp_cfg_wr_suppress[i] = pmp_mseccfg_q.mml & - ~pmp_mseccfg.rlb & + ~pmp_mseccfg_q.rlb & is_mml_m_exec_cfg(pmp_cfg_wdata[i]); // -------------------------- @@ -1203,7 +1201,7 @@ module ibex_cs_registers #( ibex_csr #( .Width (PMPAddrWidth), .ShadowCopy(ShadowCSR), - .ResetValue(PMPRstAddr[i][33-:PMPAddrWidth]) + .ResetValue(PMPRstAddr[i][PMP_ADDR_MSB-:PMPAddrWidth]) ) u_pmp_addr_csr ( .clk_i (clk_i), .rst_ni (rst_ni), @@ -1213,7 +1211,7 @@ module ibex_cs_registers #( .rd_error_o(pmp_addr_err[i]) ); - `ASSERT_INIT(PMPAddrRstLowBitsZero_A, PMPRstAddr[i][33-PMPAddrWidth:0] == '0) + `ASSERT_INIT(PMPAddrRstLowBitsZero_A, PMPRstAddr[i][PMP_ADDR_MSB-PMPAddrWidth:0] == '0) assign csr_pmp_cfg_o[i] = pmp_cfg[i]; assign csr_pmp_addr_o[i] = {pmp_addr_rdata[i], 2'b00}; diff --git a/rtl/ibex_lockstep.sv b/rtl/ibex_lockstep.sv index dc2cee0530..cd016827bd 100644 --- a/rtl/ibex_lockstep.sv +++ b/rtl/ibex_lockstep.sv @@ -9,45 +9,45 @@ // SEC_CM: LOGIC.SHADOW module ibex_lockstep import ibex_pkg::*; #( - parameter int unsigned LockstepOffset = 2, - parameter bit PMPEnable = 1'b0, - parameter int unsigned PMPGranularity = 0, - parameter int unsigned PMPNumRegions = 4, - parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst, - parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst, - parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, - parameter int unsigned MHPMCounterNum = 0, - parameter int unsigned MHPMCounterWidth = 40, - parameter bit RV32E = 1'b0, - parameter rv32m_e RV32M = RV32MFast, - parameter rv32b_e RV32B = RV32BNone, - parameter bit BranchTargetALU = 1'b0, - parameter bit WritebackStage = 1'b0, - parameter bit ICache = 1'b0, - parameter bit ICacheECC = 1'b0, - parameter int unsigned BusSizeECC = BUS_SIZE, - parameter int unsigned TagSizeECC = IC_TAG_SIZE, - parameter int unsigned LineSizeECC = IC_LINE_SIZE, - parameter bit BranchPredictor = 1'b0, - parameter bit DbgTriggerEn = 1'b0, - parameter int unsigned DbgHwBreakNum = 1, - parameter bit ResetAll = 1'b0, - parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault, - parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault, - parameter bit SecureIbex = 1'b0, - parameter bit DummyInstructions = 1'b0, - parameter bit RegFileECC = 1'b0, - parameter int unsigned RegFileDataWidth = 32, - parameter bit MemECC = 1'b0, - parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32, - parameter int unsigned DmBaseAddr = 32'h1A110000, - parameter int unsigned DmAddrMask = 32'h00000FFF, - parameter int unsigned DmHaltAddr = 32'h1A110800, - parameter int unsigned DmExceptionAddr = 32'h1A110808, + parameter int unsigned LockstepOffset = 2, + parameter bit PMPEnable = 1'b0, + parameter int unsigned PMPGranularity = 0, + parameter int unsigned PMPNumRegions = 4, + parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst, + parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst, + parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, + parameter int unsigned MHPMCounterNum = 0, + parameter int unsigned MHPMCounterWidth = 40, + parameter bit RV32E = 1'b0, + parameter rv32m_e RV32M = RV32MFast, + parameter rv32b_e RV32B = RV32BNone, + parameter bit BranchTargetALU = 1'b0, + parameter bit WritebackStage = 1'b0, + parameter bit ICache = 1'b0, + parameter bit ICacheECC = 1'b0, + parameter int unsigned BusSizeECC = BUS_SIZE, + parameter int unsigned TagSizeECC = IC_TAG_SIZE, + parameter int unsigned LineSizeECC = IC_LINE_SIZE, + parameter bit BranchPredictor = 1'b0, + parameter bit DbgTriggerEn = 1'b0, + parameter int unsigned DbgHwBreakNum = 1, + parameter bit ResetAll = 1'b0, + parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault, + parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault, + parameter bit SecureIbex = 1'b0, + parameter bit DummyInstructions = 1'b0, + parameter bit RegFileECC = 1'b0, + parameter int unsigned RegFileDataWidth = 32, + parameter bit MemECC = 1'b0, + parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32, + parameter int unsigned DmBaseAddr = 32'h1A110000, + parameter int unsigned DmAddrMask = 32'h00000FFF, + parameter int unsigned DmHaltAddr = 32'h1A110800, + parameter int unsigned DmExceptionAddr = 32'h1A110808, // mvendorid: encoding of manufacturer/provider - parameter logic [31:0] CsrMvendorId = 32'b0, + parameter logic [31:0] CsrMvendorId = 32'b0, // marchid: encoding of base microarchitecture - parameter logic [31:0] CsrMimpId = 32'b0 + parameter logic [31:0] CsrMimpId = 32'b0 ) ( input logic clk_i, input logic rst_ni, diff --git a/rtl/ibex_pkg.sv b/rtl/ibex_pkg.sv index f5cb75a3e7..265abff89b 100644 --- a/rtl/ibex_pkg.sv +++ b/rtl/ibex_pkg.sv @@ -387,6 +387,12 @@ package ibex_pkg; // PMP constants parameter int unsigned PMP_MAX_REGIONS = 16; parameter int unsigned PMP_CFG_W = 8; + // For RV32 the most significant bit of PMP address refers to the physical + // address bit index 33. + parameter int unsigned PMP_ADDR_MSB = 33; + // For RV32 the least significant bit of the PMP CSRs refers to the physical + // address bit index 2. + parameter int unsigned PMP_ADDR_LSB = 2; // PMP access type parameter int unsigned PMP_I = 0; @@ -661,7 +667,7 @@ package ibex_pkg; // See the Ibex Reference Guide (Custom Reset Values under Physical Memory // Protection) for more information. - parameter pmp_cfg_t PmpCfgRst[16] = '{ + parameter pmp_cfg_t PmpCfgRst[PMP_MAX_REGIONS] = '{ '{lock: 1'b0, mode: PMP_MODE_OFF, exec: 1'b0, write: 1'b0, read: 1'b0}, // region 0 '{lock: 1'b0, mode: PMP_MODE_OFF, exec: 1'b0, write: 1'b0, read: 1'b0}, // region 1 '{lock: 1'b0, mode: PMP_MODE_OFF, exec: 1'b0, write: 1'b0, read: 1'b0}, // region 2 @@ -683,7 +689,7 @@ package ibex_pkg; // Addresses are given in byte granularity for readability. A minimum of two // bits will be stripped off the bottom (PMPGranularity == 0) with more stripped // off at coarser granularities. - parameter logic [33:0] PmpAddrRst[16] = '{ + parameter logic [PMP_ADDR_MSB:0] PmpAddrRst[PMP_MAX_REGIONS] = '{ 34'h0, // region 0 34'h0, // region 1 34'h0, // region 2 diff --git a/rtl/ibex_pmp.sv b/rtl/ibex_pmp.sv index 4afa806a47..8b9b08d3eb 100644 --- a/rtl/ibex_pmp.sv +++ b/rtl/ibex_pmp.sv @@ -4,7 +4,7 @@ `include "dv_fcov_macros.svh" -module ibex_pmp #( +module ibex_pmp import ibex_pkg::*; #( parameter int unsigned DmBaseAddr = 32'h1A110000, parameter int unsigned DmAddrMask = 32'h00000FFF, // Granularity of NAPOT access, @@ -16,33 +16,31 @@ module ibex_pmp #( parameter int unsigned PMPNumRegions = 4 ) ( // Interface to CSRs - input ibex_pkg::pmp_cfg_t csr_pmp_cfg_i [PMPNumRegions], - input logic [33:0] csr_pmp_addr_i [PMPNumRegions], - input ibex_pkg::pmp_mseccfg_t csr_pmp_mseccfg_i, + input ibex_pkg::pmp_cfg_t csr_pmp_cfg_i [PMPNumRegions], + input logic [PMP_ADDR_MSB:0] csr_pmp_addr_i [PMPNumRegions], + input ibex_pkg::pmp_mseccfg_t csr_pmp_mseccfg_i, - input logic debug_mode_i, + input logic debug_mode_i, - input ibex_pkg::priv_lvl_e priv_mode_i [PMPNumChan], + input ibex_pkg::priv_lvl_e priv_mode_i [PMPNumChan], // Access checking channels - input logic [33:0] pmp_req_addr_i [PMPNumChan], - input ibex_pkg::pmp_req_e pmp_req_type_i [PMPNumChan], - output logic pmp_req_err_o [PMPNumChan] + input logic [PMP_ADDR_MSB:0] pmp_req_addr_i [PMPNumChan], + input ibex_pkg::pmp_req_e pmp_req_type_i [PMPNumChan], + output logic pmp_req_err_o [PMPNumChan] ); - import ibex_pkg::*; - // Access Checking Signals - logic [33:0] region_start_addr [PMPNumRegions]; - logic [33:PMPGranularity+2] region_addr_mask [PMPNumRegions]; - logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_gt; - logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_lt; - logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_eq; - logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_all; - logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_basic_perm_check; - logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_perm_check; - logic [PMPNumChan-1:0] access_fault_check_res; - logic [PMPNumChan-1:0] debug_mode_allowed_access; + logic [PMP_ADDR_MSB:0] region_start_addr [PMPNumRegions]; + logic [PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB] region_addr_mask [PMPNumRegions]; + logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_gt; + logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_lt; + logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_eq; + logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_match_all; + logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_basic_perm_check; + logic [PMPNumChan-1:0][PMPNumRegions-1:0] region_perm_check; + logic [PMPNumChan-1:0] access_fault_check_res; + logic [PMPNumChan-1:0] debug_mode_allowed_access; /////////////////////// // Functions for PMP // @@ -166,9 +164,9 @@ module ibex_pmp #( csr_pmp_addr_i[r]; end // Address mask for NA matching - for (genvar b = PMPGranularity + 2; b < 34; b++) begin : g_bitmask - if (b == 2) begin : g_bit0 - // Always mask bit 2 for NAPOT + for (genvar b = PMPGranularity + PMP_ADDR_LSB; b < 34; b++) begin : g_bitmask + if (b == PMP_ADDR_LSB) begin : g_bit0 + // Always mask bit 2 (PMP_ADDR_LSB) for NAPOT assign region_addr_mask[r][b] = (csr_pmp_cfg_i[r].mode != PMP_MODE_NAPOT); end else begin : g_others // We will mask this bit if it is within the programmed granule @@ -178,7 +176,7 @@ module ibex_pmp #( // thus mask = 1111 0000 if (PMPGranularity == 0) begin : g_region_addr_mask_zero_granularity assign region_addr_mask[r][b] = (csr_pmp_cfg_i[r].mode != PMP_MODE_NAPOT) | - ~&csr_pmp_addr_i[r][b-1:2]; + ~&csr_pmp_addr_i[r][b-1:PMP_ADDR_LSB]; end else begin : g_region_addr_mask_other_granularity assign region_addr_mask[r][b] = (csr_pmp_cfg_i[r].mode != PMP_MODE_NAPOT) | ~&csr_pmp_addr_i[r][b-1:PMPGranularity+1]; @@ -190,14 +188,15 @@ module ibex_pmp #( for (genvar c = 0; c < PMPNumChan; c++) begin : g_access_check for (genvar r = 0; r < PMPNumRegions; r++) begin : g_regions // Comparators are sized according to granularity - assign region_match_eq[c][r] = (pmp_req_addr_i[c][33:PMPGranularity+2] & - region_addr_mask[r]) == - (region_start_addr[r][33:PMPGranularity+2] & - region_addr_mask[r]); - assign region_match_gt[c][r] = pmp_req_addr_i[c][33:PMPGranularity+2] > - region_start_addr[r][33:PMPGranularity+2]; - assign region_match_lt[c][r] = pmp_req_addr_i[c][33:PMPGranularity+2] < - csr_pmp_addr_i[r][33:PMPGranularity+2]; + assign region_match_eq[c][r] = + (pmp_req_addr_i[c][PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB] & region_addr_mask[r]) == + (region_start_addr[r][PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB] & region_addr_mask[r]); + assign region_match_gt[c][r] = + pmp_req_addr_i[c][PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB] > + region_start_addr[r][PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB]; + assign region_match_lt[c][r] = + pmp_req_addr_i[c][PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB] < + csr_pmp_addr_i[r][PMP_ADDR_MSB:PMPGranularity+PMP_ADDR_LSB]; always_comb begin region_match_all[c][r] = 1'b0; @@ -229,8 +228,8 @@ module ibex_pmp #( // Address bits below PMP granularity (which starts at 4 byte) are deliberately unused. logic unused_sigs; - assign unused_sigs = ^{region_start_addr[r][PMPGranularity+2-1:0], - pmp_req_addr_i[c][PMPGranularity+2-1:0]}; + assign unused_sigs = ^{region_start_addr[r][PMPGranularity+PMP_ADDR_LSB-1:0], + pmp_req_addr_i[c][PMPGranularity+PMP_ADDR_LSB-1:0]}; end // Determine whether the core is in debug mode and the access is to an address in the range of diff --git a/rtl/ibex_top.sv b/rtl/ibex_top.sv index acf1e2502d..823fa792fc 100644 --- a/rtl/ibex_top.sv +++ b/rtl/ibex_top.sv @@ -18,8 +18,8 @@ module ibex_top import ibex_pkg::*; #( parameter int unsigned PMPNumRegions = 4, parameter int unsigned MHPMCounterNum = 0, parameter int unsigned MHPMCounterWidth = 40, - parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst, - parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst, + parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst, + parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst, parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst, parameter bit RV32E = 1'b0, parameter rv32m_e RV32M = RV32MFast,