SeriesRequestGenerator.cc revision 9365:644be05ee7c2
15643Sgblack@eecs.umich.edu/* 25643Sgblack@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 35643Sgblack@eecs.umich.edu * Copyright (c) 2009-2010 Advanced Micro Devices, Inc. 45643Sgblack@eecs.umich.edu * All rights reserved. 55643Sgblack@eecs.umich.edu * 65643Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 75643Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 85643Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 95643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 105643Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 115643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 125643Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 135643Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 145643Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 155643Sgblack@eecs.umich.edu * this software without specific prior written permission. 165643Sgblack@eecs.umich.edu * 175643Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 185643Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 195643Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 205643Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 215643Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 225643Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 235643Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 245643Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 255643Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265643Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 275643Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285643Sgblack@eecs.umich.edu */ 295643Sgblack@eecs.umich.edu 305643Sgblack@eecs.umich.edu#include "cpu/testers/directedtest/DirectedGenerator.hh" 316138Sgblack@eecs.umich.edu#include "cpu/testers/directedtest/RubyDirectedTester.hh" 325651Sgblack@eecs.umich.edu#include "cpu/testers/directedtest/SeriesRequestGenerator.hh" 338746Sgblack@eecs.umich.edu#include "debug/DirectedTest.hh" 348232Snate@binkert.org 355643Sgblack@eecs.umich.eduSeriesRequestGenerator::SeriesRequestGenerator(const Params *p) 365657Sgblack@eecs.umich.edu : DirectedGenerator(p), 375643Sgblack@eecs.umich.edu m_addr_increment_size(p->addr_increment_size), 385643Sgblack@eecs.umich.edu m_percent_writes(p->percent_writes) 395643Sgblack@eecs.umich.edu{ 405643Sgblack@eecs.umich.edu m_status = SeriesRequestGeneratorStatus_Thinking; 419805Sstever@gmail.com m_active_node = 0; 429805Sstever@gmail.com m_address = 0x0; 439805Sstever@gmail.com} 445643Sgblack@eecs.umich.edu 457913SBrad.Beckmann@amd.comSeriesRequestGenerator::~SeriesRequestGenerator() 467913SBrad.Beckmann@amd.com{ 477913SBrad.Beckmann@amd.com} 487913SBrad.Beckmann@amd.com 497913SBrad.Beckmann@amd.combool 506136Sgblack@eecs.umich.eduSeriesRequestGenerator::initiate() 515643Sgblack@eecs.umich.edu{ 525643Sgblack@eecs.umich.edu DPRINTF(DirectedTest, "initiating request\n"); 535653Sgblack@eecs.umich.edu assert(m_status == SeriesRequestGeneratorStatus_Thinking); 545653Sgblack@eecs.umich.edu 555653Sgblack@eecs.umich.edu MasterPort* port = m_directed_tester->getCpuPort(m_active_node); 565653Sgblack@eecs.umich.edu 575827Sgblack@eecs.umich.edu Request::Flags flags; 585653Sgblack@eecs.umich.edu 599805Sstever@gmail.com // For simplicity, requests are assumed to be 1 byte-sized 609805Sstever@gmail.com Request *req = new Request(m_address, 1, flags, masterId); 615643Sgblack@eecs.umich.edu 625643Sgblack@eecs.umich.edu Packet::Command cmd; 637913SBrad.Beckmann@amd.com bool do_write = ((random() % 100) < m_percent_writes); 647913SBrad.Beckmann@amd.com if (do_write) { 657913SBrad.Beckmann@amd.com cmd = MemCmd::WriteReq; 667913SBrad.Beckmann@amd.com } else { 677913SBrad.Beckmann@amd.com cmd = MemCmd::ReadReq; 687913SBrad.Beckmann@amd.com } 697913SBrad.Beckmann@amd.com 709805Sstever@gmail.com PacketPtr pkt = new Packet(req, cmd); 717913SBrad.Beckmann@amd.com uint8_t* dummyData = new uint8_t; 727913SBrad.Beckmann@amd.com *dummyData = 0; 737913SBrad.Beckmann@amd.com pkt->dataDynamic(dummyData); 749805Sstever@gmail.com 759805Sstever@gmail.com if (port->sendTimingReq(pkt)) { 769805Sstever@gmail.com DPRINTF(DirectedTest, "initiating request - successful\n"); 779805Sstever@gmail.com m_status = SeriesRequestGeneratorStatus_Request_Pending; 789805Sstever@gmail.com return true; 799805Sstever@gmail.com } else { 809805Sstever@gmail.com // If the packet did not issue, must delete 819805Sstever@gmail.com // Note: No need to delete the data, the packet destructor 829805Sstever@gmail.com // will delete it 839805Sstever@gmail.com delete pkt->req; 849805Sstever@gmail.com delete pkt; 859805Sstever@gmail.com 869805Sstever@gmail.com DPRINTF(DirectedTest, "failed to initiate request - sequencer not ready\n"); 879805Sstever@gmail.com return false; 889805Sstever@gmail.com } 899805Sstever@gmail.com} 909805Sstever@gmail.com 919805Sstever@gmail.comvoid 925643Sgblack@eecs.umich.eduSeriesRequestGenerator::performCallback(uint32_t proc, Addr address) 935643Sgblack@eecs.umich.edu{ 945643Sgblack@eecs.umich.edu assert(m_active_node == proc); 955643Sgblack@eecs.umich.edu assert(m_address == address); 965643Sgblack@eecs.umich.edu assert(m_status == SeriesRequestGeneratorStatus_Request_Pending); 975643Sgblack@eecs.umich.edu 985643Sgblack@eecs.umich.edu m_status = SeriesRequestGeneratorStatus_Thinking; 995643Sgblack@eecs.umich.edu m_active_node++; 1005643Sgblack@eecs.umich.edu if (m_active_node == m_num_cpus) { 1015643Sgblack@eecs.umich.edu // 1025643Sgblack@eecs.umich.edu // Cycle of requests completed, increment cycle completions and restart 1035643Sgblack@eecs.umich.edu // at cpu zero 1045643Sgblack@eecs.umich.edu // 1055643Sgblack@eecs.umich.edu m_directed_tester->incrementCycleCompletions(); 1065643Sgblack@eecs.umich.edu m_address += m_addr_increment_size; 1075898Sgblack@eecs.umich.edu m_active_node = 0; 1089805Sstever@gmail.com } 1095643Sgblack@eecs.umich.edu} 1105643Sgblack@eecs.umich.edu 1115643Sgblack@eecs.umich.eduSeriesRequestGenerator * 1125643Sgblack@eecs.umich.eduSeriesRequestGeneratorParams::create() 1135643Sgblack@eecs.umich.edu{ 1145643Sgblack@eecs.umich.edu return new SeriesRequestGenerator(this); 1155643Sgblack@eecs.umich.edu} 1165643Sgblack@eecs.umich.edu