From 7e77593f23f549bb47f53fbd8153afed284f6fb2 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 24 Sep 2025 09:32:40 +0200 Subject: [PATCH] Use integer address in decode function again --- benches/addressdecoder.cpp | 4 +--- .../DRAMSys/controller/Controller.cpp | 4 ++-- .../DRAMSys/simulation/AddressDecoder.cpp | 13 ++++++------ .../DRAMSys/simulation/AddressDecoder.h | 4 ++-- src/libdramsys/DRAMSys/simulation/Arbiter.cpp | 4 ++-- src/simulator/simulator/EccModule.cpp | 4 ++-- tests/tests_dramsys/AddressDecoderTests.cpp | 21 ++++++------------- 7 files changed, 22 insertions(+), 32 deletions(-) diff --git a/benches/addressdecoder.cpp b/benches/addressdecoder.cpp index ee1b21bb..bb4775ad 100644 --- a/benches/addressdecoder.cpp +++ b/benches/addressdecoder.cpp @@ -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); } } diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 8d5fbf08..d1380ed9 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -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), diff --git a/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp b/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp index b8d342af..2678b783 100644 --- a/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp +++ b/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp @@ -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; diff --git a/src/libdramsys/DRAMSys/simulation/AddressDecoder.h b/src/libdramsys/DRAMSys/simulation/AddressDecoder.h index 3ccb6aad..5ed9959c 100644 --- a/src/libdramsys/DRAMSys/simulation/AddressDecoder.h +++ b/src/libdramsys/DRAMSys/simulation/AddressDecoder.h @@ -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. diff --git a/src/libdramsys/DRAMSys/simulation/Arbiter.cpp b/src/libdramsys/DRAMSys/simulation/Arbiter.cpp index ef82d4d7..b81d1dd1 100644 --- a/src/libdramsys/DRAMSys/simulation/Arbiter.cpp +++ b/src/libdramsys/DRAMSys/simulation/Arbiter.cpp @@ -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(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(decodedAddress.channel)]->transport_dbg(trans); } diff --git a/src/simulator/simulator/EccModule.cpp b/src/simulator/simulator/EccModule.cpp index 74b1be49..e9bb7d73 100644 --- a/src/simulator/simulator/EccModule.cpp +++ b/src/simulator/simulator/EccModule.cpp @@ -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 diff --git a/tests/tests_dramsys/AddressDecoderTests.cpp b/tests/tests_dramsys/AddressDecoderTests.cpp index fbbece0e..1189c03a 100644 --- a/tests/tests_dramsys/AddressDecoderTests.cpp +++ b/tests/tests_dramsys/AddressDecoderTests.cpp @@ -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);