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)