Implement maxTransactions for TrafficGenerator SM

This commit is contained in:
2022-01-03 11:05:20 +01:00
parent 696e9c17d7
commit 2540c9d194
4 changed files with 38 additions and 11 deletions

View File

@@ -60,6 +60,7 @@ void to_json(json &j, const TraceSetup &c)
{
initiator_j["type"] = "generator";
initiator_j["seed"] = generator->seed;
initiator_j["maxTransactions"] = generator->maxTransactions;
// When there are less than 2 states, flatten out the json.
if (generator->states.size() == 1)
@@ -189,6 +190,9 @@ void from_json(const json &j, TraceSetup &c)
if (initiator_j.contains("seed"))
initiator_j.at("seed").get_to(generator->seed);
if (initiator_j.contains("maxTransactions"))
initiator_j.at("maxTransactions").get_to(generator->maxTransactions);
initiator = std::unique_ptr<TraceGenerator>(generator);
}
else if (type == TrafficInitiatorType::Hammer)

View File

@@ -102,6 +102,7 @@ struct TraceGeneratorStateTransition
struct TraceGenerator : public TrafficInitiator
{
Optional<uint64_t> seed;
Optional<uint64_t> maxTransactions;
std::map<unsigned int, TraceGeneratorState> states;
std::multimap<unsigned int, TraceGeneratorStateTransition> transitions;
};

View File

@@ -38,6 +38,8 @@
#include "TrafficGenerator.h"
#include <limits>
using namespace sc_core;
using namespace tlm;
@@ -95,7 +97,7 @@ void TrafficGeneratorIf::sendNextPayload()
TrafficGenerator::TrafficGenerator(const sc_module_name &name, const DRAMSysConfiguration::TraceGenerator &conf,
TraceSetup *setup)
: TrafficGeneratorIf(name, setup, evaluateMaxPendingReadRequests(conf), evaluateMaxPendingWriteRequests(conf)),
generatorClk(TrafficInitiator::evaluateGeneratorClk(conf)), conf(conf),
generatorClk(TrafficInitiator::evaluateGeneratorClk(conf)), conf(conf), maxTransactions(evaluateMaxTransactions(conf)),
randomGenerator(std::default_random_engine(evaluateSeed(conf)))
{
// Perform checks for all states
@@ -128,6 +130,7 @@ TrafficGenerator::TrafficGenerator(const sc_module_name &name, const DRAMSysConf
void TrafficGenerator::calculateTransitions()
{
unsigned int state = 0;
uint64_t totalTransactions = 0;
stateSequence.push_back(state);
while (true)
@@ -165,7 +168,12 @@ void TrafficGenerator::calculateTransitions()
}
if (transitionFound)
continue;
{
totalTransactions += conf.states.at(state).numRequests;
if (totalTransactions < maxTransactions)
continue;
}
break;
}
@@ -182,6 +190,9 @@ uint64_t TrafficGenerator::getTotalTransactions() const
totalTransactions += conf.states.at(state).numRequests;
}
if (totalTransactions > maxTransactions)
totalTransactions = maxTransactions;
return totalTransactions;
}
@@ -189,7 +200,7 @@ void TrafficGenerator::transitionToNextState()
{
++stateIt;
if (stateIt == stateSequence.cend())
if (stateIt == stateSequence.cend() || transactionsSent >= maxTransactions)
{
// No transition performed.
finished = true;
@@ -260,7 +271,7 @@ uint64_t TrafficGenerator::getNextAddress()
}
}
unsigned int TrafficGenerator::evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf)
uint64_t TrafficGenerator::evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf)
{
if (conf.seed.isValid())
return conf.seed.getValue();
@@ -268,7 +279,15 @@ unsigned int TrafficGenerator::evaluateSeed(const DRAMSysConfiguration::TraceGen
return 0;
}
unsigned int TrafficGenerator::evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state)
uint64_t TrafficGenerator::evaluateMaxTransactions(const DRAMSysConfiguration::TraceGenerator &conf)
{
if (conf.maxTransactions.isValid())
return conf.maxTransactions.getValue();
else
return std::numeric_limits<uint64_t>::max();
}
uint64_t TrafficGenerator::evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state)
{
if (state.minAddress.isValid())
return state.minAddress.getValue();
@@ -276,7 +295,7 @@ unsigned int TrafficGenerator::evaluateMinAddress(const DRAMSysConfiguration::Tr
return 0x00;
}
unsigned int TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state)
uint64_t TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state)
{
if (state.maxAddress.isValid())
return state.maxAddress.getValue();
@@ -284,7 +303,7 @@ unsigned int TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::Tr
return Configuration::getInstance().memSpec->getSimMemSizeInBytes() - 1;
}
unsigned int TrafficGenerator::evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state)
uint64_t TrafficGenerator::evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state)
{
if (state.addressIncrement.isValid())
return state.addressIncrement.getValue();

View File

@@ -68,10 +68,11 @@ public:
uint64_t getTotalTransactions() const;
private:
static unsigned int evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf);
static unsigned int evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state);
static unsigned int evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state);
static unsigned int evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state);
static uint64_t evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf);
static uint64_t evaluateMaxTransactions(const DRAMSysConfiguration::TraceGenerator &conf);
static uint64_t evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state);
static uint64_t evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state);
static uint64_t evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state);
void prepareNextPayload() override;
uint64_t getNextAddress() override;
@@ -89,6 +90,8 @@ private:
uint64_t currentAddress = 0x00;
uint64_t transactionsSentInCurrentState = 0;
const uint64_t maxTransactions;
std::vector<unsigned int> stateSequence;
std::vector<unsigned int>::const_iterator stateIt;