memtest.hh revision 5543
14997Sgblack@eecs.umich.edu/*
24997Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
34997Sgblack@eecs.umich.edu * All rights reserved.
44997Sgblack@eecs.umich.edu *
54997Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
64997Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
74997Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
84997Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
94997Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
104997Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
114997Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
124997Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
134997Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
144997Sgblack@eecs.umich.edu * this software without specific prior written permission.
154997Sgblack@eecs.umich.edu *
164997Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174997Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184997Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194997Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204997Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214997Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224997Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234997Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244997Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254997Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264997Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274997Sgblack@eecs.umich.edu *
284997Sgblack@eecs.umich.edu * Authors: Erik Hallnor
294997Sgblack@eecs.umich.edu *          Steve Reinhardt
304997Sgblack@eecs.umich.edu */
314997Sgblack@eecs.umich.edu
324997Sgblack@eecs.umich.edu#ifndef __CPU_MEMTEST_MEMTEST_HH__
334997Sgblack@eecs.umich.edu#define __CPU_MEMTEST_MEMTEST_HH__
344997Sgblack@eecs.umich.edu
354997Sgblack@eecs.umich.edu#include <set>
364997Sgblack@eecs.umich.edu
374997Sgblack@eecs.umich.edu#include "base/statistics.hh"
384997Sgblack@eecs.umich.edu#include "base/fast_alloc.hh"
394997Sgblack@eecs.umich.edu#include "params/MemTest.hh"
404997Sgblack@eecs.umich.edu#include "sim/eventq.hh"
414997Sgblack@eecs.umich.edu#include "sim/sim_exit.hh"
424997Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
434997Sgblack@eecs.umich.edu#include "sim/stats.hh"
444997Sgblack@eecs.umich.edu#include "mem/mem_object.hh"
454997Sgblack@eecs.umich.edu#include "mem/port.hh"
464997Sgblack@eecs.umich.edu
474997Sgblack@eecs.umich.educlass Packet;
484997Sgblack@eecs.umich.educlass MemTest : public MemObject
494997Sgblack@eecs.umich.edu{
504997Sgblack@eecs.umich.edu  public:
514997Sgblack@eecs.umich.edu    typedef MemTestParams Params;
524997Sgblack@eecs.umich.edu    MemTest(const Params *p);
534997Sgblack@eecs.umich.edu
544997Sgblack@eecs.umich.edu    virtual void init();
554997Sgblack@eecs.umich.edu
564997Sgblack@eecs.umich.edu    // register statistics
574997Sgblack@eecs.umich.edu    virtual void regStats();
584997Sgblack@eecs.umich.edu
594997Sgblack@eecs.umich.edu    inline Tick ticks(int numCycles) const { return numCycles; }
605086Sgblack@eecs.umich.edu
615086Sgblack@eecs.umich.edu    // main simulation loop (one cycle)
625124Sgblack@eecs.umich.edu    void tick();
635086Sgblack@eecs.umich.edu
645149Sgblack@eecs.umich.edu    virtual Port *getPort(const std::string &if_name, int idx = -1);
655086Sgblack@eecs.umich.edu
665086Sgblack@eecs.umich.edu    /**
675237Sgblack@eecs.umich.edu     * Print state of address in memory system via PrintReq (for
685086Sgblack@eecs.umich.edu     * debugging).
695086Sgblack@eecs.umich.edu     */
705086Sgblack@eecs.umich.edu    void printAddr(Addr a);
715086Sgblack@eecs.umich.edu
725245Sgblack@eecs.umich.edu  protected:
735245Sgblack@eecs.umich.edu    class TickEvent : public Event
745245Sgblack@eecs.umich.edu    {
755245Sgblack@eecs.umich.edu      private:
765086Sgblack@eecs.umich.edu        MemTest *cpu;
775086Sgblack@eecs.umich.edu      public:
785086Sgblack@eecs.umich.edu        TickEvent(MemTest *c)
795358Sgblack@eecs.umich.edu            : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {}
805124Sgblack@eecs.umich.edu        void process() {cpu->tick();}
815124Sgblack@eecs.umich.edu        virtual const char *description() const { return "MemTest tick"; }
825124Sgblack@eecs.umich.edu    };
835124Sgblack@eecs.umich.edu
845124Sgblack@eecs.umich.edu    TickEvent tickEvent;
855124Sgblack@eecs.umich.edu
865124Sgblack@eecs.umich.edu    class CpuPort : public Port
875237Sgblack@eecs.umich.edu    {
885245Sgblack@eecs.umich.edu        MemTest *memtest;
895245Sgblack@eecs.umich.edu
905245Sgblack@eecs.umich.edu      public:
915236Sgblack@eecs.umich.edu
925236Sgblack@eecs.umich.edu        CpuPort(const std::string &_name, MemTest *_memtest)
935236Sgblack@eecs.umich.edu            : Port(_name, _memtest), memtest(_memtest)
945124Sgblack@eecs.umich.edu        { }
955124Sgblack@eecs.umich.edu
965124Sgblack@eecs.umich.edu        bool snoopRangeSent;
975124Sgblack@eecs.umich.edu
985124Sgblack@eecs.umich.edu      protected:
995124Sgblack@eecs.umich.edu
1005124Sgblack@eecs.umich.edu        virtual bool recvTiming(PacketPtr pkt);
1015124Sgblack@eecs.umich.edu
1025124Sgblack@eecs.umich.edu        virtual Tick recvAtomic(PacketPtr pkt);
1035124Sgblack@eecs.umich.edu
1045124Sgblack@eecs.umich.edu        virtual void recvFunctional(PacketPtr pkt);
1055124Sgblack@eecs.umich.edu
1065124Sgblack@eecs.umich.edu        virtual void recvStatusChange(Status status);
1075124Sgblack@eecs.umich.edu
1085124Sgblack@eecs.umich.edu        virtual void recvRetry();
1095124Sgblack@eecs.umich.edu
1105124Sgblack@eecs.umich.edu        virtual void getDeviceAddressRanges(AddrRangeList &resp,
1115124Sgblack@eecs.umich.edu                                            bool &snoop)
1125124Sgblack@eecs.umich.edu        { resp.clear(); snoop = false; }
1135124Sgblack@eecs.umich.edu    };
1145124Sgblack@eecs.umich.edu
1155124Sgblack@eecs.umich.edu    CpuPort cachePort;
1165124Sgblack@eecs.umich.edu    CpuPort funcPort;
1175124Sgblack@eecs.umich.edu
1185124Sgblack@eecs.umich.edu    bool snoopRangeSent;
1195124Sgblack@eecs.umich.edu
1205124Sgblack@eecs.umich.edu    class MemTestSenderState : public Packet::SenderState, public FastAlloc
1215124Sgblack@eecs.umich.edu    {
1225124Sgblack@eecs.umich.edu      public:
1235124Sgblack@eecs.umich.edu        /** Constructor. */
1245124Sgblack@eecs.umich.edu        MemTestSenderState(uint8_t *_data)
1255124Sgblack@eecs.umich.edu            : data(_data)
1265124Sgblack@eecs.umich.edu        { }
1275124Sgblack@eecs.umich.edu
1285124Sgblack@eecs.umich.edu        // Hold onto data pointer
1295124Sgblack@eecs.umich.edu        uint8_t *data;
1305124Sgblack@eecs.umich.edu    };
1315245Sgblack@eecs.umich.edu
1325245Sgblack@eecs.umich.edu    PacketPtr retryPkt;
1335245Sgblack@eecs.umich.edu
1345245Sgblack@eecs.umich.edu    bool accessRetry;
1355245Sgblack@eecs.umich.edu
1365245Sgblack@eecs.umich.edu    unsigned size;              // size of testing memory region
1375245Sgblack@eecs.umich.edu
1385245Sgblack@eecs.umich.edu    unsigned percentReads;      // target percentage of read accesses
1395124Sgblack@eecs.umich.edu    unsigned percentFunctional; // target percentage of functional accesses
1405124Sgblack@eecs.umich.edu    unsigned percentUncacheable;
1415124Sgblack@eecs.umich.edu
1425242Sgblack@eecs.umich.edu    int id;
1435242Sgblack@eecs.umich.edu
1445242Sgblack@eecs.umich.edu    std::set<unsigned> outstandingAddrs;
1455242Sgblack@eecs.umich.edu
1465242Sgblack@eecs.umich.edu    unsigned blockSize;
1475242Sgblack@eecs.umich.edu
1485124Sgblack@eecs.umich.edu    Addr blockAddrMask;
1495124Sgblack@eecs.umich.edu
1505124Sgblack@eecs.umich.edu    Addr blockAddr(Addr addr)
1515357Sgblack@eecs.umich.edu    {
1525357Sgblack@eecs.umich.edu        return (addr & ~blockAddrMask);
1535357Sgblack@eecs.umich.edu    }
1545357Sgblack@eecs.umich.edu
1555357Sgblack@eecs.umich.edu    Addr traceBlockAddr;
1565357Sgblack@eecs.umich.edu
1575124Sgblack@eecs.umich.edu    Addr baseAddr1;             // fix this to option
1585124Sgblack@eecs.umich.edu    Addr baseAddr2;             // fix this to option
1595242Sgblack@eecs.umich.edu    Addr uncacheAddr;
1605242Sgblack@eecs.umich.edu
1615242Sgblack@eecs.umich.edu    unsigned progressInterval;  // frequency of progress reports
1625242Sgblack@eecs.umich.edu    Tick nextProgressMessage;   // access # for next progress report
1635242Sgblack@eecs.umich.edu
1645242Sgblack@eecs.umich.edu    unsigned percentSourceUnaligned;
1655242Sgblack@eecs.umich.edu    unsigned percentDestUnaligned;
1665242Sgblack@eecs.umich.edu
1675242Sgblack@eecs.umich.edu    Tick noResponseCycles;
1685242Sgblack@eecs.umich.edu
1695124Sgblack@eecs.umich.edu    uint64_t numReads;
1705124Sgblack@eecs.umich.edu    uint64_t maxLoads;
1715124Sgblack@eecs.umich.edu
1725358Sgblack@eecs.umich.edu    bool atomic;
1735086Sgblack@eecs.umich.edu
1745359Sgblack@eecs.umich.edu    Stats::Scalar<> numReadsStat;
1755359Sgblack@eecs.umich.edu    Stats::Scalar<> numWritesStat;
1765359Sgblack@eecs.umich.edu    Stats::Scalar<> numCopiesStat;
1775359Sgblack@eecs.umich.edu
1785359Sgblack@eecs.umich.edu    // called by MemCompleteEvent::process()
1795086Sgblack@eecs.umich.edu    void completeRequest(PacketPtr pkt);
1805086Sgblack@eecs.umich.edu
1815140Sgblack@eecs.umich.edu    void sendPkt(PacketPtr pkt);
1825086Sgblack@eecs.umich.edu
1835140Sgblack@eecs.umich.edu    void doRetry();
1845086Sgblack@eecs.umich.edu
1855124Sgblack@eecs.umich.edu    friend class MemCompleteEvent;
1865140Sgblack@eecs.umich.edu};
1875124Sgblack@eecs.umich.edu
1885124Sgblack@eecs.umich.edu#endif // __CPU_MEMTEST_MEMTEST_HH__
1895140Sgblack@eecs.umich.edu
1905294Sgblack@eecs.umich.edu
1915124Sgblack@eecs.umich.edu
1925124Sgblack@eecs.umich.edu