diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2013-05-30 12:54:05 -0400 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2013-05-30 12:54:05 -0400 |
commit | 4931414ca79b97ee64a958c4dd4ed1cafc44b4bd (patch) | |
tree | d906914433751bd435e53888e7a8a9aa63b43b5f /src/cpu/testers/traffic_gen/generators.cc | |
parent | c9c35da9343a763385f8c4680ff9b667be224e1d (diff) | |
download | gem5-4931414ca79b97ee64a958c4dd4ed1cafc44b4bd.tar.xz |
cpu: Block traffic generator when requests have to retry
This patch changes the queued port for a conventional master port and
stalls the traffic generator when requests are not immediately
accepted. This is a first step to allowing elasticity in the injection
of requests.
The patch also adds stats for the sent packets and retries, and
slightly changes how the nextPacketTick and getNextPacket
interact. The advancing of the trace is now moved to getNextPacket and
nextPacketTick is only responsible for answering the question when the
next packet should be sent.
Diffstat (limited to 'src/cpu/testers/traffic_gen/generators.cc')
-rw-r--r-- | src/cpu/testers/traffic_gen/generators.cc | 79 |
1 files changed, 39 insertions, 40 deletions
diff --git a/src/cpu/testers/traffic_gen/generators.cc b/src/cpu/testers/traffic_gen/generators.cc index 4d1812cd4..f9556b2b3 100644 --- a/src/cpu/testers/traffic_gen/generators.cc +++ b/src/cpu/testers/traffic_gen/generators.cc @@ -100,20 +100,20 @@ LinearGen::getNextPacket() // increment the address nextAddr += blocksize; - return pkt; -} - -Tick -LinearGen::nextPacketTick() -{ // If we have reached the end of the address space, reset the // address to the start of the range - if (nextAddr + blocksize > endAddr) { + if (nextAddr > endAddr) { DPRINTF(TrafficGen, "Wrapping address to the start of " "the range\n"); nextAddr = startAddr; } + return pkt; +} + +Tick +LinearGen::nextPacketTick() const +{ // Check to see if we have reached the data limit. If dataLimit is // zero we do not have a data limit and therefore we will keep // generating requests for the entire residency in this state. @@ -162,7 +162,7 @@ RandomGen::getNextPacket() } Tick -RandomGen::nextPacketTick() +RandomGen::nextPacketTick() const { // Check to see if we have reached the data limit. If dataLimit is // zero we do not have a data limit and therefore we will keep @@ -217,38 +217,19 @@ TraceGen::InputStream::read(TraceElement& element) } Tick -TraceGen::nextPacketTick() { - if (traceComplete) +TraceGen::nextPacketTick() const +{ + if (traceComplete) { + DPRINTF(TrafficGen, "No next tick as trace is finished\n"); // We are at the end of the file, thus we have no more data in // the trace Return MaxTick to signal that there will be no // more transactions in this active period for the state. return MaxTick; - - - //Reset the nextElement to the default values - currElement = nextElement; - nextElement.clear(); - - // We need to look at the next line to calculate the next time an - // event occurs, or potentially return MaxTick to signal that - // nothing has to be done. - if (!trace.read(nextElement)) { - traceComplete = true; - return MaxTick; } - DPRINTF(TrafficGen, "currElement: %c addr %d size %d tick %d (%d)\n", - currElement.cmd.isRead() ? 'r' : 'w', - currElement.addr, - currElement.blocksize, - currElement.tick + tickOffset, - currElement.tick); - - DPRINTF(TrafficGen, "nextElement: %c addr %d size %d tick %d (%d)\n", - nextElement.cmd.isRead() ? 'r' : 'w', - nextElement.addr, - nextElement.blocksize, - nextElement.tick + tickOffset, + assert(nextElement.isValid()); + + DPRINTF(TrafficGen, "Next packet tick is %d\n", tickOffset + nextElement.tick); return tickOffset + nextElement.tick; @@ -261,17 +242,24 @@ TraceGen::enter() tickOffset = curTick(); // clear everything - nextElement.clear(); currElement.clear(); - traceComplete = false; + // read the first element in the file and set the complete flag + traceComplete = !trace.read(nextElement); } PacketPtr TraceGen::getNextPacket() { - // it is the responsibility of nextPacketTick to prevent the - // state graph from executing the state if it should not + // shift things one step forward + currElement = nextElement; + nextElement.clear(); + + // read the next element and set the complete flag + traceComplete = !trace.read(nextElement); + + // it is the responsibility of the traceComplete flag to ensure we + // always have a valid element here assert(currElement.isValid()); DPRINTF(TrafficGen, "TraceGen::getNextPacket: %c %d %d %d 0x%x\n", @@ -281,8 +269,19 @@ TraceGen::getNextPacket() currElement.tick, currElement.flags); - return getPacket(currElement.addr + addrOffset, currElement.blocksize, - currElement.cmd, currElement.flags); + PacketPtr pkt = getPacket(currElement.addr + addrOffset, + currElement.blocksize, + currElement.cmd, currElement.flags); + + if (!traceComplete) + DPRINTF(TrafficGen, "nextElement: %c addr %d size %d tick %d (%d)\n", + nextElement.cmd.isRead() ? 'r' : 'w', + nextElement.addr, + nextElement.blocksize, + nextElement.tick + tickOffset, + nextElement.tick); + + return pkt; } void |