Skip to content

Commit 89bc3ef

Browse files
[pmp] MSB and LSB of PMP address now params
Instead of hardcoding 33 and 2 all over the code base as the most significant and least significant bit of the PMP address, this change creates appropriate parameters in the Ibex package that can be re-used in the rest of the code base. This commit also replaces some hard-coded 16 values with PMP_MAX_REGIONS which was already a parameter in the Ibex package.
1 parent 1f2232a commit 89bc3ef

File tree

6 files changed

+152
-147
lines changed

6 files changed

+152
-147
lines changed

rtl/ibex_core.sv

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,44 +14,44 @@
1414
* Top level module of the ibex RISC-V core
1515
*/
1616
module ibex_core import ibex_pkg::*; #(
17-
parameter bit PMPEnable = 1'b0,
18-
parameter int unsigned PMPGranularity = 0,
19-
parameter int unsigned PMPNumRegions = 4,
20-
parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst,
21-
parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst,
22-
parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst,
23-
parameter int unsigned MHPMCounterNum = 0,
24-
parameter int unsigned MHPMCounterWidth = 40,
25-
parameter bit RV32E = 1'b0,
26-
parameter rv32m_e RV32M = RV32MFast,
27-
parameter rv32b_e RV32B = RV32BNone,
28-
parameter bit BranchTargetALU = 1'b0,
29-
parameter bit WritebackStage = 1'b0,
30-
parameter bit ICache = 1'b0,
31-
parameter bit ICacheECC = 1'b0,
32-
parameter int unsigned BusSizeECC = BUS_SIZE,
33-
parameter int unsigned TagSizeECC = IC_TAG_SIZE,
34-
parameter int unsigned LineSizeECC = IC_LINE_SIZE,
35-
parameter bit BranchPredictor = 1'b0,
36-
parameter bit DbgTriggerEn = 1'b0,
37-
parameter int unsigned DbgHwBreakNum = 1,
38-
parameter bit ResetAll = 1'b0,
39-
parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault,
40-
parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault,
41-
parameter bit SecureIbex = 1'b0,
42-
parameter bit DummyInstructions= 1'b0,
43-
parameter bit RegFileECC = 1'b0,
44-
parameter int unsigned RegFileDataWidth = 32,
45-
parameter bit MemECC = 1'b0,
46-
parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32,
47-
parameter int unsigned DmBaseAddr = 32'h1A110000,
48-
parameter int unsigned DmAddrMask = 32'h00000FFF,
49-
parameter int unsigned DmHaltAddr = 32'h1A110800,
50-
parameter int unsigned DmExceptionAddr = 32'h1A110808,
17+
parameter bit PMPEnable = 1'b0,
18+
parameter int unsigned PMPGranularity = 0,
19+
parameter int unsigned PMPNumRegions = 4,
20+
parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst,
21+
parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst,
22+
parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst,
23+
parameter int unsigned MHPMCounterNum = 0,
24+
parameter int unsigned MHPMCounterWidth = 40,
25+
parameter bit RV32E = 1'b0,
26+
parameter rv32m_e RV32M = RV32MFast,
27+
parameter rv32b_e RV32B = RV32BNone,
28+
parameter bit BranchTargetALU = 1'b0,
29+
parameter bit WritebackStage = 1'b0,
30+
parameter bit ICache = 1'b0,
31+
parameter bit ICacheECC = 1'b0,
32+
parameter int unsigned BusSizeECC = BUS_SIZE,
33+
parameter int unsigned TagSizeECC = IC_TAG_SIZE,
34+
parameter int unsigned LineSizeECC = IC_LINE_SIZE,
35+
parameter bit BranchPredictor = 1'b0,
36+
parameter bit DbgTriggerEn = 1'b0,
37+
parameter int unsigned DbgHwBreakNum = 1,
38+
parameter bit ResetAll = 1'b0,
39+
parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault,
40+
parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault,
41+
parameter bit SecureIbex = 1'b0,
42+
parameter bit DummyInstructions = 1'b0,
43+
parameter bit RegFileECC = 1'b0,
44+
parameter int unsigned RegFileDataWidth = 32,
45+
parameter bit MemECC = 1'b0,
46+
parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32,
47+
parameter int unsigned DmBaseAddr = 32'h1A110000,
48+
parameter int unsigned DmAddrMask = 32'h00000FFF,
49+
parameter int unsigned DmHaltAddr = 32'h1A110800,
50+
parameter int unsigned DmExceptionAddr = 32'h1A110808,
5151
// mvendorid: encoding of manufacturer/provider
52-
parameter logic [31:0] CsrMvendorId = 32'b0,
52+
parameter logic [31:0] CsrMvendorId = 32'b0,
5353
// marchid: encoding of base microarchitecture
54-
parameter logic [31:0] CsrMimpId = 32'b0
54+
parameter logic [31:0] CsrMimpId = 32'b0
5555
) (
5656
// Clock and Reset
5757
input logic clk_i,
@@ -331,11 +331,11 @@ module ibex_core import ibex_pkg::*; #(
331331
logic [31:0] csr_mepc, csr_depc;
332332

333333
// PMP signals
334-
logic [33:0] csr_pmp_addr [PMPNumRegions];
335-
pmp_cfg_t csr_pmp_cfg [PMPNumRegions];
336-
pmp_mseccfg_t csr_pmp_mseccfg;
337-
logic pmp_req_err [PMPNumChan];
338-
logic data_req_out;
334+
logic [PMP_ADDR_MSB:0] csr_pmp_addr [PMPNumRegions];
335+
pmp_cfg_t csr_pmp_cfg [PMPNumRegions];
336+
pmp_mseccfg_t csr_pmp_mseccfg;
337+
logic pmp_req_err [PMPNumChan];
338+
logic data_req_out;
339339

340340
logic csr_save_if;
341341
logic csr_save_id;
@@ -1170,10 +1170,10 @@ module ibex_core import ibex_pkg::*; #(
11701170
`ASSERT_KNOWN_IF(IbexCsrWdataIntKnown, cs_registers_i.csr_wdata_int, csr_op_en)
11711171

11721172
if (PMPEnable) begin : g_pmp
1173-
logic [31:0] pc_if_inc;
1174-
logic [33:0] pmp_req_addr [PMPNumChan];
1175-
pmp_req_e pmp_req_type [PMPNumChan];
1176-
priv_lvl_e pmp_priv_lvl [PMPNumChan];
1173+
logic [31:0] pc_if_inc;
1174+
logic [PMP_ADDR_MSB:0] pmp_req_addr [PMPNumChan];
1175+
pmp_req_e pmp_req_type [PMPNumChan];
1176+
priv_lvl_e pmp_priv_lvl [PMPNumChan];
11771177

11781178
assign pc_if_inc = pc_if + 32'd2;
11791179
assign pmp_req_addr[PMP_I] = {2'b00, pc_if};
@@ -1206,10 +1206,10 @@ module ibex_core import ibex_pkg::*; #(
12061206
);
12071207
end else begin : g_no_pmp
12081208
// Unused signal tieoff
1209-
priv_lvl_e unused_priv_lvl_ls;
1210-
logic [33:0] unused_csr_pmp_addr [PMPNumRegions];
1211-
pmp_cfg_t unused_csr_pmp_cfg [PMPNumRegions];
1212-
pmp_mseccfg_t unused_csr_pmp_mseccfg;
1209+
priv_lvl_e unused_priv_lvl_ls;
1210+
logic [PMP_ADDR_MSB:0] unused_csr_pmp_addr [PMPNumRegions];
1211+
pmp_cfg_t unused_csr_pmp_cfg [PMPNumRegions];
1212+
pmp_mseccfg_t unused_csr_pmp_mseccfg;
12131213
assign unused_priv_lvl_ls = priv_mode_lsu;
12141214
assign unused_csr_pmp_addr = csr_pmp_addr;
12151215
assign unused_csr_pmp_cfg = csr_pmp_cfg;

rtl/ibex_cs_registers.sv

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,28 @@
99

1010
`include "prim_assert.sv"
1111

12-
module ibex_cs_registers #(
13-
parameter bit DbgTriggerEn = 0,
14-
parameter int unsigned DbgHwBreakNum = 1,
15-
parameter bit DataIndTiming = 1'b0,
16-
parameter bit DummyInstructions = 1'b0,
17-
parameter bit ShadowCSR = 1'b0,
18-
parameter bit ICache = 1'b0,
19-
parameter int unsigned MHPMCounterNum = 10,
20-
parameter int unsigned MHPMCounterWidth = 40,
21-
parameter bit PMPEnable = 0,
22-
parameter int unsigned PMPGranularity = 0,
23-
parameter int unsigned PMPNumRegions = 4,
24-
parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst,
25-
parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst,
26-
parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst,
27-
parameter bit RV32E = 0,
28-
parameter ibex_pkg::rv32m_e RV32M = ibex_pkg::RV32MFast,
29-
parameter ibex_pkg::rv32b_e RV32B = ibex_pkg::RV32BNone,
12+
module ibex_cs_registers import ibex_pkg::*; #(
13+
parameter bit DbgTriggerEn = 0,
14+
parameter int unsigned DbgHwBreakNum = 1,
15+
parameter bit DataIndTiming = 1'b0,
16+
parameter bit DummyInstructions = 1'b0,
17+
parameter bit ShadowCSR = 1'b0,
18+
parameter bit ICache = 1'b0,
19+
parameter int unsigned MHPMCounterNum = 10,
20+
parameter int unsigned MHPMCounterWidth = 40,
21+
parameter bit PMPEnable = 0,
22+
parameter int unsigned PMPGranularity = 0,
23+
parameter int unsigned PMPNumRegions = 4,
24+
parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst,
25+
parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst,
26+
parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst,
27+
parameter bit RV32E = 0,
28+
parameter ibex_pkg::rv32m_e RV32M = ibex_pkg::RV32MFast,
29+
parameter ibex_pkg::rv32b_e RV32B = ibex_pkg::RV32BNone,
3030
// mvendorid: encoding of manufacturer/provider
31-
parameter logic [31:0] CsrMvendorId = 32'b0,
31+
parameter logic [31:0] CsrMvendorId = 32'b0,
3232
// mimpid: encoding of processor implementation version
33-
parameter logic [31:0] CsrMimpId = 32'b0
33+
parameter logic [31:0] CsrMimpId = 32'b0
3434
) (
3535
// Clock and Reset
3636
input logic clk_i,
@@ -71,7 +71,7 @@ module ibex_cs_registers #(
7171

7272
// PMP
7373
output ibex_pkg::pmp_cfg_t csr_pmp_cfg_o [PMPNumRegions],
74-
output logic [33:0] csr_pmp_addr_o [PMPNumRegions],
74+
output logic [PMP_ADDR_MSB:0] csr_pmp_addr_o [PMPNumRegions],
7575
output ibex_pkg::pmp_mseccfg_t csr_pmp_mseccfg_o,
7676

7777
// debug
@@ -149,7 +149,7 @@ module ibex_cs_registers #(
149149
// All bitmanip configs enable non-ratified sub-extensions
150150
localparam int unsigned RV32BExtra = (RV32B != RV32BNone) ? 1 : 0;
151151
localparam int unsigned RV32MEnabled = (RV32M == RV32MNone) ? 0 : 1;
152-
localparam int unsigned PMPAddrWidth = (PMPGranularity > 0) ? 33 - PMPGranularity : 32;
152+
localparam int unsigned PMPAddrWidth = (PMPGranularity > 0) ? PMP_ADDR_MSB - PMPGranularity : 32;
153153

154154
// misa
155155
localparam logic [31:0] MISA_VALUE =
@@ -1203,7 +1203,7 @@ module ibex_cs_registers #(
12031203
ibex_csr #(
12041204
.Width (PMPAddrWidth),
12051205
.ShadowCopy(ShadowCSR),
1206-
.ResetValue(PMPRstAddr[i][33-:PMPAddrWidth])
1206+
.ResetValue(PMPRstAddr[i][PMP_ADDR_MSB-:PMPAddrWidth])
12071207
) u_pmp_addr_csr (
12081208
.clk_i (clk_i),
12091209
.rst_ni (rst_ni),
@@ -1213,7 +1213,7 @@ module ibex_cs_registers #(
12131213
.rd_error_o(pmp_addr_err[i])
12141214
);
12151215

