From 3f0372f1f7dc1401d8ded1f756d0ca1ce7ef7bd3 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 16 Aug 2023 09:45:32 +0200 Subject: [PATCH] Add Partial Write support for blocking accesses --- .../DRAMSys/simulation/dram/Dram.cpp | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp index 5c4dacfb..843154fc 100644 --- a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp @@ -244,15 +244,43 @@ void Dram::b_transport(tlm_generic_payload& trans, sc_time& delay) if (storeMode == Configuration::StoreMode::Store) { + unsigned char* phyAddr = memory + trans.get_address(); + if (trans.is_read()) { - unsigned char* phyAddr = memory + trans.get_address(); - memcpy(trans.get_data_ptr(), phyAddr, trans.get_data_length()); + if (trans.get_byte_enable_ptr() == nullptr) + { + memcpy(trans.get_data_ptr(), phyAddr, trans.get_data_length()); + } + else + { + for (std::size_t i = 0; i < trans.get_data_length(); i++) + { + std::size_t byteEnableIndex = i % trans.get_byte_enable_length(); + if (trans.get_byte_enable_ptr()[byteEnableIndex] != 0) + { + trans.get_data_ptr()[i] = phyAddr[i]; + } + } + } } else { - unsigned char* phyAddr = memory + trans.get_address(); - memcpy(phyAddr, trans.get_data_ptr(), trans.get_data_length()); + if (trans.get_byte_enable_ptr() == nullptr) + { + memcpy(phyAddr, trans.get_data_ptr(), trans.get_data_length()); + } + else + { + for (std::size_t i = 0; i < trans.get_data_length(); i++) + { + std::size_t byteEnableIndex = i % trans.get_byte_enable_length(); + if (trans.get_byte_enable_ptr()[byteEnableIndex] != 0) + { + phyAddr[i] = trans.get_data_ptr()[i]; + } + } + } } } else if (storeMode != Configuration::StoreMode::NoStorage)