diff --git a/DRAMSys/simulator/TraceSetup.cpp b/DRAMSys/simulator/TraceSetup.cpp index d1b5f014..eafe8c38 100644 --- a/DRAMSys/simulator/TraceSetup.cpp +++ b/DRAMSys/simulator/TraceSetup.cpp @@ -59,7 +59,7 @@ TraceSetup::TraceSetup(const std::string &uri, SC_REPORT_FATAL("TraceSetup", "tracesetup is empty"); for (auto &it : simulationdoc["simulation"]["tracesetup"].items()) { - auto value = it.value(); + nlohmann::json value = it.value(); if (!value.empty()) { sc_time playerClk; @@ -143,8 +143,34 @@ TraceSetup::TraceSetup(const std::string &uri, SC_REPORT_FATAL("TraceSetup", "Address distribution must either be sequential or random."); unsigned int seed = 0; - if (value["seed"].is_number_unsigned()) - seed = value["seed"]; + if (!value["seed"].empty()) + { + if (value["seed"].is_number_unsigned()) + seed = value["seed"]; + else + SC_REPORT_FATAL("TraceSetup", "Seed is not an unsigned number."); + } + + uint64_t minAddress = 0; + if (!value["minAddress"].empty()) + { + if (value["minAddress"].is_number_unsigned()) + minAddress = value["minAddress"]; + else + SC_REPORT_FATAL("TraceSetup", "minAddress is not an unsigned number."); + } + + uint64_t maxAddress = Configuration::getInstance().memSpec->getSimMemSizeInBytes() - 1; + if (!value["maxAddress"].empty()) + { + if (value["maxAddress"].is_number_unsigned()) + maxAddress = value["maxAddress"]; + else + SC_REPORT_FATAL("TraceSetup", "maxAddress is not an unsigned number."); + } + + if (maxAddress < minAddress) + SC_REPORT_FATAL("TraceSetup", "maxAddress is smaller than minAddress."); TrafficInitiator* generator; @@ -152,19 +178,20 @@ TraceSetup::TraceSetup(const std::string &uri, { uint64_t addressIncrement = 0x0; if (!value["addressIncrement"].is_number_unsigned()) - SC_REPORT_FATAL("TraceSetup", "Address increment is not a number."); - - addressIncrement = value["addressIncrement"]; + SC_REPORT_FATAL("TraceSetup", "Address increment is not an unsigned number."); + else + addressIncrement = value["addressIncrement"]; generator = new TrafficGeneratorSequential(name.c_str(), playerClk, numRequests, maxPendingReadRequests, maxPendingWriteRequests, - rwRatio, addressIncrement, seed, this); + minAddress, maxAddress, rwRatio, addressIncrement, seed, + this); } else { generator = new TrafficGeneratorRandom(name.c_str(), playerClk, numRequests, maxPendingReadRequests, maxPendingWriteRequests, - rwRatio, seed, this); + minAddress, maxAddress, rwRatio, seed, this); } players.push_back(generator); @@ -186,6 +213,8 @@ TraceSetup::TraceSetup(const std::string &uri, players.push_back(generator); } } + else + SC_REPORT_FATAL("TraceSetup", "Empty trace setup item."); } remainingTransactions = totalTransactions; diff --git a/DRAMSys/simulator/TrafficGenerator.cpp b/DRAMSys/simulator/TrafficGenerator.cpp index b096ab73..27fa923e 100644 --- a/DRAMSys/simulator/TrafficGenerator.cpp +++ b/DRAMSys/simulator/TrafficGenerator.cpp @@ -111,14 +111,15 @@ TrafficGeneratorRandom::TrafficGeneratorRandom(const sc_core::sc_module_name &na uint64_t numRequests, unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests, + uint64_t minAddress, + uint64_t maxAddress, float rwRatio, unsigned int seed, TraceSetup *setup) : - TrafficGenerator(name, generatorClk, numRequests, maxPendingReadRequests, - maxPendingWriteRequests, rwRatio, seed, setup) + TrafficGenerator(name, generatorClk, numRequests, maxPendingReadRequests, maxPendingWriteRequests, rwRatio, seed, + setup) { - randomAddressDistribution = std::uniform_int_distribution - (0, Configuration::getInstance().memSpec->getSimMemSizeInBytes()); + randomAddressDistribution = std::uniform_int_distribution (minAddress, maxAddress); } uint64_t TrafficGeneratorRandom::getNextAddress() @@ -131,13 +132,15 @@ TrafficGeneratorSequential::TrafficGeneratorSequential(const sc_core::sc_module_ uint64_t numRequests, unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests, + uint64_t minAddress, + uint64_t maxAddress, float rwRatio, uint64_t addressIncrement, unsigned int seed, TraceSetup *setup) : - TrafficGenerator(name, generatorClk, numRequests, maxPendingReadRequests, - maxPendingWriteRequests, rwRatio, seed, setup), - addressIncrement(addressIncrement) + TrafficGenerator(name, generatorClk, numRequests, maxPendingReadRequests, maxPendingWriteRequests, rwRatio, seed, + setup), minAddress(minAddress), maxAddress(maxAddress), addressIncrement(addressIncrement), + currentAddress(minAddress) { } @@ -145,6 +148,8 @@ uint64_t TrafficGeneratorSequential::getNextAddress() { uint64_t address = currentAddress; currentAddress += addressIncrement; + if (currentAddress > maxAddress) + currentAddress = minAddress; return address; } @@ -154,7 +159,7 @@ TrafficGeneratorHammer::TrafficGeneratorHammer(const sc_core::sc_module_name &na uint64_t numRequests, uint64_t rowIncrement, TraceSetup *setup) : - TrafficGenerator(name, generatorClk, numRequests, 1, 1, 1, 1, setup), rowIncrement(rowIncrement) + TrafficGenerator(name, generatorClk, numRequests, 1, 1, 1.0f, 1, setup), rowIncrement(rowIncrement) { } diff --git a/DRAMSys/simulator/TrafficGenerator.h b/DRAMSys/simulator/TrafficGenerator.h index 4546a867..394e1d81 100644 --- a/DRAMSys/simulator/TrafficGenerator.h +++ b/DRAMSys/simulator/TrafficGenerator.h @@ -78,6 +78,8 @@ public: uint64_t numRequests, unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests, + uint64_t minAddress, + uint64_t maxAddress, float rwRatio, unsigned int seed, TraceSetup *setup); @@ -96,6 +98,8 @@ public: uint64_t numRequests, unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests, + uint64_t minAddress, + uint64_t maxAddress, float rwRatio, uint64_t addressIncrement, unsigned int seed, @@ -104,8 +108,10 @@ public: private: uint64_t getNextAddress() override; - uint64_t currentAddress = 0x0; + uint64_t currentAddress; uint64_t addressIncrement; + uint64_t minAddress; + uint64_t maxAddress; }; class TrafficGeneratorHammer final : public TrafficGenerator