memtest.hh revision 3262
19243SN/A/*
210889Sandreas.hansson@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
39243SN/A * All rights reserved.
49243SN/A *
59243SN/A * Redistribution and use in source and binary forms, with or without
69243SN/A * modification, are permitted provided that the following conditions are
79243SN/A * met: redistributions of source code must retain the above copyright
89243SN/A * notice, this list of conditions and the following disclaimer;
99243SN/A * redistributions in binary form must reproduce the above copyright
109243SN/A * notice, this list of conditions and the following disclaimer in the
119243SN/A * documentation and/or other materials provided with the distribution;
129243SN/A * neither the name of the copyright holders nor the names of its
139243SN/A * contributors may be used to endorse or promote products derived from
149831SN/A * this software without specific prior written permission.
159831SN/A *
169831SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179243SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189243SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199243SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209243SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219243SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229243SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239243SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249243SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259243SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269243SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279243SN/A *
289243SN/A * Authors: Erik Hallnor
299243SN/A *          Steve Reinhardt
309243SN/A */
319243SN/A
329243SN/A#ifndef __CPU_MEMTEST_MEMTEST_HH__
339243SN/A#define __CPU_MEMTEST_MEMTEST_HH__
349243SN/A
359243SN/A#include <set>
369243SN/A
379243SN/A#include "base/statistics.hh"
389243SN/A//#include "mem/functional/functional.hh"
399243SN/A//#include "mem/mem_interface.hh"
409243SN/A#include "sim/eventq.hh"
419243SN/A#include "sim/sim_exit.hh"
429967SN/A#include "sim/sim_object.hh"
4310618SOmar.Naji@arm.com#include "sim/stats.hh"
449243SN/A#include "mem/mem_object.hh"
459243SN/A#include "mem/port.hh"
4610146Sandreas.hansson@arm.com
479356SN/Aclass Packet;
4810146Sandreas.hansson@arm.comclass MemTest : public MemObject
4910247Sandreas.hansson@arm.com{
5010208Sandreas.hansson@arm.com  public:
519352SN/A
5210146Sandreas.hansson@arm.com    MemTest(const std::string &name,
539814SN/A//	    MemInterface *_cache_interface,
549243SN/A//	    PhysicalMemory *main_mem,
559243SN/A//	    PhysicalMemory *check_mem,
5610432SOmar.Naji@arm.com            unsigned _memorySize,
579243SN/A            unsigned _percentReads,
5810146Sandreas.hansson@arm.com//	    unsigned _percentCopies,
599243SN/A            unsigned _percentUncacheable,
6010619Sandreas.hansson@arm.com            unsigned _progressInterval,
619243SN/A            unsigned _percentSourceUnaligned,
6210211Sandreas.hansson@arm.com            unsigned _percentDestUnaligned,
6310618SOmar.Naji@arm.com            Addr _traceAddr,
6410208Sandreas.hansson@arm.com            Counter _max_loads,
6510489SOmar.Naji@arm.com            bool _atomic);
669831SN/A
679831SN/A    virtual void init();
689831SN/A
699831SN/A    // register statistics
709831SN/A    virtual void regStats();
7110140SN/A
7210646Sandreas.hansson@arm.com    inline Tick cycles(int numCycles) const { return numCycles; }
739243SN/A
7410394Swendy.elsasser@arm.com    // main simulation loop (one cycle)
7510394Swendy.elsasser@arm.com    void tick();
769566SN/A
779243SN/A    virtual Port *getPort(const std::string &if_name, int idx = -1);
789243SN/A
7910140SN/A  protected:
8010140SN/A    class TickEvent : public Event
8110147Sandreas.hansson@arm.com    {
8210147Sandreas.hansson@arm.com      private:
8310393Swendy.elsasser@arm.com        MemTest *cpu;
8410394Swendy.elsasser@arm.com      public:
8510394Swendy.elsasser@arm.com        TickEvent(MemTest *c)
8610394Swendy.elsasser@arm.com            : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {}
879243SN/A        void process() {cpu->tick();}
889243SN/A        virtual const char *description() { return "tick event"; }
8910141SN/A    };
909726SN/A
919726SN/A    TickEvent tickEvent;
9210618SOmar.Naji@arm.com    class CpuPort : public Port
9310618SOmar.Naji@arm.com    {
949243SN/A
9510620Sandreas.hansson@arm.com        MemTest *memtest;
9610620Sandreas.hansson@arm.com
9710620Sandreas.hansson@arm.com      public:
9810620Sandreas.hansson@arm.com
9910620Sandreas.hansson@arm.com        CpuPort(const std::string &_name, MemTest *_memtest)
10010889Sandreas.hansson@arm.com            : Port(_name), memtest(_memtest)
10110889Sandreas.hansson@arm.com        { }
10210889Sandreas.hansson@arm.com
10310618SOmar.Naji@arm.com      protected:
10410618SOmar.Naji@arm.com
10510618SOmar.Naji@arm.com        virtual bool recvTiming(Packet *pkt);
10610432SOmar.Naji@arm.com
10710618SOmar.Naji@arm.com        virtual Tick recvAtomic(Packet *pkt);
10810618SOmar.Naji@arm.com
10910618SOmar.Naji@arm.com        virtual void recvFunctional(Packet *pkt);
11010432SOmar.Naji@arm.com
11110246Sandreas.hansson@arm.com        virtual void recvStatusChange(Status status);
11210618SOmar.Naji@arm.com
11310561SOmar.Naji@arm.com        virtual void recvRetry();
11410561SOmar.Naji@arm.com
11510561SOmar.Naji@arm.com        virtual void getDeviceAddressRanges(AddrRangeList &resp,
11610394Swendy.elsasser@arm.com            AddrRangeList &snoop)
11710394Swendy.elsasser@arm.com        { resp.clear(); snoop.clear(); snoop.push_back(RangeSize(0,-1)); }
11810394Swendy.elsasser@arm.com    };
11910394Swendy.elsasser@arm.com
12010394Swendy.elsasser@arm.com    CpuPort cachePort;
12110394Swendy.elsasser@arm.com    CpuPort funcPort;
12210394Swendy.elsasser@arm.com
12310394Swendy.elsasser@arm.com    class MemTestSenderState : public Packet::SenderState
12410618SOmar.Naji@arm.com    {
12510394Swendy.elsasser@arm.com      public:
12610394Swendy.elsasser@arm.com        /** Constructor. */
12710618SOmar.Naji@arm.com        MemTestSenderState(uint8_t *_data)
12810394Swendy.elsasser@arm.com            : data(_data)
12910246Sandreas.hansson@arm.com        { }
13010246Sandreas.hansson@arm.com
13110246Sandreas.hansson@arm.com        // Hold onto data pointer
13210140SN/A        uint8_t *data;
13310140SN/A    };
13410140SN/A
13510140SN/A//    Request *dataReq;
13610140SN/A    Packet  *retryPkt;
1379243SN/A//    MemInterface *cacheInterface;
1389243SN/A//    PhysicalMemory *mainMem;
1399567SN/A//    PhysicalMemory *checkMem;
1409243SN/A//    SimpleThread *thread;
14110489SOmar.Naji@arm.com
14210489SOmar.Naji@arm.com    bool accessRetry;
14310489SOmar.Naji@arm.com
14410489SOmar.Naji@arm.com    unsigned size;		// size of testing memory region
14510489SOmar.Naji@arm.com
14610489SOmar.Naji@arm.com    unsigned percentReads;	// target percentage of read accesses
14710489SOmar.Naji@arm.com//    unsigned percentCopies;	// target percentage of copy accesses
14810489SOmar.Naji@arm.com    unsigned percentUncacheable;
14910489SOmar.Naji@arm.com
15010489SOmar.Naji@arm.com    int id;
1519243SN/A
1529243SN/A    std::set<unsigned> outstandingAddrs;
1539831SN/A
1549831SN/A    unsigned blockSize;
1559831SN/A
1569831SN/A    Addr blockAddrMask;
1579831SN/A
1589243SN/A    Addr blockAddr(Addr addr)
15910207Sandreas.hansson@arm.com    {
16010207Sandreas.hansson@arm.com        return (addr & ~blockAddrMask);
16110207Sandreas.hansson@arm.com    }
16210207Sandreas.hansson@arm.com
16310207Sandreas.hansson@arm.com    Addr traceBlockAddr;
16410394Swendy.elsasser@arm.com
16510394Swendy.elsasser@arm.com    Addr baseAddr1;		// fix this to option
16610394Swendy.elsasser@arm.com    Addr baseAddr2;		// fix this to option
16710394Swendy.elsasser@arm.com    Addr uncacheAddr;
16810394Swendy.elsasser@arm.com
16910394Swendy.elsasser@arm.com    unsigned progressInterval;	// frequency of progress reports
17010394Swendy.elsasser@arm.com    Tick nextProgressMessage;	// access # for next progress report
17110394Swendy.elsasser@arm.com
17210394Swendy.elsasser@arm.com    unsigned percentSourceUnaligned;
17310394Swendy.elsasser@arm.com    unsigned percentDestUnaligned;
17410394Swendy.elsasser@arm.com
17510394Swendy.elsasser@arm.com    Tick noResponseCycles;
17610394Swendy.elsasser@arm.com
17710394Swendy.elsasser@arm.com    uint64_t numReads;
17810394Swendy.elsasser@arm.com    uint64_t maxLoads;
17910394Swendy.elsasser@arm.com
18010394Swendy.elsasser@arm.com    bool atomic;
18110394Swendy.elsasser@arm.com
18210394Swendy.elsasser@arm.com    Stats::Scalar<> numReadsStat;
18310394Swendy.elsasser@arm.com    Stats::Scalar<> numWritesStat;
18410394Swendy.elsasser@arm.com    Stats::Scalar<> numCopiesStat;
18510394Swendy.elsasser@arm.com
18610561SOmar.Naji@arm.com    // called by MemCompleteEvent::process()
18710561SOmar.Naji@arm.com    void completeRequest(Packet *pkt);
18810394Swendy.elsasser@arm.com
18910394Swendy.elsasser@arm.com    void sendPkt(Packet *pkt);
19010394Swendy.elsasser@arm.com
19110394Swendy.elsasser@arm.com    void doRetry();
19210394Swendy.elsasser@arm.com
19310394Swendy.elsasser@arm.com    friend class MemCompleteEvent;
1949243SN/A};
1959243SN/A
1969243SN/A#endif // __CPU_MEMTEST_MEMTEST_HH__
19710146Sandreas.hansson@arm.com
19810140SN/A
19910466Sandreas.hansson@arm.com
20010466Sandreas.hansson@arm.com