Add Partial Write support for blocking accesses

This commit is contained in:
2023-08-16 09:45:32 +02:00
parent 09275bb789
commit 3f0372f1f7

View File

@@ -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)