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