From 54544911601351465a6a887a045f3baddcb90dc6 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Sun, 18 Sep 2022 17:14:54 -0600 Subject: Implement Avalon memory module for simulation --- tb/mem.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 tb/mem.cpp (limited to 'tb/mem.cpp') diff --git a/tb/mem.cpp b/tb/mem.cpp new file mode 100644 index 0000000..bfbc3ea --- /dev/null +++ b/tb/mem.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +#include "mem.hpp" + +namespace taller::avalon +{ + mem::mem(std::uint32_t base, std::uint32_t size) + : base(base), mask(~(size - 1)), + block(std::make_unique(size >> 2)) + { + assert(!(size & 0b11) && !((size - 1) & size)); + } + + bool mem::read(std::uint32_t addr, std::uint32_t &data) + { + data = block[addr]; + return true; + } + + bool mem::write(std::uint32_t addr, std::uint32_t data, unsigned byte_enable) + { + std::uint32_t bytes = 0; + + if(byte_enable & 0b1000) + { + bytes |= 0xff << 24; + } + + if(byte_enable & 0b0100) + { + bytes |= 0xff << 16; + } + + if(byte_enable & 0b0010) + { + bytes |= 0xff << 8; + } + + if(byte_enable & 0b0001) + { + bytes |= 0xff; + } + + block[addr] = (data & bytes) | (block[addr] & ~bytes); + return true; + } +} -- cgit v1.2.3