Use integer address in decode function again
This commit is contained in:
@@ -52,12 +52,10 @@ static DRAMSys::AddressDecoder addressDecoder()
|
||||
static void addressdecoder_decode(benchmark::State& state)
|
||||
{
|
||||
auto decoder = addressDecoder();
|
||||
tlm::tlm_generic_payload trans;
|
||||
trans.set_address(0x0);
|
||||
for (auto _ : state)
|
||||
{
|
||||
// Actual address has no significant impact on performance
|
||||
auto decodedAddress = decoder.decodeAddress(trans);
|
||||
auto decodedAddress = decoder.decodeAddress(0x0);
|
||||
benchmark::DoNotOptimize(decodedAddress);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -609,7 +609,7 @@ void Controller::manageRequests(const sc_time& delay)
|
||||
{
|
||||
// continuous block of data that can be fetched with a single burst
|
||||
DecodedAddress decodedAddress =
|
||||
addressDecoder.decodeAddress(*transToAcquire.payload);
|
||||
addressDecoder.decodeAddress(transToAcquire.payload->get_address());
|
||||
ControllerExtension::setAutoExtension(
|
||||
*transToAcquire.payload,
|
||||
nextChannelPayloadIDToAppend++,
|
||||
@@ -781,7 +781,7 @@ void Controller::createChildTranses(tlm::tlm_generic_payload& parentTrans)
|
||||
|
||||
for (auto* childTrans : childTranses)
|
||||
{
|
||||
DecodedAddress decodedAddress = addressDecoder.decodeAddress(*childTrans);
|
||||
DecodedAddress decodedAddress = addressDecoder.decodeAddress(childTrans->get_address());
|
||||
ControllerExtension::setAutoExtension(*childTrans,
|
||||
nextChannelPayloadIDToAppend,
|
||||
Rank(decodedAddress.rank),
|
||||
|
||||
@@ -304,12 +304,11 @@ void AddressDecoder::checkBurstLengthBits(const MemSpec& memSpec) {
|
||||
}
|
||||
|
||||
|
||||
DecodedAddress AddressDecoder::decodeAddress(tlm::tlm_generic_payload& trans) const
|
||||
DecodedAddress AddressDecoder::decodeAddress(uint64_t address) const
|
||||
{
|
||||
uint64_t encAddr = trans.get_address();
|
||||
uint64_t encAddr = address;
|
||||
if (encAddr > upperBoundAddress)
|
||||
{
|
||||
trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE);
|
||||
SC_REPORT_WARNING("AddressDecoder",
|
||||
("Address " + std::to_string(encAddr) +
|
||||
" out of range (maximum address is " + std::to_string(upperBoundAddress) +
|
||||
@@ -343,9 +342,11 @@ DecodedAddress AddressDecoder::decodeAddress(tlm::tlm_generic_payload& trans) co
|
||||
decAddr.column= get_component(columnBits);
|
||||
decAddr.byte = get_component(byteBits);
|
||||
|
||||
if (np2Flag)
|
||||
if (!isAddressValid(decAddr))
|
||||
trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE);
|
||||
if (np2Flag && !isAddressValid(decAddr))
|
||||
{
|
||||
SC_REPORT_WARNING("AddressDecoder",
|
||||
("Address " + std::to_string(encAddr) + " invalid)").c_str());
|
||||
}
|
||||
|
||||
// Important: This offsets must be added after(!) the address validation!
|
||||
decAddr.bankgroup = decAddr.bankgroup + decAddr.rank * bankgroupsPerRank;
|
||||
|
||||
@@ -96,10 +96,10 @@ public:
|
||||
/**
|
||||
* @brief Decodes an address from a transaction payload into its address components.
|
||||
*
|
||||
* @param trans The transaction payload.
|
||||
* @param address The encoded address.
|
||||
* @return The decoded address.
|
||||
*/
|
||||
[[nodiscard]] DecodedAddress decodeAddress(tlm::tlm_generic_payload& trans) const;
|
||||
[[nodiscard]] DecodedAddress decodeAddress(uint64_t address) const;
|
||||
|
||||
/**
|
||||
* @brief Decodes the channel component from an encoded address.
|
||||
|
||||
@@ -195,7 +195,7 @@ void Arbiter::b_transport([[maybe_unused]] int id,
|
||||
{
|
||||
trans.set_address(trans.get_address() - addressOffset);
|
||||
|
||||
DecodedAddress decodedAddress = addressDecoder.decodeAddress(trans);
|
||||
DecodedAddress decodedAddress = addressDecoder.decodeAddress(trans.get_address());
|
||||
iSocket[static_cast<int>(decodedAddress.channel)]->b_transport(trans, delay);
|
||||
}
|
||||
|
||||
@@ -203,7 +203,7 @@ unsigned int Arbiter::transport_dbg([[maybe_unused]] int id, tlm::tlm_generic_pa
|
||||
{
|
||||
trans.set_address(trans.get_address() - addressOffset);
|
||||
|
||||
DecodedAddress decodedAddress = addressDecoder.decodeAddress(trans);
|
||||
DecodedAddress decodedAddress = addressDecoder.decodeAddress(trans.get_address());
|
||||
return iSocket[static_cast<int>(decodedAddress.channel)]->transport_dbg(trans);
|
||||
}
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ void EccModule::peqCallback(tlm::tlm_generic_payload& cbPayload, const tlm::tlm_
|
||||
sc_time tDelay = SC_ZERO_TIME;
|
||||
|
||||
DRAMSys::DecodedAddress decodedAddress =
|
||||
addressDecoder.decodeAddress(cbPayload);
|
||||
addressDecoder.decodeAddress(cbPayload.get_address());
|
||||
decodedAddress = calculateOffsetAddress(decodedAddress);
|
||||
|
||||
// Update the original address to account for the offsets
|
||||
@@ -157,7 +157,7 @@ void EccModule::peqCallback(tlm::tlm_generic_payload& cbPayload, const tlm::tlm_
|
||||
sc_time tDelay = SC_ZERO_TIME;
|
||||
|
||||
DRAMSys::DecodedAddress decodedAddress =
|
||||
addressDecoder.decodeAddress(tPayload);
|
||||
addressDecoder.decodeAddress(tPayload.get_address());
|
||||
decodedAddress = calculateOffsetAddress(decodedAddress);
|
||||
|
||||
#ifdef ECC_ENABLE
|
||||
|
||||
@@ -62,9 +62,7 @@ protected:
|
||||
TEST_F(AddressDecoderFixture, Decoding)
|
||||
{
|
||||
uint64_t address = 0x3A59'1474;
|
||||
tlm::tlm_generic_payload trans;
|
||||
trans.set_address(address);
|
||||
auto decodedAddress = addressDecoder.decodeAddress(trans);
|
||||
auto decodedAddress = addressDecoder.decodeAddress(address);
|
||||
|
||||
unsigned int channel = decodedAddress.channel;
|
||||
unsigned int rank = decodedAddress.rank;
|
||||
@@ -95,10 +93,8 @@ TEST_F(AddressDecoderFixture, DecodingNP2Failure)
|
||||
addressDecoder.plausibilityCheck(*memSpec);
|
||||
|
||||
uint64_t address = 0x3A59'1478;
|
||||
tlm::tlm_generic_payload trans;
|
||||
trans.set_address(address);
|
||||
addressDecoder.decodeAddress(trans);
|
||||
EXPECT_EQ(trans.get_response_status(), tlm::TLM_ADDRESS_ERROR_RESPONSE);
|
||||
addressDecoder.decodeAddress(address);
|
||||
// EXPECT_EQ(trans.get_response_status(), tlm::TLM_ADDRESS_ERROR_RESPONSE);
|
||||
}
|
||||
|
||||
TEST_F(AddressDecoderFixture, DecodingNP2Success)
|
||||
@@ -115,10 +111,7 @@ TEST_F(AddressDecoderFixture, DecodingNP2Success)
|
||||
addressDecoder.plausibilityCheck(*memSpec);
|
||||
|
||||
uint64_t address = 0x3A59'1477;
|
||||
tlm::tlm_generic_payload trans;
|
||||
trans.set_address(address);
|
||||
trans.set_response_status(tlm::TLM_INCOMPLETE_RESPONSE);
|
||||
auto decodedAddress = addressDecoder.decodeAddress(trans);
|
||||
auto decodedAddress = addressDecoder.decodeAddress(address);
|
||||
|
||||
unsigned int channel = decodedAddress.channel;
|
||||
unsigned int rank = decodedAddress.rank;
|
||||
@@ -133,7 +126,7 @@ TEST_F(AddressDecoderFixture, DecodingNP2Success)
|
||||
EXPECT_EQ(bank, 4);
|
||||
EXPECT_EQ(row, 7468);
|
||||
EXPECT_EQ(column, 558);
|
||||
EXPECT_EQ(trans.get_response_status(), tlm::TLM_INCOMPLETE_RESPONSE);
|
||||
// EXPECT_EQ(trans.get_response_status(), tlm::TLM_INCOMPLETE_RESPONSE);
|
||||
}
|
||||
|
||||
TEST_F(AddressDecoderFixture, Encoding)
|
||||
@@ -160,11 +153,9 @@ TEST_F(AddressDecoderFixture, DeEncoding)
|
||||
std::uint64_t(0x2FFA'1230),
|
||||
std::uint64_t(0x0001'FFF0)};
|
||||
|
||||
tlm::tlm_generic_payload trans;
|
||||
for (auto address : testAddresses)
|
||||
{
|
||||
trans.set_address(address);
|
||||
DRAMSys::DecodedAddress decodedAddress = addressDecoder.decodeAddress(trans);
|
||||
DRAMSys::DecodedAddress decodedAddress = addressDecoder.decodeAddress(address);
|
||||
uint64_t encodedAddress = addressDecoder.encodeAddress(decodedAddress);
|
||||
|
||||
EXPECT_EQ(encodedAddress, address);
|
||||
|
||||
Reference in New Issue
Block a user