Add minAddress and maxAddress fields to traffic generators.

This commit is contained in:
Lukas Steiner
2021-09-30 11:13:40 +02:00
parent fdbfc416f5
commit 98e6e2be2c
3 changed files with 57 additions and 17 deletions

View File

@@ -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;

View File

@@ -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<uint64_t>
(0, Configuration::getInstance().memSpec->getSimMemSizeInBytes());
randomAddressDistribution = std::uniform_int_distribution<uint64_t> (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)
{
}

View File

@@ -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