aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--model/riscv_pte.sail11
-rw-r--r--model/riscv_vmem_sv32.sail2
2 files changed, 12 insertions, 1 deletions
diff --git a/model/riscv_pte.sail b/model/riscv_pte.sail
index 08cedc5..6f170ae 100644
--- a/model/riscv_pte.sail
+++ b/model/riscv_pte.sail
@@ -7,6 +7,17 @@ type pteAttribs = bits(8)
*/
type extPte = bits(10)
+/*
+ * On SV32, there are no reserved bits available to extensions. Therefore, by
+ * default, we initialize the PTE extension field with all zeros. However,
+ * extensions may wish, on SV39/48/56, to put flags in the reserved region of
+ * those PTEs. To avoid the need for "inhibit" bits in extensions (i.e., so
+ * that extensions can use the more common and more RISC-V flavored "enable"
+ * disposition), we allow extensions to use any constant value by overriding
+ * this default_sv32_ext_pte value.
+ */
+let default_sv32_ext_pte : extPte = zeros()
+
bitfield PTE_Bits : pteAttribs = {
D : 7,
A : 6,
diff --git a/model/riscv_vmem_sv32.sail b/model/riscv_vmem_sv32.sail
index c025630..cd1d51e 100644
--- a/model/riscv_vmem_sv32.sail
+++ b/model/riscv_vmem_sv32.sail
@@ -24,7 +24,7 @@ function walk32(vaddr, ac, priv, mxr, do_sum, ptb, level, global, ext_ptw) = {
MemValue(v) => {
let pte = Mk_SV32_PTE(v);
let pbits = pte.BITS();
- let ext_pte : extPte = zeros(); // no reserved bits for extensions
+ let ext_pte : extPte = default_sv32_ext_pte;
let pattr = Mk_PTE_Bits(pbits);
let is_global = global | (pattr.G() == 0b1);
/* print("walk32(vaddr=" ^ BitStr(vaddr) ^ " level=" ^ string_of_int(level)