memtest.hh revision 3187
19651SAndreas.Sandberg@ARM.com/*
29651SAndreas.Sandberg@ARM.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
39651SAndreas.Sandberg@ARM.com * All rights reserved.
49651SAndreas.Sandberg@ARM.com *
59651SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without
69651SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are
79651SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright
89651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer;
99651SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright
109651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the
119651SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution;
129651SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its
139651SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from
149651SAndreas.Sandberg@ARM.com * this software without specific prior written permission.
159651SAndreas.Sandberg@ARM.com *
169651SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179651SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189651SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199651SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209651SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219651SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229651SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239651SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249651SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259651SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269651SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279651SAndreas.Sandberg@ARM.com *
289651SAndreas.Sandberg@ARM.com * Authors: Erik Hallnor
299651SAndreas.Sandberg@ARM.com *          Steve Reinhardt
309651SAndreas.Sandberg@ARM.com */
319651SAndreas.Sandberg@ARM.com
329651SAndreas.Sandberg@ARM.com#ifndef __CPU_MEMTEST_MEMTEST_HH__
339651SAndreas.Sandberg@ARM.com#define __CPU_MEMTEST_MEMTEST_HH__
349651SAndreas.Sandberg@ARM.com
359651SAndreas.Sandberg@ARM.com#include <set>
369651SAndreas.Sandberg@ARM.com
379651SAndreas.Sandberg@ARM.com#include "base/statistics.hh"
389651SAndreas.Sandberg@ARM.com//#include "mem/functional/functional.hh"
399651SAndreas.Sandberg@ARM.com//#include "mem/mem_interface.hh"
409651SAndreas.Sandberg@ARM.com#include "sim/eventq.hh"
419651SAndreas.Sandberg@ARM.com#include "sim/sim_exit.hh"
429651SAndreas.Sandberg@ARM.com#include "sim/sim_object.hh"
439651SAndreas.Sandberg@ARM.com#include "sim/stats.hh"
449651SAndreas.Sandberg@ARM.com#include "mem/mem_object.hh"
459651SAndreas.Sandberg@ARM.com#include "mem/port.hh"
469651SAndreas.Sandberg@ARM.com
479651SAndreas.Sandberg@ARM.comclass Packet;
489651SAndreas.Sandberg@ARM.comclass MemTest : public MemObject
499651SAndreas.Sandberg@ARM.com{
509651SAndreas.Sandberg@ARM.com  public:
519683Sandreas@sandberg.pp.se
529651SAndreas.Sandberg@ARM.com    MemTest(const std::string &name,
539651SAndreas.Sandberg@ARM.com//	    MemInterface *_cache_interface,
549651SAndreas.Sandberg@ARM.com//	    PhysicalMemory *main_mem,
559651SAndreas.Sandberg@ARM.com//	    PhysicalMemory *check_mem,
569651SAndreas.Sandberg@ARM.com            unsigned _memorySize,
579651SAndreas.Sandberg@ARM.com            unsigned _percentReads,
589651SAndreas.Sandberg@ARM.com//	    unsigned _percentCopies,
599651SAndreas.Sandberg@ARM.com            unsigned _percentUncacheable,
609651SAndreas.Sandberg@ARM.com            unsigned _progressInterval,
619651SAndreas.Sandberg@ARM.com            unsigned _percentSourceUnaligned,
629651SAndreas.Sandberg@ARM.com            unsigned _percentDestUnaligned,
639651SAndreas.Sandberg@ARM.com            Addr _traceAddr,
649651SAndreas.Sandberg@ARM.com            Counter _max_loads);
659651SAndreas.Sandberg@ARM.com
669651SAndreas.Sandberg@ARM.com    virtual void init();
679651SAndreas.Sandberg@ARM.com
689651SAndreas.Sandberg@ARM.com    // register statistics
699651SAndreas.Sandberg@ARM.com    virtual void regStats();
709651SAndreas.Sandberg@ARM.com
719651SAndreas.Sandberg@ARM.com    inline Tick cycles(int numCycles) const { return numCycles; }
729651SAndreas.Sandberg@ARM.com
739651SAndreas.Sandberg@ARM.com    // main simulation loop (one cycle)
749651SAndreas.Sandberg@ARM.com    void tick();
759651SAndreas.Sandberg@ARM.com
769652SAndreas.Sandberg@ARM.com    virtual Port *getPort(const std::string &if_name, int idx = -1);
779652SAndreas.Sandberg@ARM.com
789651SAndreas.Sandberg@ARM.com  protected:
799651SAndreas.Sandberg@ARM.com    class TickEvent : public Event
809651SAndreas.Sandberg@ARM.com    {
819651SAndreas.Sandberg@ARM.com      private:
829655SAndreas.Sandberg@ARM.com        MemTest *cpu;
839752Sandreas@sandberg.pp.se      public:
849752Sandreas@sandberg.pp.se        TickEvent(MemTest *c)
859651SAndreas.Sandberg@ARM.com            : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {}
869651SAndreas.Sandberg@ARM.com        void process() {cpu->tick();}
879651SAndreas.Sandberg@ARM.com        virtual const char *description() { return "tick event"; }
889651SAndreas.Sandberg@ARM.com    };
899651SAndreas.Sandberg@ARM.com
909651SAndreas.Sandberg@ARM.com    TickEvent tickEvent;
919651SAndreas.Sandberg@ARM.com    class CpuPort : public Port
929651SAndreas.Sandberg@ARM.com    {
939651SAndreas.Sandberg@ARM.com
949651SAndreas.Sandberg@ARM.com        MemTest *memtest;
959651SAndreas.Sandberg@ARM.com
969651SAndreas.Sandberg@ARM.com      public:
979651SAndreas.Sandberg@ARM.com
989651SAndreas.Sandberg@ARM.com        CpuPort(const std::string &_name, MemTest *_memtest)
999655SAndreas.Sandberg@ARM.com            : Port(_name), memtest(_memtest)
1009655SAndreas.Sandberg@ARM.com        { }
1019655SAndreas.Sandberg@ARM.com
1029655SAndreas.Sandberg@ARM.com      protected:
1039655SAndreas.Sandberg@ARM.com
1049655SAndreas.Sandberg@ARM.com        virtual bool recvTiming(Packet *pkt);
1059655SAndreas.Sandberg@ARM.com
1069655SAndreas.Sandberg@ARM.com        virtual Tick recvAtomic(Packet *pkt);
1079655SAndreas.Sandberg@ARM.com
1089651SAndreas.Sandberg@ARM.com        virtual void recvFunctional(Packet *pkt);
1099651SAndreas.Sandberg@ARM.com
1109651SAndreas.Sandberg@ARM.com        virtual void recvStatusChange(Status status);
1119651SAndreas.Sandberg@ARM.com
1129651SAndreas.Sandberg@ARM.com        virtual void recvRetry();
1139651SAndreas.Sandberg@ARM.com
1149651SAndreas.Sandberg@ARM.com        virtual void getDeviceAddressRanges(AddrRangeList &resp,
1159651SAndreas.Sandberg@ARM.com            AddrRangeList &snoop)
1169651SAndreas.Sandberg@ARM.com        { resp.clear(); snoop.clear(); }
1179651SAndreas.Sandberg@ARM.com    };
1189651SAndreas.Sandberg@ARM.com
1199651SAndreas.Sandberg@ARM.com    CpuPort cachePort;
1209651SAndreas.Sandberg@ARM.com    CpuPort funcPort;
1219651SAndreas.Sandberg@ARM.com
1229651SAndreas.Sandberg@ARM.com    class MemTestSenderState : public Packet::SenderState
1239651SAndreas.Sandberg@ARM.com    {
1249651SAndreas.Sandberg@ARM.com      public:
1259651SAndreas.Sandberg@ARM.com        /** Constructor. */
1269651SAndreas.Sandberg@ARM.com        MemTestSenderState(uint8_t *_data)
1279651SAndreas.Sandberg@ARM.com            : data(_data)
1289651SAndreas.Sandberg@ARM.com        { }
1299651SAndreas.Sandberg@ARM.com
1309651SAndreas.Sandberg@ARM.com        // Hold onto data pointer
1319651SAndreas.Sandberg@ARM.com        uint8_t *data;
1329651SAndreas.Sandberg@ARM.com    };
1339651SAndreas.Sandberg@ARM.com
1349651SAndreas.Sandberg@ARM.com//    Request *dataReq;
1359651SAndreas.Sandberg@ARM.com    Packet  *retryPkt;
1369651SAndreas.Sandberg@ARM.com//    MemInterface *cacheInterface;
1379690Sandreas@sandberg.pp.se//    PhysicalMemory *mainMem;
1389690Sandreas@sandberg.pp.se//    PhysicalMemory *checkMem;
1399690Sandreas@sandberg.pp.se//    SimpleThread *thread;
1409651SAndreas.Sandberg@ARM.com
1419651SAndreas.Sandberg@ARM.com    bool accessRetry;
1429651SAndreas.Sandberg@ARM.com
1439651SAndreas.Sandberg@ARM.com    unsigned size;		// size of testing memory region
1449651SAndreas.Sandberg@ARM.com
1459651SAndreas.Sandberg@ARM.com    unsigned percentReads;	// target percentage of read accesses
1469651SAndreas.Sandberg@ARM.com//    unsigned percentCopies;	// target percentage of copy accesses
1479651SAndreas.Sandberg@ARM.com    unsigned percentUncacheable;
1489651SAndreas.Sandberg@ARM.com
1499651SAndreas.Sandberg@ARM.com    int id;
1509651SAndreas.Sandberg@ARM.com
1519651SAndreas.Sandberg@ARM.com    std::set<unsigned> outstandingAddrs;
1529651SAndreas.Sandberg@ARM.com
1539651SAndreas.Sandberg@ARM.com    unsigned blockSize;
1549651SAndreas.Sandberg@ARM.com
1559651SAndreas.Sandberg@ARM.com    Addr blockAddrMask;
1569651SAndreas.Sandberg@ARM.com
1579651SAndreas.Sandberg@ARM.com    Addr blockAddr(Addr addr)
1589651SAndreas.Sandberg@ARM.com    {
1599651SAndreas.Sandberg@ARM.com        return (addr & ~blockAddrMask);
1609651SAndreas.Sandberg@ARM.com    }
1619651SAndreas.Sandberg@ARM.com
1629651SAndreas.Sandberg@ARM.com    Addr traceBlockAddr;
1639651SAndreas.Sandberg@ARM.com
1649651SAndreas.Sandberg@ARM.com    Addr baseAddr1;		// fix this to option
1659651SAndreas.Sandberg@ARM.com    Addr baseAddr2;		// fix this to option
1669690Sandreas@sandberg.pp.se    Addr uncacheAddr;
1679690Sandreas@sandberg.pp.se
1689690Sandreas@sandberg.pp.se    unsigned progressInterval;	// frequency of progress reports
1699651SAndreas.Sandberg@ARM.com    Tick nextProgressMessage;	// access # for next progress report
1709651SAndreas.Sandberg@ARM.com
1719651SAndreas.Sandberg@ARM.com    unsigned percentSourceUnaligned;
1729651SAndreas.Sandberg@ARM.com    unsigned percentDestUnaligned;
1739651SAndreas.Sandberg@ARM.com
1749651SAndreas.Sandberg@ARM.com    Tick noResponseCycles;
1759732Sandreas@sandberg.pp.se
1769732Sandreas@sandberg.pp.se    uint64_t numReads;
1779651SAndreas.Sandberg@ARM.com    uint64_t maxLoads;
1789651SAndreas.Sandberg@ARM.com    Stats::Scalar<> numReadsStat;
1799651SAndreas.Sandberg@ARM.com    Stats::Scalar<> numWritesStat;
1809651SAndreas.Sandberg@ARM.com    Stats::Scalar<> numCopiesStat;
1819651SAndreas.Sandberg@ARM.com
1829651SAndreas.Sandberg@ARM.com    // called by MemCompleteEvent::process()
1839651SAndreas.Sandberg@ARM.com    void completeRequest(Packet *pkt);
1849651SAndreas.Sandberg@ARM.com
1859651SAndreas.Sandberg@ARM.com    void doRetry();
1869684Sandreas@sandberg.pp.se
1879684Sandreas@sandberg.pp.se    friend class MemCompleteEvent;
1889684Sandreas@sandberg.pp.se};
1899684Sandreas@sandberg.pp.se
1909684Sandreas@sandberg.pp.se#endif // __CPU_MEMTEST_MEMTEST_HH__
1919651SAndreas.Sandberg@ARM.com
1929651SAndreas.Sandberg@ARM.com
1939651SAndreas.Sandberg@ARM.com
1949651SAndreas.Sandberg@ARM.com