memtest.hh revision 8948
12292SN/A/*
22292SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan
32292SN/A * All rights reserved.
42292SN/A *
52292SN/A * Redistribution and use in source and binary forms, with or without
62292SN/A * modification, are permitted provided that the following conditions are
72292SN/A * met: redistributions of source code must retain the above copyright
82292SN/A * notice, this list of conditions and the following disclaimer;
92292SN/A * redistributions in binary form must reproduce the above copyright
102292SN/A * notice, this list of conditions and the following disclaimer in the
112292SN/A * documentation and/or other materials provided with the distribution;
122292SN/A * neither the name of the copyright holders nor the names of its
132292SN/A * contributors may be used to endorse or promote products derived from
142292SN/A * this software without specific prior written permission.
152292SN/A *
162292SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182292SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192292SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202292SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212292SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222292SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232292SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242292SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252292SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262292SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272689Sktlim@umich.edu *
282689Sktlim@umich.edu * Authors: Erik Hallnor
292689Sktlim@umich.edu *          Steve Reinhardt
302292SN/A */
312292SN/A
322316SN/A#ifndef __CPU_MEMTEST_MEMTEST_HH__
332292SN/A#define __CPU_MEMTEST_MEMTEST_HH__
342292SN/A
352669Sktlim@umich.edu#include <set>
362292SN/A
372669Sktlim@umich.edu#include "base/fast_alloc.hh"
382678Sktlim@umich.edu#include "base/statistics.hh"
392678Sktlim@umich.edu#include "mem/mem_object.hh"
402678Sktlim@umich.edu#include "mem/port.hh"
412292SN/A#include "mem/port_proxy.hh"
422678Sktlim@umich.edu#include "params/MemTest.hh"
432292SN/A#include "sim/eventq.hh"
442292SN/A#include "sim/sim_exit.hh"
452669Sktlim@umich.edu#include "sim/sim_object.hh"
462292SN/A#include "sim/stats.hh"
472678Sktlim@umich.edu
482292SN/Aclass Packet;
492678Sktlim@umich.educlass MemTest : public MemObject
502678Sktlim@umich.edu{
512678Sktlim@umich.edu  public:
522678Sktlim@umich.edu    typedef MemTestParams Params;
532678Sktlim@umich.edu    MemTest(const Params *p);
542292SN/A
552678Sktlim@umich.edu    virtual void init();
562678Sktlim@umich.edu
572678Sktlim@umich.edu    // register statistics
582678Sktlim@umich.edu    virtual void regStats();
592678Sktlim@umich.edu
602678Sktlim@umich.edu    inline Tick ticks(int numCycles) const { return numCycles; }
612292SN/A
622678Sktlim@umich.edu    // main simulation loop (one cycle)
632678Sktlim@umich.edu    void tick();
642678Sktlim@umich.edu
652678Sktlim@umich.edu    virtual MasterPort &getMasterPort(const std::string &if_name,
662678Sktlim@umich.edu                                      int idx = -1);
672678Sktlim@umich.edu
682678Sktlim@umich.edu    /**
692678Sktlim@umich.edu     * Print state of address in memory system via PrintReq (for
702344SN/A     * debugging).
712678Sktlim@umich.edu     */
722678Sktlim@umich.edu    void printAddr(Addr a);
732678Sktlim@umich.edu
742678Sktlim@umich.edu  protected:
752678Sktlim@umich.edu    class TickEvent : public Event
762307SN/A    {
772678Sktlim@umich.edu      private:
782678Sktlim@umich.edu        MemTest *cpu;
792678Sktlim@umich.edu
802678Sktlim@umich.edu      public:
812678Sktlim@umich.edu        TickEvent(MemTest *c) : Event(CPU_Tick_Pri), cpu(c) {}
822678Sktlim@umich.edu        void process() { cpu->tick(); }
832678Sktlim@umich.edu        virtual const char *description() const { return "MemTest tick"; }
842678Sktlim@umich.edu    };
852344SN/A
862307SN/A    TickEvent tickEvent;
872678Sktlim@umich.edu
882678Sktlim@umich.edu    class CpuPort : public MasterPort
892292SN/A    {
902292SN/A        MemTest *memtest;
912292SN/A
922669Sktlim@umich.edu      public:
932669Sktlim@umich.edu
942292SN/A        CpuPort(const std::string &_name, MemTest *_memtest)
952669Sktlim@umich.edu            : MasterPort(_name, _memtest), memtest(_memtest)
962669Sktlim@umich.edu        { }
972669Sktlim@umich.edu
982669Sktlim@umich.edu      protected:
992669Sktlim@umich.edu
1002669Sktlim@umich.edu        virtual bool recvTiming(PacketPtr pkt);
1012669Sktlim@umich.edu
1022669Sktlim@umich.edu        virtual bool recvTimingSnoop(PacketPtr pkt) { return true; }
1032669Sktlim@umich.edu
1042669Sktlim@umich.edu        virtual Tick recvAtomicSnoop(PacketPtr pkt) { return 0; }
1052669Sktlim@umich.edu
1062669Sktlim@umich.edu        virtual void recvFunctionalSnoop(PacketPtr pkt) { }
1072669Sktlim@umich.edu
1082669Sktlim@umich.edu        virtual void recvRetry();
1092669Sktlim@umich.edu    };
1102669Sktlim@umich.edu
1112669Sktlim@umich.edu    CpuPort cachePort;
1122669Sktlim@umich.edu    CpuPort funcPort;
1132669Sktlim@umich.edu    PortProxy funcProxy;
1142669Sktlim@umich.edu
1152669Sktlim@umich.edu    class MemTestSenderState : public Packet::SenderState, public FastAlloc
1162669Sktlim@umich.edu    {
1172669Sktlim@umich.edu      public:
1182669Sktlim@umich.edu        /** Constructor. */
1192669Sktlim@umich.edu        MemTestSenderState(uint8_t *_data)
1202669Sktlim@umich.edu            : data(_data)
1212669Sktlim@umich.edu        { }
1222669Sktlim@umich.edu
1232669Sktlim@umich.edu        // Hold onto data pointer
1242669Sktlim@umich.edu        uint8_t *data;
1252669Sktlim@umich.edu    };
1262669Sktlim@umich.edu
1272669Sktlim@umich.edu    PacketPtr retryPkt;
1282693Sktlim@umich.edu
1292292SN/A    bool accessRetry;
1302292SN/A
1312292SN/A    //
1322292SN/A    // The dmaOustanding flag enforces only one dma at a time
1332678Sktlim@umich.edu    //
1342678Sktlim@umich.edu    bool dmaOutstanding;
1352292SN/A
1362292SN/A    unsigned size;              // size of testing memory region
1372292SN/A
1382292SN/A    unsigned percentReads;      // target percentage of read accesses
1392292SN/A    unsigned percentFunctional; // target percentage of functional accesses
1402292SN/A    unsigned percentUncacheable;
1412292SN/A
1422292SN/A    bool issueDmas;
1432292SN/A
1442292SN/A    /** Request id for all generated traffic */
1452292SN/A    MasterID masterId;
1462307SN/A
1472307SN/A    int id;
1482292SN/A
1492292SN/A    std::set<unsigned> outstandingAddrs;
1502329SN/A
1512329SN/A    unsigned blockSize;
1522329SN/A
1532292SN/A    Addr blockAddrMask;
1542292SN/A
1552292SN/A    Addr blockAddr(Addr addr)
1562292SN/A    {
1572292SN/A        return (addr & ~blockAddrMask);
1582292SN/A    }
1592292SN/A
1602292SN/A    Addr traceBlockAddr;
1612292SN/A
1622292SN/A    Addr baseAddr1;             // fix this to option
1632292SN/A    Addr baseAddr2;             // fix this to option
1642678Sktlim@umich.edu    Addr uncacheAddr;
1652292SN/A
1662329SN/A    unsigned progressInterval;  // frequency of progress reports
1672292SN/A    Tick nextProgressMessage;   // access # for next progress report
1682292SN/A
1692292SN/A    unsigned percentSourceUnaligned;
1702292SN/A    unsigned percentDestUnaligned;
1712292SN/A
1722669Sktlim@umich.edu    Tick noResponseCycles;
1732669Sktlim@umich.edu
1742669Sktlim@umich.edu    uint64_t numReads;
1752669Sktlim@umich.edu    uint64_t numWrites;
1762669Sktlim@umich.edu    uint64_t maxLoads;
1772678Sktlim@umich.edu
1782678Sktlim@umich.edu    bool atomic;
1792678Sktlim@umich.edu    bool suppress_func_warnings;
1802678Sktlim@umich.edu
1812679Sktlim@umich.edu    Stats::Scalar numReadsStat;
1822679Sktlim@umich.edu    Stats::Scalar numWritesStat;
1832679Sktlim@umich.edu    Stats::Scalar numCopiesStat;
1842679Sktlim@umich.edu
1852669Sktlim@umich.edu    // called by MemCompleteEvent::process()
1862669Sktlim@umich.edu    void completeRequest(PacketPtr pkt);
1872669Sktlim@umich.edu
1882292SN/A    void sendPkt(PacketPtr pkt);
1892292SN/A
1902292SN/A    void doRetry();
1912292SN/A
1922292SN/A    friend class MemCompleteEvent;
1932292SN/A};
1942292SN/A
1952292SN/A#endif // __CPU_MEMTEST_MEMTEST_HH__
1962292SN/A
1972292SN/A
1982292SN/A
1992292SN/A