memtest.hh revision 5314
110448Snilay@cs.wisc.edu/*
210448Snilay@cs.wisc.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
310448Snilay@cs.wisc.edu * All rights reserved.
410448Snilay@cs.wisc.edu *
510448Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without
610448Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are
710448Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright
810448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer;
910448Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright
1010448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the
1110448Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution;
1210448Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its
1310448Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
1410448Snilay@cs.wisc.edu * this software without specific prior written permission.
1510448Snilay@cs.wisc.edu *
1610448Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710448Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810448Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910448Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010448Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110448Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710447Snilay@cs.wisc.edu *
2810447Snilay@cs.wisc.edu * Authors: Erik Hallnor
2910447Snilay@cs.wisc.edu *          Steve Reinhardt
3010447Snilay@cs.wisc.edu */
3110447Snilay@cs.wisc.edu
3210447Snilay@cs.wisc.edu#ifndef __CPU_MEMTEST_MEMTEST_HH__
3310447Snilay@cs.wisc.edu#define __CPU_MEMTEST_MEMTEST_HH__
3410447Snilay@cs.wisc.edu
3510447Snilay@cs.wisc.edu#include <set>
3610447Snilay@cs.wisc.edu
3710447Snilay@cs.wisc.edu#include "base/statistics.hh"
3810447Snilay@cs.wisc.edu#include "params/MemTest.hh"
3910447Snilay@cs.wisc.edu#include "sim/eventq.hh"
4010447Snilay@cs.wisc.edu#include "sim/sim_exit.hh"
4110447Snilay@cs.wisc.edu#include "sim/sim_object.hh"
4210447Snilay@cs.wisc.edu#include "sim/stats.hh"
4310447Snilay@cs.wisc.edu#include "mem/mem_object.hh"
4410447Snilay@cs.wisc.edu#include "mem/port.hh"
4510447Snilay@cs.wisc.edu
4610447Snilay@cs.wisc.educlass Packet;
4710447Snilay@cs.wisc.educlass MemTest : public MemObject
4810447Snilay@cs.wisc.edu{
4910447Snilay@cs.wisc.edu  public:
5010447Snilay@cs.wisc.edu    typedef MemTestParams Params;
5110447Snilay@cs.wisc.edu    MemTest(const Params *p);
5210447Snilay@cs.wisc.edu
5310447Snilay@cs.wisc.edu    virtual void init();
5410447Snilay@cs.wisc.edu
5510447Snilay@cs.wisc.edu    // register statistics
5610447Snilay@cs.wisc.edu    virtual void regStats();
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu    inline Tick ticks(int numCycles) const { return numCycles; }
5910447Snilay@cs.wisc.edu
6010447Snilay@cs.wisc.edu    // main simulation loop (one cycle)
6110447Snilay@cs.wisc.edu    void tick();
6210447Snilay@cs.wisc.edu
6310447Snilay@cs.wisc.edu    virtual Port *getPort(const std::string &if_name, int idx = -1);
6410447Snilay@cs.wisc.edu
6510447Snilay@cs.wisc.edu    void printAddr(Addr a);
6610447Snilay@cs.wisc.edu
6710447Snilay@cs.wisc.edu  protected:
6810447Snilay@cs.wisc.edu    class TickEvent : public Event
6910447Snilay@cs.wisc.edu    {
7010447Snilay@cs.wisc.edu      private:
7110447Snilay@cs.wisc.edu        MemTest *cpu;
7210447Snilay@cs.wisc.edu      public:
7310447Snilay@cs.wisc.edu        TickEvent(MemTest *c)
7410447Snilay@cs.wisc.edu            : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {}
7510447Snilay@cs.wisc.edu        void process() {cpu->tick();}
7610447Snilay@cs.wisc.edu        virtual const char *description() { return "MemTest tick"; }
7710447Snilay@cs.wisc.edu    };
7810447Snilay@cs.wisc.edu
7910447Snilay@cs.wisc.edu    TickEvent tickEvent;
8010447Snilay@cs.wisc.edu
8110447Snilay@cs.wisc.edu    class CpuPort : public Port
8210447Snilay@cs.wisc.edu    {
8310447Snilay@cs.wisc.edu        MemTest *memtest;
8410447Snilay@cs.wisc.edu
8510447Snilay@cs.wisc.edu      public:
8610447Snilay@cs.wisc.edu
8710447Snilay@cs.wisc.edu        CpuPort(const std::string &_name, MemTest *_memtest)
8810447Snilay@cs.wisc.edu            : Port(_name, _memtest), memtest(_memtest)
8910447Snilay@cs.wisc.edu        { }
9010447Snilay@cs.wisc.edu
9110447Snilay@cs.wisc.edu        bool snoopRangeSent;
9210447Snilay@cs.wisc.edu
9310447Snilay@cs.wisc.edu      protected:
9410447Snilay@cs.wisc.edu
9510447Snilay@cs.wisc.edu        virtual bool recvTiming(PacketPtr pkt);
9610447Snilay@cs.wisc.edu
9710447Snilay@cs.wisc.edu        virtual Tick recvAtomic(PacketPtr pkt);
9810447Snilay@cs.wisc.edu
9910447Snilay@cs.wisc.edu        virtual void recvFunctional(PacketPtr pkt);
10010447Snilay@cs.wisc.edu
10110447Snilay@cs.wisc.edu        virtual void recvStatusChange(Status status);
10210447Snilay@cs.wisc.edu
10310447Snilay@cs.wisc.edu        virtual void recvRetry();
10410447Snilay@cs.wisc.edu
10510447Snilay@cs.wisc.edu        virtual void getDeviceAddressRanges(AddrRangeList &resp,
10610447Snilay@cs.wisc.edu                                            bool &snoop)
10710447Snilay@cs.wisc.edu        { resp.clear(); snoop = false; }
10810447Snilay@cs.wisc.edu    };
10910447Snilay@cs.wisc.edu
11010447Snilay@cs.wisc.edu    CpuPort cachePort;
11110447Snilay@cs.wisc.edu    CpuPort funcPort;
11210447Snilay@cs.wisc.edu
11310447Snilay@cs.wisc.edu    bool snoopRangeSent;
11410447Snilay@cs.wisc.edu
11510447Snilay@cs.wisc.edu    class MemTestSenderState : public Packet::SenderState
11610447Snilay@cs.wisc.edu    {
11710447Snilay@cs.wisc.edu      public:
11810447Snilay@cs.wisc.edu        /** Constructor. */
11910447Snilay@cs.wisc.edu        MemTestSenderState(uint8_t *_data)
12010447Snilay@cs.wisc.edu            : data(_data)
12110447Snilay@cs.wisc.edu        { }
12210447Snilay@cs.wisc.edu
12310447Snilay@cs.wisc.edu        // Hold onto data pointer
12410447Snilay@cs.wisc.edu        uint8_t *data;
12510447Snilay@cs.wisc.edu    };
12610447Snilay@cs.wisc.edu
12710447Snilay@cs.wisc.edu    PacketPtr retryPkt;
12810447Snilay@cs.wisc.edu
12910447Snilay@cs.wisc.edu    bool accessRetry;
13010447Snilay@cs.wisc.edu
13110447Snilay@cs.wisc.edu    unsigned size;		// size of testing memory region
13210447Snilay@cs.wisc.edu
13310447Snilay@cs.wisc.edu    unsigned percentReads;	// target percentage of read accesses
13410447Snilay@cs.wisc.edu    unsigned percentFunctional;	// target percentage of functional accesses
13510447Snilay@cs.wisc.edu    unsigned percentUncacheable;
13610447Snilay@cs.wisc.edu
13710447Snilay@cs.wisc.edu    int id;
13810447Snilay@cs.wisc.edu
13910447Snilay@cs.wisc.edu    std::set<unsigned> outstandingAddrs;
14010447Snilay@cs.wisc.edu
14110447Snilay@cs.wisc.edu    unsigned blockSize;
14210447Snilay@cs.wisc.edu
14310447Snilay@cs.wisc.edu    Addr blockAddrMask;
14410447Snilay@cs.wisc.edu
14510447Snilay@cs.wisc.edu    Addr blockAddr(Addr addr)
14610447Snilay@cs.wisc.edu    {
14710447Snilay@cs.wisc.edu        return (addr & ~blockAddrMask);
14810447Snilay@cs.wisc.edu    }
14910447Snilay@cs.wisc.edu
15010447Snilay@cs.wisc.edu    Addr traceBlockAddr;
15110447Snilay@cs.wisc.edu
15210447Snilay@cs.wisc.edu    Addr baseAddr1;		// fix this to option
15310447Snilay@cs.wisc.edu    Addr baseAddr2;		// fix this to option
15410447Snilay@cs.wisc.edu    Addr uncacheAddr;
15510447Snilay@cs.wisc.edu
15610447Snilay@cs.wisc.edu    unsigned progressInterval;	// frequency of progress reports
15710447Snilay@cs.wisc.edu    Tick nextProgressMessage;	// access # for next progress report
15810447Snilay@cs.wisc.edu
15910447Snilay@cs.wisc.edu    unsigned percentSourceUnaligned;
16010447Snilay@cs.wisc.edu    unsigned percentDestUnaligned;
16110447Snilay@cs.wisc.edu
16210447Snilay@cs.wisc.edu    Tick noResponseCycles;
16310447Snilay@cs.wisc.edu
16410447Snilay@cs.wisc.edu    uint64_t numReads;
16510447Snilay@cs.wisc.edu    uint64_t maxLoads;
16610447Snilay@cs.wisc.edu
16710447Snilay@cs.wisc.edu    bool atomic;
16810447Snilay@cs.wisc.edu
16910447Snilay@cs.wisc.edu    Stats::Scalar<> numReadsStat;
17010447Snilay@cs.wisc.edu    Stats::Scalar<> numWritesStat;
17110447Snilay@cs.wisc.edu    Stats::Scalar<> numCopiesStat;
17210447Snilay@cs.wisc.edu
17310447Snilay@cs.wisc.edu    // called by MemCompleteEvent::process()
17410447Snilay@cs.wisc.edu    void completeRequest(PacketPtr pkt);
17510447Snilay@cs.wisc.edu
17610447Snilay@cs.wisc.edu    void sendPkt(PacketPtr pkt);
17710447Snilay@cs.wisc.edu
17810447Snilay@cs.wisc.edu    void doRetry();
17910447Snilay@cs.wisc.edu
18010447Snilay@cs.wisc.edu    friend class MemCompleteEvent;
18110447Snilay@cs.wisc.edu};
18210447Snilay@cs.wisc.edu
18310447Snilay@cs.wisc.edu#endif // __CPU_MEMTEST_MEMTEST_HH__
18410447Snilay@cs.wisc.edu
18510447Snilay@cs.wisc.edu
18610447Snilay@cs.wisc.edu
18710447Snilay@cs.wisc.edu