2 * Copyright (c) 2012-2013, 2016-2017 ARM Limited
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed here under. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "cpu/testers/traffic_gen/linear_gen.hh"
42 #include "base/random.hh"
43 #include "base/trace.hh"
44 #include "debug/TrafficGen.hh"
49 // reset the address and the data counter
55 LinearGen::getNextPacket()
57 // choose if we generate a read or a write here
58 bool isRead
= readPercent
!= 0 &&
59 (readPercent
== 100 || random_mt
.random(0, 100) < readPercent
);
61 assert((readPercent
== 0 && !isRead
) || (readPercent
== 100 && isRead
) ||
64 DPRINTF(TrafficGen
, "LinearGen::getNextPacket: %c to addr %x, size %d\n",
65 isRead
? 'r' : 'w', nextAddr
, blocksize
);
67 // Add the amount of data manipulated to the total
68 dataManipulated
+= blocksize
;
70 PacketPtr pkt
= getPacket(nextAddr
, blocksize
,
71 isRead
? MemCmd::ReadReq
: MemCmd::WriteReq
);
73 // increment the address
74 nextAddr
+= blocksize
;
76 // If we have reached the end of the address space, reset the
77 // address to the start of the range
78 if (nextAddr
> endAddr
) {
79 DPRINTF(TrafficGen
, "Wrapping address to the start of "
88 LinearGen::nextPacketTick(bool elastic
, Tick delay
) const
90 // Check to see if we have reached the data limit. If dataLimit is
91 // zero we do not have a data limit and therefore we will keep
92 // generating requests for the entire residency in this state.
93 if (dataLimit
&& dataManipulated
>= dataLimit
) {
94 DPRINTF(TrafficGen
, "Data limit for LinearGen reached.\n");
95 // there are no more requests, therefore return MaxTick
98 // return the time when the next request should take place
99 Tick wait
= random_mt
.random(minPeriod
, maxPeriod
);
101 // compensate for the delay experienced to not be elastic, by
102 // default the value we generate is from the time we are
103 // asked, so the elasticity happens automatically
111 return curTick() + wait
;