SeriesRequestGenerator.cc revision 8655
16019Shines@cs.fsu.edu/* 26019Shines@cs.fsu.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 37178Sgblack@eecs.umich.edu * Copyright (c) 2009-2010 Advanced Micro Devices, Inc. 47178Sgblack@eecs.umich.edu * All rights reserved. 57178Sgblack@eecs.umich.edu * 67178Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 77178Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 87178Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 97178Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 107178Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 117178Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 127178Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 137178Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 147178Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 156019Shines@cs.fsu.edu * this software without specific prior written permission. 166019Shines@cs.fsu.edu * 176019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 186019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 196019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 206019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 216019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 226019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 236019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 246019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 256019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 266019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 276019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286019Shines@cs.fsu.edu */ 296019Shines@cs.fsu.edu 306019Shines@cs.fsu.edu#include "cpu/testers/directedtest/DirectedGenerator.hh" 316019Shines@cs.fsu.edu#include "cpu/testers/directedtest/RubyDirectedTester.hh" 326019Shines@cs.fsu.edu#include "cpu/testers/directedtest/SeriesRequestGenerator.hh" 336019Shines@cs.fsu.edu#include "debug/DirectedTest.hh" 346019Shines@cs.fsu.edu 356019Shines@cs.fsu.eduSeriesRequestGenerator::SeriesRequestGenerator(const Params *p) 366019Shines@cs.fsu.edu : DirectedGenerator(p) 376019Shines@cs.fsu.edu{ 386019Shines@cs.fsu.edu m_status = SeriesRequestGeneratorStatus_Thinking; 396019Shines@cs.fsu.edu m_active_node = 0; 406019Shines@cs.fsu.edu m_address = 0x0; 416019Shines@cs.fsu.edu m_addr_increment_size = p->addr_increment_size; 426019Shines@cs.fsu.edu m_issue_writes = p->issue_writes; 436019Shines@cs.fsu.edu} 446019Shines@cs.fsu.edu 456019Shines@cs.fsu.eduSeriesRequestGenerator::~SeriesRequestGenerator() 466019Shines@cs.fsu.edu{ 476019Shines@cs.fsu.edu} 486019Shines@cs.fsu.edu 496019Shines@cs.fsu.edubool 506019Shines@cs.fsu.eduSeriesRequestGenerator::initiate() 516019Shines@cs.fsu.edu{ 526019Shines@cs.fsu.edu DPRINTF(DirectedTest, "initiating request\n"); 536019Shines@cs.fsu.edu assert(m_status == SeriesRequestGeneratorStatus_Thinking); 546019Shines@cs.fsu.edu 556019Shines@cs.fsu.edu RubyDirectedTester::CpuPort* port = 566019Shines@cs.fsu.edu safe_cast<RubyDirectedTester::CpuPort*>(m_directed_tester-> 576019Shines@cs.fsu.edu getCpuPort(m_active_node)); 586243Sgblack@eecs.umich.edu 596243Sgblack@eecs.umich.edu Request::Flags flags; 606243Sgblack@eecs.umich.edu 616243Sgblack@eecs.umich.edu // For simplicity, requests are assumed to be 1 byte-sized 626243Sgblack@eecs.umich.edu Request *req = new Request(m_address, 1, flags); 636019Shines@cs.fsu.edu 646019Shines@cs.fsu.edu Packet::Command cmd; 656019Shines@cs.fsu.edu if (m_issue_writes) { 666019Shines@cs.fsu.edu cmd = MemCmd::WriteReq; 676019Shines@cs.fsu.edu } else { 686019Shines@cs.fsu.edu cmd = MemCmd::ReadReq; 696019Shines@cs.fsu.edu } 706019Shines@cs.fsu.edu PacketPtr pkt = new Packet(req, cmd, m_active_node); 716019Shines@cs.fsu.edu uint8_t* dummyData = new uint8_t; 726019Shines@cs.fsu.edu *dummyData = 0; 736019Shines@cs.fsu.edu pkt->dataDynamic(dummyData); 746019Shines@cs.fsu.edu 756019Shines@cs.fsu.edu if (port->sendTiming(pkt)) { 766019Shines@cs.fsu.edu DPRINTF(DirectedTest, "initiating request - successful\n"); 776019Shines@cs.fsu.edu m_status = SeriesRequestGeneratorStatus_Request_Pending; 786019Shines@cs.fsu.edu return true; 796019Shines@cs.fsu.edu } else { 806019Shines@cs.fsu.edu // If the packet did not issue, must delete 816019Shines@cs.fsu.edu // Note: No need to delete the data, the packet destructor 826019Shines@cs.fsu.edu // will delete it 836019Shines@cs.fsu.edu delete pkt->req; 846019Shines@cs.fsu.edu delete pkt; 856019Shines@cs.fsu.edu 866019Shines@cs.fsu.edu DPRINTF(DirectedTest, "failed to initiate request - sequencer not ready\n"); 876019Shines@cs.fsu.edu return false; 886019Shines@cs.fsu.edu } 896019Shines@cs.fsu.edu} 906019Shines@cs.fsu.edu 916019Shines@cs.fsu.eduvoid 926019Shines@cs.fsu.eduSeriesRequestGenerator::performCallback(uint32_t proc, Addr address) 936019Shines@cs.fsu.edu{ 946252Sgblack@eecs.umich.edu assert(m_active_node == proc); 956243Sgblack@eecs.umich.edu assert(m_address == address); 966243Sgblack@eecs.umich.edu assert(m_status == SeriesRequestGeneratorStatus_Request_Pending); 976243Sgblack@eecs.umich.edu 986019Shines@cs.fsu.edu m_status = SeriesRequestGeneratorStatus_Thinking; 996019Shines@cs.fsu.edu m_active_node++; 1006019Shines@cs.fsu.edu if (m_active_node == m_num_cpus) { 1016019Shines@cs.fsu.edu // 1026019Shines@cs.fsu.edu // Cycle of requests completed, increment cycle completions and restart 1036252Sgblack@eecs.umich.edu // at cpu zero 1046243Sgblack@eecs.umich.edu // 1056243Sgblack@eecs.umich.edu m_directed_tester->incrementCycleCompletions(); 1066243Sgblack@eecs.umich.edu m_address += m_addr_increment_size; 1076019Shines@cs.fsu.edu m_active_node = 0; 1086019Shines@cs.fsu.edu } 1096019Shines@cs.fsu.edu} 1106019Shines@cs.fsu.edu 1116019Shines@cs.fsu.eduSeriesRequestGenerator * 1126019Shines@cs.fsu.eduSeriesRequestGeneratorParams::create() 1136019Shines@cs.fsu.edu{ 1146252Sgblack@eecs.umich.edu return new SeriesRequestGenerator(this); 1156243Sgblack@eecs.umich.edu} 1166243Sgblack@eecs.umich.edu