Implement maxTransactions for TrafficGenerator SM
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user