random_gen.cc revision 12396
17639Sgblack@eecs.umich.edu/*
27639Sgblack@eecs.umich.edu * Copyright (c) 2012-2013, 2016-2017 ARM Limited
310037SARM gem5 Developers * All rights reserved
47639Sgblack@eecs.umich.edu *
57639Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67639Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77639Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87639Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97639Sgblack@eecs.umich.edu * licensed here under.  You may use the software subject to the license
107639Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117639Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127639Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137639Sgblack@eecs.umich.edu *
147639Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
157639Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
167639Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
177639Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
187639Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
197639Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
207639Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
217639Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
227639Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237639Sgblack@eecs.umich.edu * this software without specific prior written permission.
247639Sgblack@eecs.umich.edu *
257639Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
267639Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
277639Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
287639Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
297639Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
307639Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
317639Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327639Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
337639Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
347639Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
357639Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
367639Sgblack@eecs.umich.edu *
377639Sgblack@eecs.umich.edu * Authors: Thomas Grass
387639Sgblack@eecs.umich.edu *          Andreas Hansson
397639Sgblack@eecs.umich.edu *          Sascha Bischoff
407639Sgblack@eecs.umich.edu *          Neha Agarwal
417639Sgblack@eecs.umich.edu */
427639Sgblack@eecs.umich.edu
437639Sgblack@eecs.umich.edu#include "cpu/testers/traffic_gen/random_gen.hh"
447639Sgblack@eecs.umich.edu
457639Sgblack@eecs.umich.edu#include <algorithm>
467639Sgblack@eecs.umich.edu
477639Sgblack@eecs.umich.edu#include "base/random.hh"
487639Sgblack@eecs.umich.edu#include "base/trace.hh"
497639Sgblack@eecs.umich.edu#include "debug/TrafficGen.hh"
507639Sgblack@eecs.umich.edu#include "proto/packet.pb.h"
517639Sgblack@eecs.umich.edu
527639Sgblack@eecs.umich.eduvoid
537639Sgblack@eecs.umich.eduRandomGen::enter()
547639Sgblack@eecs.umich.edu{
557639Sgblack@eecs.umich.edu    // reset the counter to zero
567639Sgblack@eecs.umich.edu    dataManipulated = 0;
577639Sgblack@eecs.umich.edu}
587639Sgblack@eecs.umich.edu
597639Sgblack@eecs.umich.eduPacketPtr
607639Sgblack@eecs.umich.eduRandomGen::getNextPacket()
617639Sgblack@eecs.umich.edu{
627639Sgblack@eecs.umich.edu    // choose if we generate a read or a write here
637639Sgblack@eecs.umich.edu    bool isRead = readPercent != 0 &&
647639Sgblack@eecs.umich.edu        (readPercent == 100 || random_mt.random(0, 100) < readPercent);
657639Sgblack@eecs.umich.edu
667639Sgblack@eecs.umich.edu    assert((readPercent == 0 && !isRead) || (readPercent == 100 && isRead) ||
677639Sgblack@eecs.umich.edu           readPercent != 100);
687639Sgblack@eecs.umich.edu
697639Sgblack@eecs.umich.edu    // address of the request
707639Sgblack@eecs.umich.edu    Addr addr = random_mt.random(startAddr, endAddr - 1);
717639Sgblack@eecs.umich.edu
727639Sgblack@eecs.umich.edu    // round down to start address of block
737639Sgblack@eecs.umich.edu    addr -= addr % blocksize;
747639Sgblack@eecs.umich.edu
757639Sgblack@eecs.umich.edu    DPRINTF(TrafficGen, "RandomGen::getNextPacket: %c to addr %x, size %d\n",
767639Sgblack@eecs.umich.edu            isRead ? 'r' : 'w', addr, blocksize);
777639Sgblack@eecs.umich.edu
787639Sgblack@eecs.umich.edu    // add the amount of data manipulated to the total
797639Sgblack@eecs.umich.edu    dataManipulated += blocksize;
807639Sgblack@eecs.umich.edu
817639Sgblack@eecs.umich.edu    // create a new request packet
827639Sgblack@eecs.umich.edu    return getPacket(addr, blocksize,
837639Sgblack@eecs.umich.edu                     isRead ? MemCmd::ReadReq : MemCmd::WriteReq);
847639Sgblack@eecs.umich.edu}
857639Sgblack@eecs.umich.edu
867639Sgblack@eecs.umich.eduTick
877639Sgblack@eecs.umich.eduRandomGen::nextPacketTick(bool elastic, Tick delay) const
887639Sgblack@eecs.umich.edu{
897639Sgblack@eecs.umich.edu    // Check to see if we have reached the data limit. If dataLimit is
907639Sgblack@eecs.umich.edu    // zero we do not have a data limit and therefore we will keep
917639Sgblack@eecs.umich.edu    // generating requests for the entire residency in this state.
927639Sgblack@eecs.umich.edu    if (dataLimit && dataManipulated >= dataLimit)
937639Sgblack@eecs.umich.edu    {
947639Sgblack@eecs.umich.edu        DPRINTF(TrafficGen, "Data limit for RandomGen reached.\n");
957639Sgblack@eecs.umich.edu        // No more requests. Return MaxTick.
967639Sgblack@eecs.umich.edu        return MaxTick;
9710037SARM gem5 Developers    } else {
9810037SARM gem5 Developers        // return the time when the next request should take place
997639Sgblack@eecs.umich.edu        Tick wait = random_mt.random(minPeriod, maxPeriod);
1007639Sgblack@eecs.umich.edu
1017639Sgblack@eecs.umich.edu        // compensate for the delay experienced to not be elastic, by
1027639Sgblack@eecs.umich.edu        // default the value we generate is from the time we are
1037639Sgblack@eecs.umich.edu        // asked, so the elasticity happens automatically
1047639Sgblack@eecs.umich.edu        if (!elastic) {
1057639Sgblack@eecs.umich.edu            if (wait < delay)
1067639Sgblack@eecs.umich.edu                wait = 0;
1077639Sgblack@eecs.umich.edu            else
1087639Sgblack@eecs.umich.edu                wait -= delay;
1097639Sgblack@eecs.umich.edu        }
1107639Sgblack@eecs.umich.edu
1117639Sgblack@eecs.umich.edu        return curTick() + wait;
1127639Sgblack@eecs.umich.edu    }
1137639Sgblack@eecs.umich.edu}
1147639Sgblack@eecs.umich.edu