Additional check of byte enable pointer.
This commit is contained in:
@@ -290,7 +290,7 @@ bool MemSpecDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) c
|
|||||||
if (burstLength == 16 && bitWidth == 4)
|
if (burstLength == 16 && bitWidth == 4)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ TimeInterval MemSpecLPDDR5::getIntervalOnDataStrobe(Command command, const tlm_g
|
|||||||
|
|
||||||
bool MemSpecLPDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecLPDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -150,11 +150,27 @@ bool MemSpec::hasRasAndCasBus() const
|
|||||||
|
|
||||||
bool MemSpec::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpec::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
if (payload.get_byte_enable_ptr() == nullptr)
|
if (allBytesEnabled(payload))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
SC_REPORT_FATAL("MemSpec", "Standard does not support masked writes!");
|
SC_REPORT_FATAL("MemSpec", "Standard does not support masked writes!");
|
||||||
throw;
|
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
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ protected:
|
|||||||
unsigned banksPerChannel, unsigned bankGroupsPerChannel,
|
unsigned banksPerChannel, unsigned bankGroupsPerChannel,
|
||||||
unsigned devicesPerRank);
|
unsigned devicesPerRank);
|
||||||
|
|
||||||
|
[[nodiscard]] static bool allBytesEnabled(const tlm::tlm_generic_payload& trans);
|
||||||
|
|
||||||
MemSpec(const MemSpec &) = default;
|
MemSpec(const MemSpec &) = default;
|
||||||
MemSpec(MemSpec &&) = default;
|
MemSpec(MemSpec &&) = default;
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ TimeInterval MemSpecDDR3::getIntervalOnDataStrobe(Command command, [[maybe_unuse
|
|||||||
|
|
||||||
bool MemSpecDDR3::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecDDR3::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ TimeInterval MemSpecDDR4::getIntervalOnDataStrobe(Command command, [[maybe_unuse
|
|||||||
|
|
||||||
bool MemSpecDDR4::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecDDR4::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ TimeInterval MemSpecHBM2::getIntervalOnDataStrobe(Command command, [[maybe_unuse
|
|||||||
|
|
||||||
bool MemSpecHBM2::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecHBM2::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ TimeInterval MemSpecLPDDR4::getIntervalOnDataStrobe(Command command, [[maybe_unu
|
|||||||
|
|
||||||
bool MemSpecLPDDR4::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecLPDDR4::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ TimeInterval MemSpecSTTMRAM::getIntervalOnDataStrobe(Command command, [[maybe_un
|
|||||||
|
|
||||||
bool MemSpecSTTMRAM::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecSTTMRAM::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ TimeInterval MemSpecWideIO::getIntervalOnDataStrobe(Command command, [[maybe_unu
|
|||||||
|
|
||||||
bool MemSpecWideIO::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecWideIO::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ TimeInterval MemSpecWideIO2::getIntervalOnDataStrobe(Command command, [[maybe_un
|
|||||||
|
|
||||||
bool MemSpecWideIO2::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
bool MemSpecWideIO2::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||||
{
|
{
|
||||||
return payload.get_byte_enable_ptr() != nullptr;
|
return !allBytesEnabled(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DRAMSys
|
} // namespace DRAMSys
|
||||||
|
|||||||
@@ -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++)
|
for (std::size_t i = 0; i < trans.get_data_length(); i++)
|
||||||
{
|
{
|
||||||
std::size_t byteEnableIndex = i % trans.get_byte_enable_length();
|
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];
|
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++)
|
for (std::size_t i = 0; i < trans.get_data_length(); i++)
|
||||||
{
|
{
|
||||||
std::size_t byteEnableIndex = i % trans.get_byte_enable_length();
|
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];
|
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++)
|
for (std::size_t i = 0; i < trans.get_data_length(); i++)
|
||||||
{
|
{
|
||||||
std::size_t byteEnableIndex = i % trans.get_byte_enable_length();
|
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];
|
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++)
|
for (std::size_t i = 0; i < trans.get_data_length(); i++)
|
||||||
{
|
{
|
||||||
std::size_t byteEnableIndex = i % trans.get_byte_enable_length();
|
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];
|
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++)
|
for (std::size_t i = 0; i < trans.get_data_length(); i++)
|
||||||
{
|
{
|
||||||
std::size_t byteEnableIndex = i % trans.get_byte_enable_length();
|
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];
|
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++)
|
for (std::size_t i = 0; i < trans.get_data_length(); i++)
|
||||||
{
|
{
|
||||||
std::size_t byteEnableIndex = i % trans.get_byte_enable_length();
|
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];
|
phyAddr[i] = trans.get_data_ptr()[i];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user