Add Partial Write support for blocking accesses
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user