diff --git a/core/csr_regfile.sv b/core/csr_regfile.sv index 27e2252f9ed..88c16444a40 100644 --- a/core/csr_regfile.sv +++ b/core/csr_regfile.sv @@ -1554,8 +1554,15 @@ module csr_regfile // wait for interrupt wfi_q <= 1'b0; // pmp - pmpcfg_q <= '0; - pmpaddr_q <= '0; + for (int i = 0; i < 16; i++) begin + if (i < CVA6Cfg.NrPMPEntries) begin + pmpcfg_q[i] <= riscv::pmpcfg_t'(CVA6Cfg.PMPCfgRstVal[i]); + pmpaddr_q[i] <= CVA6Cfg.PMPAddrRstVal[i][riscv::PLEN-3:0]; + end else begin + pmpcfg_q[i] <= '0; + pmpaddr_q[i] <= '0; + end + end end else begin priv_lvl_q <= priv_lvl_d; // floating-point registers @@ -1607,12 +1614,16 @@ module csr_regfile for (int i = 0; i < 16; i++) begin if (i < CVA6Cfg.NrPMPEntries) begin // We only support >=8-byte granularity, NA4 is disabled - if(pmpcfg_d[i].addr_mode != riscv::NA4 && !(pmpcfg_d[i].access_type.r == '0 && pmpcfg_d[i].access_type.w == '1)) begin + if(!CVA6Cfg.PMPEntryReadOnly[i] && pmpcfg_d[i].addr_mode != riscv::NA4 && !(pmpcfg_d[i].access_type.r == '0 && pmpcfg_d[i].access_type.w == '1)) begin pmpcfg_q[i] <= pmpcfg_d[i]; end else begin pmpcfg_q[i] <= pmpcfg_q[i]; end - pmpaddr_q[i] <= pmpaddr_d[i]; + if (!CVA6Cfg.PMPEntryReadOnly[i]) begin + pmpaddr_q[i] <= pmpaddr_d[i]; + end else begin + pmpaddr_q[i] <= pmpaddr_q[i]; + end end else begin pmpcfg_q[i] <= '0; pmpaddr_q[i] <= '0; diff --git a/core/include/config_pkg.sv b/core/include/config_pkg.sv index 853bc290b69..829ab57bb2c 100644 --- a/core/include/config_pkg.sv +++ b/core/include/config_pkg.sv @@ -89,6 +89,10 @@ package config_pkg; logic [63:0] DmBaseAddress; /// Number of PMP entries. int unsigned NrPMPEntries; + /// Physical Memory Protection (PMP) CSR reset values and read-only bits + logic [15:0][63:0] PMPCfgRstVal: {16{64'h0}}, + logic [15:0][63:0] PMPAddrRstVal: {16{64'h0}}, + bit [15:0] PMPEntryReadOnly; /// Set to the bus type in use. noc_type_e NOCType; /// Physical Memory Attributes (PMAs) diff --git a/core/include/cv32a60x_config_pkg.sv b/core/include/cv32a60x_config_pkg.sv index 7f00a042607..318caf2ba1c 100644 --- a/core/include/cv32a60x_config_pkg.sv +++ b/core/include/cv32a60x_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv32a6_embedded_config_pkg.sv b/core/include/cv32a6_embedded_config_pkg.sv index f8129a317bf..0181345a1e1 100644 --- a/core/include/cv32a6_embedded_config_pkg.sv +++ b/core/include/cv32a6_embedded_config_pkg.sv @@ -115,6 +115,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv b/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv index b89243cd733..46b88ac4aae 100644 --- a/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv +++ b/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv32a6_imac_sv0_config_pkg.sv b/core/include/cv32a6_imac_sv0_config_pkg.sv index 11be0b699ef..933e94be1a8 100644 --- a/core/include/cv32a6_imac_sv0_config_pkg.sv +++ b/core/include/cv32a6_imac_sv0_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv32a6_imac_sv32_config_pkg.sv b/core/include/cv32a6_imac_sv32_config_pkg.sv index ac0365474c8..a9737428f7d 100644 --- a/core/include/cv32a6_imac_sv32_config_pkg.sv +++ b/core/include/cv32a6_imac_sv32_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv32a6_imafc_sv32_config_pkg.sv b/core/include/cv32a6_imafc_sv32_config_pkg.sv index a74a8c1cdca..ab4ee2c2875 100644 --- a/core/include/cv32a6_imafc_sv32_config_pkg.sv +++ b/core/include/cv32a6_imafc_sv32_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv64a6_imadfcv_sv39_polara_config_pkg.sv b/core/include/cv64a6_imadfcv_sv39_polara_config_pkg.sv index f77599a1e40..5b1ca3647a3 100644 --- a/core/include/cv64a6_imadfcv_sv39_polara_config_pkg.sv +++ b/core/include/cv64a6_imadfcv_sv39_polara_config_pkg.sv @@ -115,6 +115,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_L15_BIG_ENDIAN, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv64a6_imafdc_sv39_config_pkg.sv b/core/include/cv64a6_imafdc_sv39_config_pkg.sv index 4f109453cbe..ec4db64f571 100644 --- a/core/include/cv64a6_imafdc_sv39_config_pkg.sv +++ b/core/include/cv64a6_imafdc_sv39_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv64a6_imafdc_sv39_hpdcache_config_pkg.sv b/core/include/cv64a6_imafdc_sv39_hpdcache_config_pkg.sv index b6573865f62..7436decb259 100644 --- a/core/include/cv64a6_imafdc_sv39_hpdcache_config_pkg.sv +++ b/core/include/cv64a6_imafdc_sv39_hpdcache_config_pkg.sv @@ -123,6 +123,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv64a6_imafdc_sv39_openpiton_config_pkg.sv b/core/include/cv64a6_imafdc_sv39_openpiton_config_pkg.sv index b7809464bbb..add8f15849a 100644 --- a/core/include/cv64a6_imafdc_sv39_openpiton_config_pkg.sv +++ b/core/include/cv64a6_imafdc_sv39_openpiton_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_L15_BIG_ENDIAN, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv64a6_imafdc_sv39_wb_config_pkg.sv b/core/include/cv64a6_imafdc_sv39_wb_config_pkg.sv index 3de80826710..f3ba6c40a43 100644 --- a/core/include/cv64a6_imafdc_sv39_wb_config_pkg.sv +++ b/core/include/cv64a6_imafdc_sv39_wb_config_pkg.sv @@ -116,6 +116,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: diff --git a/core/include/cv64a6_imafdcv_sv39_config_pkg.sv b/core/include/cv64a6_imafdcv_sv39_config_pkg.sv index 5adfaa7d3c9..ff82a05cb54 100644 --- a/core/include/cv64a6_imafdcv_sv39_config_pkg.sv +++ b/core/include/cv64a6_imafdcv_sv39_config_pkg.sv @@ -115,6 +115,9 @@ package cva6_config_pkg; BHTEntries: unsigned'(CVA6ConfigBHTEntries), DmBaseAddress: 64'h0, NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + PMPCfgRstVal: {16{64'h0}}, + PMPAddrRstVal: {16{64'h0}}, + PMPEntryReadOnly: 16'd0, NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, // idempotent region NrNonIdempotentRules: