Additional check of byte enable pointer.

This commit is contained in:
Lukas Steiner
2023-08-23 15:21:53 +02:00
parent 76e58b1755
commit 12f2b73cde
12 changed files with 34 additions and 16 deletions

View File

@@ -290,7 +290,7 @@ bool MemSpecDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) c
if (burstLength == 16 && bitWidth == 4)
return true;
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -250,7 +250,7 @@ TimeInterval MemSpecLPDDR5::getIntervalOnDataStrobe(Command command, const tlm_g
bool MemSpecLPDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -150,11 +150,27 @@ bool MemSpec::hasRasAndCasBus() const
bool MemSpec::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
if (payload.get_byte_enable_ptr() == nullptr)
if (allBytesEnabled(payload))
return false;
SC_REPORT_FATAL("MemSpec", "Standard does not support masked writes!");
throw;
}
bool MemSpec::allBytesEnabled(const tlm::tlm_generic_payload& trans)
{
if (trans.get_byte_enable_ptr() == nullptr)
return true;
for (std::size_t i = 0; i < trans.get_byte_enable_length(); i++)
{
if (trans.get_byte_enable_ptr()[i] != TLM_BYTE_ENABLED)
{
return false;
}
}
return true;
}
} // namespace DRAMSys

View File

@@ -118,6 +118,8 @@ protected:
unsigned banksPerChannel, unsigned bankGroupsPerChannel,
unsigned devicesPerRank);
[[nodiscard]] static bool allBytesEnabled(const tlm::tlm_generic_payload& trans);
MemSpec(const MemSpec &) = default;
MemSpec(MemSpec &&) = default;

View File

@@ -170,7 +170,7 @@ TimeInterval MemSpecDDR3::getIntervalOnDataStrobe(Command command, [[maybe_unuse
bool MemSpecDDR3::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -188,7 +188,7 @@ TimeInterval MemSpecDDR4::getIntervalOnDataStrobe(Command command, [[maybe_unuse
bool MemSpecDDR4::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -177,7 +177,7 @@ TimeInterval MemSpecHBM2::getIntervalOnDataStrobe(Command command, [[maybe_unuse
bool MemSpecHBM2::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -183,7 +183,7 @@ TimeInterval MemSpecLPDDR4::getIntervalOnDataStrobe(Command command, [[maybe_unu
bool MemSpecLPDDR4::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -143,7 +143,7 @@ TimeInterval MemSpecSTTMRAM::getIntervalOnDataStrobe(Command command, [[maybe_un
bool MemSpecSTTMRAM::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -175,7 +175,7 @@ TimeInterval MemSpecWideIO::getIntervalOnDataStrobe(Command command, [[maybe_unu
bool MemSpecWideIO::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -165,7 +165,7 @@ TimeInterval MemSpecWideIO2::getIntervalOnDataStrobe(Command command, [[maybe_un
bool MemSpecWideIO2::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
return payload.get_byte_enable_ptr() != nullptr;
return !allBytesEnabled(payload);
}
} // namespace DRAMSys

View File

@@ -154,7 +154,7 @@ tlm_sync_enum Dram::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase
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)
if (trans.get_byte_enable_ptr()[byteEnableIndex] == TLM_BYTE_ENABLED)
{
trans.get_data_ptr()[i] = phyAddr[i];
}
@@ -174,7 +174,7 @@ tlm_sync_enum Dram::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase
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)
if (trans.get_byte_enable_ptr()[byteEnableIndex] == TLM_BYTE_ENABLED)
{
phyAddr[i] = trans.get_data_ptr()[i];
}
@@ -215,7 +215,7 @@ unsigned int Dram::transport_dbg(tlm_generic_payload& trans)
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)
if (trans.get_byte_enable_ptr()[byteEnableIndex] == TLM_BYTE_ENABLED)
{
trans.get_data_ptr()[i] = phyAddr[i];
}
@@ -243,7 +243,7 @@ unsigned int Dram::transport_dbg(tlm_generic_payload& trans)
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)
if (trans.get_byte_enable_ptr()[byteEnableIndex] == TLM_BYTE_ENABLED)
{
phyAddr[i] = trans.get_data_ptr()[i];
}
@@ -286,7 +286,7 @@ void Dram::b_transport(tlm_generic_payload& trans, [[maybe_unused]] sc_time& del
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)
if (trans.get_byte_enable_ptr()[byteEnableIndex] == TLM_BYTE_ENABLED)
{
trans.get_data_ptr()[i] = phyAddr[i];
}
@@ -304,7 +304,7 @@ void Dram::b_transport(tlm_generic_payload& trans, [[maybe_unused]] sc_time& del
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)
if (trans.get_byte_enable_ptr()[byteEnableIndex] == TLM_BYTE_ENABLED)
{
phyAddr[i] = trans.get_data_ptr()[i];
}