aboutsummaryrefslogtreecommitdiff
path: root/riscv_mem.sail
diff options
context:
space:
mode:
authorJon French <jf451@cam.ac.uk>2018-07-10 16:36:16 +0100
committerJon French <jf451@cam.ac.uk>2018-07-10 16:36:24 +0100
commite4ac449d417712a41c95553676550ac8e1f6c863 (patch)
tree2d86b41d48abafd51c628078e4e373f94cc03d08 /riscv_mem.sail
parentff4bf88899431498cd747f09fb68dc5f1698a895 (diff)
downloadsail-riscv-e4ac449d417712a41c95553676550ac8e1f6c863.zip
sail-riscv-e4ac449d417712a41c95553676550ac8e1f6c863.tar.gz
sail-riscv-e4ac449d417712a41c95553676550ac8e1f6c863.tar.bz2
RISCV load-acquire in Lem (-> rmem)
Diffstat (limited to 'riscv_mem.sail')
-rw-r--r--riscv_mem.sail18
1 files changed, 9 insertions, 9 deletions
diff --git a/riscv_mem.sail b/riscv_mem.sail
index 008c164..cb60851 100644
--- a/riscv_mem.sail
+++ b/riscv_mem.sail
@@ -4,8 +4,8 @@ function is_aligned_addr (addr : xlenbits, width : atom('n)) -> forall 'n. bool
unsigned(addr) % width == 0
// only used for actual memory regions, to avoid MMIO effects
-function phys_mem_read(t : ReadType, addr : xlenbits, width : atom('n)) -> forall 'n. MemoryOpResult(bits(8 * 'n)) =
- match (t, __RISCV_read(addr, width)) {
+function phys_mem_read(t : ReadType, addr : xlenbits, width : atom('n), aq : bool, rl: bool, res : bool) -> forall 'n. MemoryOpResult(bits(8 * 'n)) =
+ match (t, __RISCV_read(addr, width, aq, rl, res)) {
(Instruction, None()) => MemException(E_Fetch_Access_Fault),
(Data, None()) => MemException(E_Load_Access_Fault),
(_, Some(v)) => { print("mem[" ^ t ^ "," ^ BitStr(addr) ^ "] -> " ^ BitStr(v));
@@ -17,7 +17,7 @@ function checked_mem_read(t : ReadType, addr : xlenbits, width : atom('n)) -> fo
if t == Data & within_mmio_readable(addr, width)
then mmio_read(addr, width)
else if within_phys_mem(addr, width)
- then phys_mem_read(t, addr, width)
+ then phys_mem_read(t, addr, width, false, false, false)
else MemException(E_Load_Access_Fault)
/* FIXME: We assume atomic accesses are only done to memory-backed regions. MMIO is not modeled. */
@@ -29,12 +29,12 @@ val MEMr_reserved : forall 'n. (xlenbits, atom('n)) -> MemoryOpRe
val MEMr_reserved_acquire : forall 'n. (xlenbits, atom('n)) -> MemoryOpResult(bits(8 * 'n)) effect {rmem}
val MEMr_reserved_strong_acquire : forall 'n. (xlenbits, atom('n)) -> MemoryOpResult(bits(8 * 'n)) effect {rmem}
-function MEMr (addr, width) = phys_mem_read(Data, addr, width)
-function MEMr_acquire (addr, width) = phys_mem_read(Data, addr, width)
-function MEMr_strong_acquire (addr, width) = phys_mem_read(Data, addr, width)
-function MEMr_reserved (addr, width) = phys_mem_read(Data, addr, width)
-function MEMr_reserved_acquire (addr, width) = phys_mem_read(Data, addr, width)
-function MEMr_reserved_strong_acquire (addr, width) = phys_mem_read(Data, addr, width)
+function MEMr (addr, width) = phys_mem_read(Data, addr, width, false, false, false)
+function MEMr_acquire (addr, width) = phys_mem_read(Data, addr, width, true, false, false)
+function MEMr_strong_acquire (addr, width) = phys_mem_read(Data, addr, width, true, true, false)
+function MEMr_reserved (addr, width) = phys_mem_read(Data, addr, width, false, false, true)
+function MEMr_reserved_acquire (addr, width) = phys_mem_read(Data, addr, width, true, false, true)
+function MEMr_reserved_strong_acquire (addr, width) = phys_mem_read(Data, addr, width, true, true, true)
/* NOTE: The rreg effect is due to MMIO. */
val mem_read : forall 'n, 'n > 0. (xlenbits, atom('n), bool, bool, bool) -> MemoryOpResult(bits(8 * 'n)) effect {rmem, rreg, escape}