1216-
`ASSERT_INIT(PMPAddrRstLowBitsZero_A, PMPRstAddr[i][33-PMPAddrWidth:0] == '0)
1216+
`ASSERT_INIT(PMPAddrRstLowBitsZero_A, PMPRstAddr[i][PMP_ADDR_MSB-PMPAddrWidth:0] == '0)
12171217

12181218
assign csr_pmp_cfg_o[i] = pmp_cfg[i];
12191219
assign csr_pmp_addr_o[i] = {pmp_addr_rdata[i], 2'b00};

rtl/ibex_lockstep.sv

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,45 +9,45 @@
99

1010
// SEC_CM: LOGIC.SHADOW
1111
module ibex_lockstep import ibex_pkg::*; #(
12-
parameter int unsigned LockstepOffset = 2,
13-
parameter bit PMPEnable = 1'b0,
14-
parameter int unsigned PMPGranularity = 0,
15-
parameter int unsigned PMPNumRegions = 4,
16-
parameter ibex_pkg::pmp_cfg_t PMPRstCfg[16] = ibex_pkg::PmpCfgRst,
17-
parameter logic [33:0] PMPRstAddr[16] = ibex_pkg::PmpAddrRst,
18-
parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst,
19-
parameter int unsigned MHPMCounterNum = 0,
20-
parameter int unsigned MHPMCounterWidth = 40,
21-
parameter bit RV32E = 1'b0,
22-
parameter rv32m_e RV32M = RV32MFast,
23-
parameter rv32b_e RV32B = RV32BNone,
24-
parameter bit BranchTargetALU = 1'b0,
25-
parameter bit WritebackStage = 1'b0,
26-
parameter bit ICache = 1'b0,
27-
parameter bit ICacheECC = 1'b0,
28-
parameter int unsigned BusSizeECC = BUS_SIZE,
29-
parameter int unsigned TagSizeECC = IC_TAG_SIZE,
30-
parameter int unsigned LineSizeECC = IC_LINE_SIZE,
31-
parameter bit BranchPredictor = 1'b0,
32-
parameter bit DbgTriggerEn = 1'b0,
33-
parameter int unsigned DbgHwBreakNum = 1,
34-
parameter bit ResetAll = 1'b0,
35-
parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault,
36-
parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault,
37-
parameter bit SecureIbex = 1'b0,
38-
parameter bit DummyInstructions = 1'b0,
39-
parameter bit RegFileECC = 1'b0,
40-
parameter int unsigned RegFileDataWidth = 32,
41-
parameter bit MemECC = 1'b0,
42-
parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32,
43-
parameter int unsigned DmBaseAddr = 32'h1A110000,
44-
parameter int unsigned DmAddrMask = 32'h00000FFF,
45-
parameter int unsigned DmHaltAddr = 32'h1A110800,
46-
parameter int unsigned DmExceptionAddr = 32'h1A110808,
12+
parameter int unsigned LockstepOffset = 2,
13+
parameter bit PMPEnable = 1'b0,
14+
parameter int unsigned PMPGranularity = 0,
15+
parameter int unsigned PMPNumRegions = 4,
16+
parameter ibex_pkg::pmp_cfg_t PMPRstCfg[PMP_MAX_REGIONS] = ibex_pkg::PmpCfgRst,
17+
parameter logic [PMP_ADDR_MSB:0] PMPRstAddr[PMP_MAX_REGIONS] = ibex_pkg::PmpAddrRst,
18+
parameter ibex_pkg::pmp_mseccfg_t PMPRstMsecCfg = ibex_pkg::PmpMseccfgRst,
19+
parameter int unsigned MHPMCounterNum = 0,
20+
parameter int unsigned MHPMCounterWidth = 40,
21+
parameter bit RV32E = 1'b0,
22+
parameter rv32m_e RV32M = RV32MFast,
23+
parameter rv32b_e RV32B = RV32BNone,
24+
parameter bit BranchTargetALU = 1'b0,
25+
parameter bit WritebackStage = 1'b0,
26+
parameter bit ICache = 1'b0,
27+
parameter bit ICacheECC = 1'b0,
28+
parameter int unsigned BusSizeECC = BUS_SIZE,
29+
parameter int unsigned TagSizeECC = IC_TAG_SIZE,
30+
parameter int unsigned LineSizeECC = IC_LINE_SIZE,
31+
parameter bit BranchPredictor = 1'b0,
32+
parameter bit DbgTriggerEn = 1'b0,
33+
parameter int unsigned DbgHwBreakNum = 1,
34+
parameter bit ResetAll = 1'b0,
35+
parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault,
36+
parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault,
37+
parameter bit SecureIbex = 1'b0,
38+
parameter bit DummyInstructions = 1'b0,
39+
parameter bit RegFileECC = 1'b0,
40+
parameter int unsigned RegFileDataWidth = 32,
41+
parameter bit MemECC = 1'b0,
42+
parameter int unsigned MemDataWidth = MemECC ? 32 + 7 : 32,
43+
parameter int unsigned DmBaseAddr = 32'h1A110000,
44+
parameter int unsigned DmAddrMask = 32'h00000FFF,
45+
parameter int unsigned DmHaltAddr = 32'h1A110800,
46+
parameter int unsigned DmExceptionAddr = 32'h1A110808,
4747
// mvendorid: encoding of manufacturer/provider
48-
parameter logic [31:0] CsrMvendorId = 32'b0,
48+
parameter logic [31:0] CsrMvendorId = 32'b0,
4949
// marchid: encoding of base microarchitecture
50-
parameter logic [31:0] CsrMimpId = 32'b0
50+
parameter logic [31:0] CsrMimpId = 32'b0
5151
) (
5252
input logic clk_i,
5353
input logic rst_ni,

rtl/ibex_pkg.sv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,12 @@ package ibex_pkg;
387387
// PMP constants
388388
parameter int unsigned PMP_MAX_REGIONS = 16;
389389
parameter int unsigned PMP_CFG_W = 8;
390+
// For RV32 the most significant bit of PMP address refers to the physical
391+
// address bit index 33.
392+
parameter int unsigned PMP_ADDR_MSB = 33;
393+
// For RV32 the least significant bit of the PMP CSRs refers to the physical
394+
// address bit index 2.
395+
parameter int unsigned PMP_ADDR_LSB = 2;
390396

391397
// PMP access type
392398
parameter int unsigned PMP_I = 0;

0 commit comments

Comments
 (0)