mirror of
https://github.com/openhwgroup/cvw.git
synced 2025-06-27 08:50:26 -04:00
Defined PMP_G granularity parameter
This commit is contained in:
parent
d2b3ae0a96
commit
97f5ea0fd1
11 changed files with 26 additions and 7 deletions
|
@ -137,6 +137,7 @@ localparam logic IDIV_ON_FPU = 0;
|
|||
|
||||
// Legal number of PMP entries are 0, 16, or 64
|
||||
localparam PMP_ENTRIES = 32'd0;
|
||||
localparam PMP_G = 32'b0; // grain of 4 bytes is supported for uncached RV32
|
||||
|
||||
// Address space
|
||||
localparam logic [63:0] RESET_VECTOR = 64'h80000000;
|
||||
|
|
|
@ -137,6 +137,9 @@ localparam logic IDIV_ON_FPU = 0;
|
|||
|
||||
// Legal number of PMP entries are 0, 16, or 64
|
||||
localparam PMP_ENTRIES = 32'd16;
|
||||
// grain size should be a full cache line to avoid problems with accesses within a cache line
|
||||
// that span grain boundaries but are handled without a spill
|
||||
localparam PMP_G = 32'd4; // 64 bytes for 512-bit cache line
|
||||
|
||||
// Address space
|
||||
localparam logic [63:0] RESET_VECTOR = 64'h80000000;
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
|
||||
# PMP Configuration
|
||||
--override cpu/PMP_registers=16
|
||||
--override cpu/PMP_undefined=T
|
||||
--override cpu/PMP_grain=4 # 64-byte grains to match cache line width
|
||||
--override cpu/PMP_decompose=T # unaligned accesses are decomposed into separate aligned accesses
|
||||
--override cpu/PMP_undefined=T # access to unimplemented PMP registers cause illegal instruction exception
|
||||
|
||||
# PMA Settings
|
||||
# 'r': read access allowed
|
||||
|
|
|
@ -137,6 +137,7 @@ localparam logic IDIV_ON_FPU = 0;
|
|||
|
||||
// Legal number of PMP entries are 0, 16, or 64
|
||||
localparam PMP_ENTRIES = 32'd0;
|
||||
localparam PMP_G = 32'b0; // grain of 4 bytes is supported for uncached RV32
|
||||
|
||||
// Address space
|
||||
localparam logic [63:0] RESET_VECTOR = 64'h80000000;
|
||||
|
|
|
@ -137,6 +137,7 @@ localparam logic IDIV_ON_FPU = 0;
|
|||
|
||||
// Legal number of PMP entries are 0, 16, or 64
|
||||
localparam PMP_ENTRIES = 32'd0;
|
||||
localparam PMP_G = 32'b0; // grain of 4 bytes is supported for uncached RV32
|
||||
|
||||
// Address space
|
||||
localparam logic [63:0] RESET_VECTOR = 64'h80000000;
|
||||
|
|
|
@ -138,6 +138,10 @@ localparam logic IDIV_ON_FPU = 1;
|
|||
// Legal number of PMP entries are 0, 16, or 64
|
||||
localparam PMP_ENTRIES = 32'd16;
|
||||
|
||||
// grain size should be a full cache line to avoid problems with accesses within a cache line
|
||||
// that span grain boundaries but are handled without a spill
|
||||
localparam PMP_G = 32'd4; //e.g. 4 for 64-byte grains (512-bit cache lines)
|
||||
|
||||
// Address space
|
||||
localparam logic [63:0] RESET_VECTOR = 64'h0000000080000000;
|
||||
|
||||
|
|
|
@ -48,7 +48,9 @@
|
|||
|
||||
# PMP Configuration
|
||||
--override cpu/PMP_registers=16
|
||||
--override cpu/PMP_undefined=T
|
||||
--override cpu/PMP_grain=4 # 64-byte grains to match cache line width
|
||||
--override cpu/PMP_decompose=T # unaligned accesses are decomposed into separate aligned accesses
|
||||
--override cpu/PMP_undefined=T # access to unimplemented PMP registers cause illegal instruction exception
|
||||
|
||||
# PMA Settings
|
||||
# 'r': read access allowed
|
||||
|
|
|
@ -137,6 +137,7 @@ localparam logic IDIV_ON_FPU = 0;
|
|||
|
||||
// Legal number of PMP entries are 0, 16, or 64
|
||||
localparam PMP_ENTRIES = 32'd0;
|
||||
localparam PMP_G = 32'b0; // grain of 8 bytes is supported for uncached RV64
|
||||
|
||||
// Address space
|
||||
localparam logic [63:0] RESET_VECTOR = 64'h0000000080000000;
|
||||
|
|
|
@ -48,6 +48,7 @@ localparam cvw_t P = '{
|
|||
IDIV_BITSPERCYCLE : IDIV_BITSPERCYCLE,
|
||||
IDIV_ON_FPU : IDIV_ON_FPU,
|
||||
PMP_ENTRIES : PMP_ENTRIES,
|
||||
PMP_G : PMP_G,
|
||||
RESET_VECTOR : RESET_VECTOR,
|
||||
WFI_TIMEOUT_BIT : WFI_TIMEOUT_BIT,
|
||||
DTIM_SUPPORTED : DTIM_SUPPORTED,
|
||||
|
|
|
@ -95,6 +95,7 @@ typedef struct packed {
|
|||
|
||||
// Legal number of PMP entries are 0, 16, or 64
|
||||
int PMP_ENTRIES;
|
||||
int PMP_G; // grain
|
||||
|
||||
// Address space
|
||||
logic [63:0] RESET_VECTOR;
|
||||
|
|
|
@ -22,12 +22,14 @@
|
|||
module riscvassertions import cvw::*; #(parameter cvw_t P);
|
||||
initial begin
|
||||
assert (P.PMP_ENTRIES == 0 | P.PMP_ENTRIES==16 | P.PMP_ENTRIES==64) else $fatal(1, "Illegal number of PMP entries: PMP_ENTRIES must be 0, 16, or 64");
|
||||
assert (P.S_SUPPORTED | P.VIRTMEM_SUPPORTED == 0) else $fatal(1, "Virtual memory requires S mode support");
|
||||
assert (P.PMP_G > 0 | P.XLEN == 32) else $fatal(1, "RV64 requires PMP_G at least 1 to avoid checking for 8-byte accesses to 4-byte region");
|
||||
assert (P.PMP_G >= $clog2(P.DCACHE_LINELENINBITS)-2 | !P.ZICCLSM_SUPPORTED | P.PMP_ENTRIES == 0) else $fatal(1, "Systems that support misaligned data with PMP must have grain size of at least one cache line so accesses that span grains will also cause spills");
|
||||
assert (P.PMP_G >= $clog2(P.ICACHE_LINELENINBITS)-2 | !P.ZCA_SUPPORTED | P.PMP_ENTRIES == 0 | !P.ICACHE_SUPPORTED) else $fatal(1, "Systems that support compressed instructions with PMP must have grain size of at least one cache line so fetches that span grains will also cause spills");
|
||||
assert (P.IDIV_BITSPERCYCLE == 1 | P.IDIV_BITSPERCYCLE==2 | P.IDIV_BITSPERCYCLE==4) else $fatal(1, "Illegal number of divider bits/cycle: IDIV_BITSPERCYCLE must be 1, 2, or 4");
|
||||
assert (P.F_SUPPORTED | ~P.D_SUPPORTED) else $fatal(1, "Can't support double fp (D) without supporting float (F)");
|
||||
assert (P.D_SUPPORTED | ~P.Q_SUPPORTED) else $fatal(1, "Can't support quad fp (Q) without supporting double (D)");
|
||||
assert (P.F_SUPPORTED | ~P.ZFH_SUPPORTED) else $fatal(1, "Can't support half-precision fp (ZFH) without supporting float (F)");
|
||||
assert (P.DCACHE_SUPPORTED | ~P.F_SUPPORTED | P.FLEN <= P.XLEN) else $fatal(1, "Data cache required to support FLEN > XLEN because AHB/DTIM bus width is XLEN");
|
||||
assert (P.F_SUPPORTED | !P.D_SUPPORTED) else $fatal(1, "Can't support double fp (D) without supporting float (F)");
|
||||
assert (P.D_SUPPORTED | !P.Q_SUPPORTED) else $fatal(1, "Can't support quad fp (Q) without supporting double (D)");
|
||||
assert (P.F_SUPPORTED | !P.ZFH_SUPPORTED) else $fatal(1, "Can't support half-precision fp (ZFH) without supporting float (F)");
|
||||
assert (P.DCACHE_SUPPORTED | !P.F_SUPPORTED | P.FLEN <= P.XLEN) else $fatal(1, "Data cache required to support FLEN > XLEN because AHB/DTIM bus width is XLEN");
|
||||
assert (P.I_SUPPORTED ^ P.E_SUPPORTED) else $fatal(1, "Exactly one of I and E must be supported");
|
||||
assert (P.DCACHE_WAYSIZEINBYTES <= 4096 | (!P.DCACHE_SUPPORTED) | P.VIRTMEM_SUPPORTED == 0) else $fatal(1, "DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
|
||||
assert (P.DCACHE_LINELENINBITS >= 128 | (!P.DCACHE_SUPPORTED)) else $fatal(1, "DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue