mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Start to parameterize number of PMP Entries
This commit is contained in:
parent
cfe5c27946
commit
9a17556de4
@ -51,6 +51,9 @@
|
|||||||
`define ITLB_ENTRY_BITS 5
|
`define ITLB_ENTRY_BITS 5
|
||||||
`define DTLB_ENTRY_BITS 5
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
|
// Legal number of PMP entries are 0, 16, or 64
|
||||||
|
`define PMP_ENTRIES 16
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 32'h80000000
|
`define RESET_VECTOR 32'h80000000
|
||||||
|
|
||||||
|
@ -52,6 +52,9 @@
|
|||||||
`define ITLB_ENTRY_BITS 5
|
`define ITLB_ENTRY_BITS 5
|
||||||
`define DTLB_ENTRY_BITS 5
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
|
// Legal number of PMP entries are 0, 16, or 64
|
||||||
|
`define PMP_ENTRIES 16
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000080000000
|
`define RESET_VECTOR 64'h0000000080000000
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ module dmem (
|
|||||||
input logic HWRITE,
|
input logic HWRITE,
|
||||||
input logic AtomicAccessM, WriteAccessM, ReadAccessM, // execute access is hardwired to zero in this mmu because we're only working with data in the M stage.
|
input logic AtomicAccessM, WriteAccessM, ReadAccessM, // execute access is hardwired to zero in this mmu because we're only working with data in the M stage.
|
||||||
input logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW, // *** all of these come from the privileged unit, so thwyre gonna have to come over into ifu and dmem
|
input logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW, // *** all of these come from the privileged unit, so thwyre gonna have to come over into ifu and dmem
|
||||||
input logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15], // *** this one especially has a large note attached to it in pmpchecker.
|
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1], // *** this one especially has a large note attached to it in pmpchecker.
|
||||||
|
|
||||||
output logic PMALoadAccessFaultM, PMAStoreAccessFaultM,
|
output logic PMALoadAccessFaultM, PMAStoreAccessFaultM,
|
||||||
output logic PMPLoadAccessFaultM, PMPStoreAccessFaultM, // *** can these be parameterized? we dont need the m stage ones for the immu and vice versa.
|
output logic PMPLoadAccessFaultM, PMPStoreAccessFaultM, // *** can these be parameterized? we dont need the m stage ones for the immu and vice versa.
|
||||||
|
@ -79,8 +79,8 @@ module ifu (
|
|||||||
input logic [2:0] HSIZE, HBURST,
|
input logic [2:0] HSIZE, HBURST,
|
||||||
input logic HWRITE,
|
input logic HWRITE,
|
||||||
input logic ExecuteAccessF, //read, write, and atomic access are all set to zero because this mmu is onlt working with instructinos in the F stage.
|
input logic ExecuteAccessF, //read, write, and atomic access are all set to zero because this mmu is onlt working with instructinos in the F stage.
|
||||||
input logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW, // *** all of these come from the privileged unit, so thwyre gonna have to come over into ifu and dmem
|
input logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW, // *** all of these come from the privileged unit, so they're gonna have to come over into ifu and dmem
|
||||||
input logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15], // *** this one especially has a large note attached to it in pmpchecker.
|
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1],
|
||||||
|
|
||||||
output logic PMPInstrAccessFaultF, PMAInstrAccessFaultF,
|
output logic PMPInstrAccessFaultF, PMAInstrAccessFaultF,
|
||||||
output logic ISquashBusAccessF,
|
output logic ISquashBusAccessF,
|
||||||
|
@ -70,7 +70,7 @@ module mmu #(parameter ENTRY_BITS = 3,
|
|||||||
input logic HWRITE,
|
input logic HWRITE,
|
||||||
input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM,
|
input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM,
|
||||||
input logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW, // *** all of these come from the privileged unit, so thwyre gonna have to come over into ifu and dmem
|
input logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW, // *** all of these come from the privileged unit, so thwyre gonna have to come over into ifu and dmem
|
||||||
input logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15], // *** this one especially has a large note attached to it in pmpchecker.
|
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1],
|
||||||
|
|
||||||
output logic SquashBusAccess, // *** send to privileged unit
|
output logic SquashBusAccess, // *** send to privileged unit
|
||||||
output logic PMPInstrAccessFaultF, PMPLoadAccessFaultM, PMPStoreAccessFaultM,
|
output logic PMPInstrAccessFaultF, PMPLoadAccessFaultM, PMPStoreAccessFaultM,
|
||||||
|
@ -48,7 +48,7 @@ module pmpchecker (
|
|||||||
// boundary. It would be better to store the PMP address registers in a module
|
// boundary. It would be better to store the PMP address registers in a module
|
||||||
// somewhere in the CSR hierarchy and do PMP checking _within_ that module, so
|
// somewhere in the CSR hierarchy and do PMP checking _within_ that module, so
|
||||||
// we don't have to pass around 16 whole registers.
|
// we don't have to pass around 16 whole registers.
|
||||||
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15],
|
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1],
|
||||||
|
|
||||||
input logic ExecuteAccessF, WriteAccessM, ReadAccessM,
|
input logic ExecuteAccessF, WriteAccessM, ReadAccessM,
|
||||||
|
|
||||||
@ -89,9 +89,9 @@ module pmpchecker (
|
|||||||
.Match(Regions[0]));
|
.Match(Regions[0]));
|
||||||
assign ActiveRegion[0] = |PMPCFG[0][4:3];
|
assign ActiveRegion[0] = |PMPCFG[0][4:3];
|
||||||
|
|
||||||
generate
|
generate // *** only for PMP_ENTRIES > 0
|
||||||
genvar i;
|
genvar i;
|
||||||
for (i = 1; i < 16; i++) begin
|
for (i = 1; i < `PMP_ENTRIES; i++) begin
|
||||||
pmpadrdec pmpadrdec(.HADDR(HADDR), .AdrMode(PMPCFG[i][4:3]),
|
pmpadrdec pmpadrdec(.HADDR(HADDR), .AdrMode(PMPCFG[i][4:3]),
|
||||||
.CurrentPMPAdr(PMPADDR_ARRAY_REGW[i]),
|
.CurrentPMPAdr(PMPADDR_ARRAY_REGW[i]),
|
||||||
.AdrAtLeastPreviousPMP(AboveRegion[i-1]),
|
.AdrAtLeastPreviousPMP(AboveRegion[i-1]),
|
||||||
|
@ -60,7 +60,7 @@ module csr #(parameter
|
|||||||
output logic STATUS_MXR, STATUS_SUM,
|
output logic STATUS_MXR, STATUS_SUM,
|
||||||
output logic STATUS_MPRV,
|
output logic STATUS_MPRV,
|
||||||
output logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW,
|
output logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW,
|
||||||
output logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15],
|
output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1],
|
||||||
input logic [4:0] SetFflagsM,
|
input logic [4:0] SetFflagsM,
|
||||||
output logic [2:0] FRM_REGW,
|
output logic [2:0] FRM_REGW,
|
||||||
// output logic [11:0] MIP_REGW, SIP_REGW, UIP_REGW, MIE_REGW, SIE_REGW, UIE_REGW,
|
// output logic [11:0] MIP_REGW, SIP_REGW, UIP_REGW, MIE_REGW, SIE_REGW, UIE_REGW,
|
||||||
|
@ -93,7 +93,7 @@ module csrm #(parameter
|
|||||||
output logic [`XLEN-1:0] MEDELEG_REGW, MIDELEG_REGW,
|
output logic [`XLEN-1:0] MEDELEG_REGW, MIDELEG_REGW,
|
||||||
// 64-bit registers in RV64, or two 32-bit registers in RV32
|
// 64-bit registers in RV64, or two 32-bit registers in RV32
|
||||||
output logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW,
|
output logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW,
|
||||||
output logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15],
|
output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1],
|
||||||
input logic [11:0] MIP_REGW, MIE_REGW,
|
input logic [11:0] MIP_REGW, MIE_REGW,
|
||||||
output logic WriteMSTATUSM,
|
output logic WriteMSTATUSM,
|
||||||
output logic IllegalCSRMAccessM, IllegalCSRMWriteReadonlyM
|
output logic IllegalCSRMAccessM, IllegalCSRMWriteReadonlyM
|
||||||
@ -171,10 +171,10 @@ module csrm #(parameter
|
|||||||
endgenerate
|
endgenerate
|
||||||
flopenl #(32) MCOUNTINHIBITreg(clk, reset, WriteMCOUNTINHIBITM, CSRWriteValM[31:0], ALL_ONES, MCOUNTINHIBIT_REGW);
|
flopenl #(32) MCOUNTINHIBITreg(clk, reset, WriteMCOUNTINHIBITM, CSRWriteValM[31:0], ALL_ONES, MCOUNTINHIBIT_REGW);
|
||||||
|
|
||||||
// There are 16 PMPADDR registers, each of which has its own flop
|
// There are PMP_ENTRIES = 0, 16, or 64 PMPADDR registers, each of which has its own flop
|
||||||
generate
|
generate
|
||||||
genvar i;
|
genvar i;
|
||||||
for (i = 0; i < 16; i++) begin: pmp_flop
|
for (i = 0; i < `PMP_ENTRIES-1; i++) begin: pmp_flop
|
||||||
flopenr #(`XLEN) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM, PMPADDR_ARRAY_REGW[i]);
|
flopenr #(`XLEN) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM, PMPADDR_ARRAY_REGW[i]);
|
||||||
end
|
end
|
||||||
endgenerate
|
endgenerate
|
||||||
@ -221,7 +221,7 @@ module csrm #(parameter
|
|||||||
PMPCFG1: CSRMReadValM = {{(`XLEN-32){1'b0}}, PMPCFG01_REGW[63:31]};
|
PMPCFG1: CSRMReadValM = {{(`XLEN-32){1'b0}}, PMPCFG01_REGW[63:31]};
|
||||||
PMPCFG2: CSRMReadValM = PMPCFG23_REGW[`XLEN-1:0];
|
PMPCFG2: CSRMReadValM = PMPCFG23_REGW[`XLEN-1:0];
|
||||||
PMPCFG3: CSRMReadValM = {{(`XLEN-32){1'b0}}, PMPCFG23_REGW[63:31]};
|
PMPCFG3: CSRMReadValM = {{(`XLEN-32){1'b0}}, PMPCFG23_REGW[63:31]};
|
||||||
PMPADDR0: CSRMReadValM = PMPADDR_ARRAY_REGW[0];
|
PMPADDR0: CSRMReadValM = PMPADDR_ARRAY_REGW[0]; // *** make configurable
|
||||||
PMPADDR1: CSRMReadValM = PMPADDR_ARRAY_REGW[1];
|
PMPADDR1: CSRMReadValM = PMPADDR_ARRAY_REGW[1];
|
||||||
PMPADDR2: CSRMReadValM = PMPADDR_ARRAY_REGW[2];
|
PMPADDR2: CSRMReadValM = PMPADDR_ARRAY_REGW[2];
|
||||||
PMPADDR3: CSRMReadValM = PMPADDR_ARRAY_REGW[3];
|
PMPADDR3: CSRMReadValM = PMPADDR_ARRAY_REGW[3];
|
||||||
|
@ -68,7 +68,7 @@ module privileged (
|
|||||||
output logic [`XLEN-1:0] SATP_REGW,
|
output logic [`XLEN-1:0] SATP_REGW,
|
||||||
output logic STATUS_MXR, STATUS_SUM,
|
output logic STATUS_MXR, STATUS_SUM,
|
||||||
output logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW,
|
output logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW,
|
||||||
output logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15], //*** to be sent up through wallypipelinedhart into the pma/pmp in ifu and dmem. *** is it a bad idea to have this huge bus running all over?
|
output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1],
|
||||||
output logic [2:0] FRM_REGW
|
output logic [2:0] FRM_REGW
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ module wallypipelinedhart (
|
|||||||
logic PMAInstrAccessFaultF, PMALoadAccessFaultM, PMAStoreAccessFaultM;
|
logic PMAInstrAccessFaultF, PMALoadAccessFaultM, PMAStoreAccessFaultM;
|
||||||
logic DSquashBusAccessM, ISquashBusAccessF;
|
logic DSquashBusAccessM, ISquashBusAccessF;
|
||||||
logic [5:0] DHSELRegionsM, IHSELRegionsF;
|
logic [5:0] DHSELRegionsM, IHSELRegionsF;
|
||||||
logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:15]; // *** again, this is a huge bus to be sending all around.
|
var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [0:`PMP_ENTRIES-1];
|
||||||
logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW; // signals being sent from privileged unit to pmp/pma in dmem and ifu.
|
logic [63:0] PMPCFG01_REGW, PMPCFG23_REGW; // signals being sent from privileged unit to pmp/pma in dmem and ifu.
|
||||||
assign HSELRegions = ExecuteAccessF ? IHSELRegionsF : DHSELRegionsM; // *** this is a pure guess on how one of these should be selected. it passes tests, but is it the right way to do this?
|
assign HSELRegions = ExecuteAccessF ? IHSELRegionsF : DHSELRegionsM; // *** this is a pure guess on how one of these should be selected. it passes tests, but is it the right way to do this?
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user