memtest.hh revision 5336
16019Shines@cs.fsu.edu/*
213882Sgiacomo.travaglini@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
37399SAli.Saidi@ARM.com * All rights reserved.
47399SAli.Saidi@ARM.com *
57399SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without
67399SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are
77399SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright
87399SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer;
97399SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright
107399SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the
117399SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution;
127399SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its
137399SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from
146019Shines@cs.fsu.edu * this software without specific prior written permission.
156019Shines@cs.fsu.edu *
166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276019Shines@cs.fsu.edu *
286019Shines@cs.fsu.edu * Authors: Erik Hallnor
296019Shines@cs.fsu.edu *          Steve Reinhardt
306019Shines@cs.fsu.edu */
316019Shines@cs.fsu.edu
326019Shines@cs.fsu.edu#ifndef __CPU_MEMTEST_MEMTEST_HH__
336019Shines@cs.fsu.edu#define __CPU_MEMTEST_MEMTEST_HH__
346019Shines@cs.fsu.edu
356019Shines@cs.fsu.edu#include <set>
366019Shines@cs.fsu.edu
376019Shines@cs.fsu.edu#include "base/statistics.hh"
386019Shines@cs.fsu.edu#include "params/MemTest.hh"
396019Shines@cs.fsu.edu#include "sim/eventq.hh"
407399SAli.Saidi@ARM.com#include "sim/sim_exit.hh"
416019Shines@cs.fsu.edu#include "sim/sim_object.hh"
426019Shines@cs.fsu.edu#include "sim/stats.hh"
436019Shines@cs.fsu.edu#include "mem/mem_object.hh"
446019Shines@cs.fsu.edu#include "mem/port.hh"
456019Shines@cs.fsu.edu
466019Shines@cs.fsu.educlass Packet;
476019Shines@cs.fsu.educlass MemTest : public MemObject
488229Snate@binkert.org{
496019Shines@cs.fsu.edu  public:
506019Shines@cs.fsu.edu    typedef MemTestParams Params;
5110687SAndreas.Sandberg@ARM.com    MemTest(const Params *p);
526019Shines@cs.fsu.edu
536019Shines@cs.fsu.edu    virtual void init();
546116Snate@binkert.org
5510463SAndreas.Sandberg@ARM.com    // register statistics
566019Shines@cs.fsu.edu    virtual void regStats();
576019Shines@cs.fsu.edu
586019Shines@cs.fsu.edu    inline Tick ticks(int numCycles) const { return numCycles; }
596019Shines@cs.fsu.edu
606019Shines@cs.fsu.edu    // main simulation loop (one cycle)
617404SAli.Saidi@ARM.com    void tick();
6210037SARM gem5 Developers
6310037SARM gem5 Developers    virtual Port *getPort(const std::string &if_name, int idx = -1);
6411395Sandreas.sandberg@arm.com
6511395Sandreas.sandberg@arm.com    /**
6611395Sandreas.sandberg@arm.com     * Print state of address in memory system via PrintReq (for
6711395Sandreas.sandberg@arm.com     * debugging).
6811395Sandreas.sandberg@arm.com     */
6911395Sandreas.sandberg@arm.com    void printAddr(Addr a);
7011395Sandreas.sandberg@arm.com
7111395Sandreas.sandberg@arm.com  protected:
7211395Sandreas.sandberg@arm.com    class TickEvent : public Event
7311395Sandreas.sandberg@arm.com    {
7411395Sandreas.sandberg@arm.com      private:
7511395Sandreas.sandberg@arm.com        MemTest *cpu;
7611395Sandreas.sandberg@arm.com      public:
7711395Sandreas.sandberg@arm.com        TickEvent(MemTest *c)
7811395Sandreas.sandberg@arm.com            : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {}
7911395Sandreas.sandberg@arm.com        void process() {cpu->tick();}
8012749Sgiacomo.travaglini@arm.com        virtual const char *description() const { return "MemTest tick"; }
8111395Sandreas.sandberg@arm.com    };
8211395Sandreas.sandberg@arm.com
8311395Sandreas.sandberg@arm.com    TickEvent tickEvent;
8411395Sandreas.sandberg@arm.com
8511395Sandreas.sandberg@arm.com    class CpuPort : public Port
8611395Sandreas.sandberg@arm.com    {
8711395Sandreas.sandberg@arm.com        MemTest *memtest;
8811395Sandreas.sandberg@arm.com
8911395Sandreas.sandberg@arm.com      public:
9011395Sandreas.sandberg@arm.com
9111395Sandreas.sandberg@arm.com        CpuPort(const std::string &_name, MemTest *_memtest)
9211395Sandreas.sandberg@arm.com            : Port(_name, _memtest), memtest(_memtest)
9311395Sandreas.sandberg@arm.com        { }
9411395Sandreas.sandberg@arm.com
9511395Sandreas.sandberg@arm.com        bool snoopRangeSent;
9611395Sandreas.sandberg@arm.com
9711395Sandreas.sandberg@arm.com      protected:
9811395Sandreas.sandberg@arm.com
9911395Sandreas.sandberg@arm.com        virtual bool recvTiming(PacketPtr pkt);
10011395Sandreas.sandberg@arm.com
1017404SAli.Saidi@ARM.com        virtual Tick recvAtomic(PacketPtr pkt);
1026019Shines@cs.fsu.edu
1036019Shines@cs.fsu.edu        virtual void recvFunctional(PacketPtr pkt);
1047294Sgblack@eecs.umich.edu
1057294Sgblack@eecs.umich.edu        virtual void recvStatusChange(Status status);
10610037SARM gem5 Developers
1077294Sgblack@eecs.umich.edu        virtual void recvRetry();
1087294Sgblack@eecs.umich.edu
1097294Sgblack@eecs.umich.edu        virtual void getDeviceAddressRanges(AddrRangeList &resp,
11010037SARM gem5 Developers                                            bool &snoop)
11110037SARM gem5 Developers        { resp.clear(); snoop = false; }
11210037SARM gem5 Developers    };
11310037SARM gem5 Developers
1147294Sgblack@eecs.umich.edu    CpuPort cachePort;
11510037SARM gem5 Developers    CpuPort funcPort;
1167404SAli.Saidi@ARM.com
11710037SARM gem5 Developers    bool snoopRangeSent;
1187294Sgblack@eecs.umich.edu
1197294Sgblack@eecs.umich.edu    class MemTestSenderState : public Packet::SenderState
1207294Sgblack@eecs.umich.edu    {
12110037SARM gem5 Developers      public:
12210037SARM gem5 Developers        /** Constructor. */
12310037SARM gem5 Developers        MemTestSenderState(uint8_t *_data)
12410037SARM gem5 Developers            : data(_data)
12510037SARM gem5 Developers        { }
12610037SARM gem5 Developers
12710037SARM gem5 Developers        // Hold onto data pointer
12810037SARM gem5 Developers        uint8_t *data;
12910037SARM gem5 Developers    };
13011577SDylan.Johnson@ARM.com
13111577SDylan.Johnson@ARM.com    PacketPtr retryPkt;
13211577SDylan.Johnson@ARM.com
13311577SDylan.Johnson@ARM.com    bool accessRetry;
13411577SDylan.Johnson@ARM.com
13511577SDylan.Johnson@ARM.com    unsigned size;		// size of testing memory region
13611577SDylan.Johnson@ARM.com
13711577SDylan.Johnson@ARM.com    unsigned percentReads;	// target percentage of read accesses
13811577SDylan.Johnson@ARM.com    unsigned percentFunctional;	// target percentage of functional accesses
13911577SDylan.Johnson@ARM.com    unsigned percentUncacheable;
14011577SDylan.Johnson@ARM.com
1417294Sgblack@eecs.umich.edu    int id;
14212735Sandreas.sandberg@arm.com
14312735Sandreas.sandberg@arm.com    std::set<unsigned> outstandingAddrs;
14412735Sandreas.sandberg@arm.com
14512735Sandreas.sandberg@arm.com    unsigned blockSize;
14612735Sandreas.sandberg@arm.com
14712735Sandreas.sandberg@arm.com    Addr blockAddrMask;
14812735Sandreas.sandberg@arm.com
14912735Sandreas.sandberg@arm.com    Addr blockAddr(Addr addr)
1506019Shines@cs.fsu.edu    {
15110037SARM gem5 Developers        return (addr & ~blockAddrMask);
15210037SARM gem5 Developers    }
15310037SARM gem5 Developers
15410037SARM gem5 Developers    Addr traceBlockAddr;
15513374Sanouk.vanlaer@arm.com
15613374Sanouk.vanlaer@arm.com    Addr baseAddr1;		// fix this to option
15713374Sanouk.vanlaer@arm.com    Addr baseAddr2;		// fix this to option
15813374Sanouk.vanlaer@arm.com    Addr uncacheAddr;
15910037SARM gem5 Developers
16010037SARM gem5 Developers    unsigned progressInterval;	// frequency of progress reports
16110037SARM gem5 Developers    Tick nextProgressMessage;	// access # for next progress report
1627436Sdam.sunwoo@arm.com
1637404SAli.Saidi@ARM.com    unsigned percentSourceUnaligned;
16410037SARM gem5 Developers    unsigned percentDestUnaligned;
16510037SARM gem5 Developers
1666019Shines@cs.fsu.edu    Tick noResponseCycles;
16711395Sandreas.sandberg@arm.com
16811395Sandreas.sandberg@arm.com    uint64_t numReads;
1697399SAli.Saidi@ARM.com    uint64_t maxLoads;
1707734SAli.Saidi@ARM.com
1717734SAli.Saidi@ARM.com    bool atomic;
1727734SAli.Saidi@ARM.com
1737734SAli.Saidi@ARM.com    Stats::Scalar<> numReadsStat;
1747734SAli.Saidi@ARM.com    Stats::Scalar<> numWritesStat;
1757734SAli.Saidi@ARM.com    Stats::Scalar<> numCopiesStat;
1767734SAli.Saidi@ARM.com
1777734SAli.Saidi@ARM.com    // called by MemCompleteEvent::process()
1787734SAli.Saidi@ARM.com    void completeRequest(PacketPtr pkt);
1797734SAli.Saidi@ARM.com
1807734SAli.Saidi@ARM.com    void sendPkt(PacketPtr pkt);
1817734SAli.Saidi@ARM.com
1827734SAli.Saidi@ARM.com    void doRetry();
1837734SAli.Saidi@ARM.com
1847734SAli.Saidi@ARM.com    friend class MemCompleteEvent;
1857734SAli.Saidi@ARM.com};
1867734SAli.Saidi@ARM.com
1877734SAli.Saidi@ARM.com#endif // __CPU_MEMTEST_MEMTEST_HH__
1887734SAli.Saidi@ARM.com
1897734SAli.Saidi@ARM.com
1906019Shines@cs.fsu.edu
1916019Shines@cs.fsu.edu