SeriesRequestGenerator.cc revision 10348
14679Sgblack@eecs.umich.edu/* 24679Sgblack@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 34679Sgblack@eecs.umich.edu * Copyright (c) 2009-2010 Advanced Micro Devices, Inc. 44679Sgblack@eecs.umich.edu * All rights reserved. 54679Sgblack@eecs.umich.edu * 64679Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 74679Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 84679Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 94679Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 104679Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 114679Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 124679Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 134679Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 144679Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 154679Sgblack@eecs.umich.edu * this software without specific prior written permission. 164679Sgblack@eecs.umich.edu * 174679Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 184679Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 194679Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 204679Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 214679Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 224679Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 234679Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 244679Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 254679Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 264679Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 274679Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 284679Sgblack@eecs.umich.edu */ 294679Sgblack@eecs.umich.edu 304679Sgblack@eecs.umich.edu#include "base/random.hh" 314679Sgblack@eecs.umich.edu#include "cpu/testers/directedtest/DirectedGenerator.hh" 324679Sgblack@eecs.umich.edu#include "cpu/testers/directedtest/RubyDirectedTester.hh" 334679Sgblack@eecs.umich.edu#include "cpu/testers/directedtest/SeriesRequestGenerator.hh" 344679Sgblack@eecs.umich.edu#include "debug/DirectedTest.hh" 354679Sgblack@eecs.umich.edu 364679Sgblack@eecs.umich.eduSeriesRequestGenerator::SeriesRequestGenerator(const Params *p) 374679Sgblack@eecs.umich.edu : DirectedGenerator(p), 384679Sgblack@eecs.umich.edu m_addr_increment_size(p->addr_increment_size), 394679Sgblack@eecs.umich.edu m_percent_writes(p->percent_writes) 404679Sgblack@eecs.umich.edu{ 414679Sgblack@eecs.umich.edu m_status = SeriesRequestGeneratorStatus_Thinking; 424679Sgblack@eecs.umich.edu m_active_node = 0; 434679Sgblack@eecs.umich.edu m_address = 0x0; 444679Sgblack@eecs.umich.edu} 454679Sgblack@eecs.umich.edu 464679Sgblack@eecs.umich.eduSeriesRequestGenerator::~SeriesRequestGenerator() 474679Sgblack@eecs.umich.edu{ 484679Sgblack@eecs.umich.edu} 494679Sgblack@eecs.umich.edu 504679Sgblack@eecs.umich.edubool 514679Sgblack@eecs.umich.eduSeriesRequestGenerator::initiate() 524679Sgblack@eecs.umich.edu{ 534679Sgblack@eecs.umich.edu DPRINTF(DirectedTest, "initiating request\n"); 544679Sgblack@eecs.umich.edu assert(m_status == SeriesRequestGeneratorStatus_Thinking); 554679Sgblack@eecs.umich.edu 564679Sgblack@eecs.umich.edu MasterPort* port = m_directed_tester->getCpuPort(m_active_node); 574679Sgblack@eecs.umich.edu 584679Sgblack@eecs.umich.edu Request::Flags flags; 594679Sgblack@eecs.umich.edu 604679Sgblack@eecs.umich.edu // For simplicity, requests are assumed to be 1 byte-sized 614679Sgblack@eecs.umich.edu Request *req = new Request(m_address, 1, flags, masterId); 624679Sgblack@eecs.umich.edu 634679Sgblack@eecs.umich.edu Packet::Command cmd; 644679Sgblack@eecs.umich.edu bool do_write = (random_mt.random(0, 100) < m_percent_writes); 654688Sgblack@eecs.umich.edu if (do_write) { 664688Sgblack@eecs.umich.edu cmd = MemCmd::WriteReq; 674688Sgblack@eecs.umich.edu } else { 684688Sgblack@eecs.umich.edu cmd = MemCmd::ReadReq; 694688Sgblack@eecs.umich.edu } 704688Sgblack@eecs.umich.edu 714688Sgblack@eecs.umich.edu PacketPtr pkt = new Packet(req, cmd); 724688Sgblack@eecs.umich.edu uint8_t* dummyData = new uint8_t; 734688Sgblack@eecs.umich.edu *dummyData = 0; 744688Sgblack@eecs.umich.edu pkt->dataDynamic(dummyData); 754688Sgblack@eecs.umich.edu 764688Sgblack@eecs.umich.edu if (port->sendTimingReq(pkt)) { 774688Sgblack@eecs.umich.edu DPRINTF(DirectedTest, "initiating request - successful\n"); 784688Sgblack@eecs.umich.edu m_status = SeriesRequestGeneratorStatus_Request_Pending; 794688Sgblack@eecs.umich.edu return true; 804688Sgblack@eecs.umich.edu } else { 814688Sgblack@eecs.umich.edu // If the packet did not issue, must delete 824688Sgblack@eecs.umich.edu // Note: No need to delete the data, the packet destructor 834688Sgblack@eecs.umich.edu // will delete it 844688Sgblack@eecs.umich.edu delete pkt->req; 854688Sgblack@eecs.umich.edu delete pkt; 864688Sgblack@eecs.umich.edu 874688Sgblack@eecs.umich.edu DPRINTF(DirectedTest, "failed to initiate request - sequencer not ready\n"); 884688Sgblack@eecs.umich.edu return false; 894688Sgblack@eecs.umich.edu } 904688Sgblack@eecs.umich.edu} 914688Sgblack@eecs.umich.edu 924688Sgblack@eecs.umich.eduvoid 934688Sgblack@eecs.umich.eduSeriesRequestGenerator::performCallback(uint32_t proc, Addr address) 944688Sgblack@eecs.umich.edu{ 954688Sgblack@eecs.umich.edu assert(m_active_node == proc); 964688Sgblack@eecs.umich.edu assert(m_address == address); 974688Sgblack@eecs.umich.edu assert(m_status == SeriesRequestGeneratorStatus_Request_Pending); 984688Sgblack@eecs.umich.edu 994688Sgblack@eecs.umich.edu m_status = SeriesRequestGeneratorStatus_Thinking; 1004688Sgblack@eecs.umich.edu m_active_node++; 1014688Sgblack@eecs.umich.edu if (m_active_node == m_num_cpus) { 1024688Sgblack@eecs.umich.edu // 1034688Sgblack@eecs.umich.edu // Cycle of requests completed, increment cycle completions and restart 1044688Sgblack@eecs.umich.edu // at cpu zero 1054688Sgblack@eecs.umich.edu // 1064679Sgblack@eecs.umich.edu m_directed_tester->incrementCycleCompletions(); 1074679Sgblack@eecs.umich.edu m_address += m_addr_increment_size; 1084679Sgblack@eecs.umich.edu m_active_node = 0; 1094688Sgblack@eecs.umich.edu } 1104679Sgblack@eecs.umich.edu} 1114679Sgblack@eecs.umich.edu 1124679Sgblack@eecs.umich.eduSeriesRequestGenerator * 1134688Sgblack@eecs.umich.eduSeriesRequestGeneratorParams::create() 1144688Sgblack@eecs.umich.edu{ 1154688Sgblack@eecs.umich.edu return new SeriesRequestGenerator(this); 1164688Sgblack@eecs.umich.edu} 1174688Sgblack@eecs.umich.edu