memtest.hh revision 8436
12SN/A/*
21762SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan
32SN/A * All rights reserved.
42SN/A *
52SN/A * Redistribution and use in source and binary forms, with or without
62SN/A * modification, are permitted provided that the following conditions are
72SN/A * met: redistributions of source code must retain the above copyright
82SN/A * notice, this list of conditions and the following disclaimer;
92SN/A * redistributions in binary form must reproduce the above copyright
102SN/A * notice, this list of conditions and the following disclaimer in the
112SN/A * documentation and/or other materials provided with the distribution;
122SN/A * neither the name of the copyright holders nor the names of its
132SN/A * contributors may be used to endorse or promote products derived from
142SN/A * this software without specific prior written permission.
152SN/A *
162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Erik Hallnor
292665Ssaidi@eecs.umich.edu *          Steve Reinhardt
302665Ssaidi@eecs.umich.edu */
312665Ssaidi@eecs.umich.edu
322SN/A#ifndef __CPU_MEMTEST_MEMTEST_HH__
332SN/A#define __CPU_MEMTEST_MEMTEST_HH__
342SN/A
352SN/A#include <set>
362SN/A
372973Sgblack@eecs.umich.edu#include "base/fast_alloc.hh"
3856SN/A#include "base/statistics.hh"
391717SN/A#include "mem/mem_object.hh"
402518SN/A#include "mem/port.hh"
4156SN/A#include "params/MemTest.hh"
422518SN/A#include "sim/eventq.hh"
432518SN/A#include "sim/sim_exit.hh"
442SN/A#include "sim/sim_object.hh"
452SN/A#include "sim/stats.hh"
462973Sgblack@eecs.umich.edu
472SN/Aclass Packet;
482SN/Aclass MemTest : public MemObject
492SN/A{
502SN/A  public:
512SN/A    typedef MemTestParams Params;
522SN/A    MemTest(const Params *p);
532SN/A
542SN/A    virtual void init();
552SN/A
562SN/A    // register statistics
573059Sgblack@eecs.umich.edu    virtual void regStats();
583059Sgblack@eecs.umich.edu
593059Sgblack@eecs.umich.edu    inline Tick ticks(int numCycles) const { return numCycles; }
603059Sgblack@eecs.umich.edu
613059Sgblack@eecs.umich.edu    // main simulation loop (one cycle)
623059Sgblack@eecs.umich.edu    void tick();
633059Sgblack@eecs.umich.edu
643059Sgblack@eecs.umich.edu    virtual Port *getPort(const std::string &if_name, int idx = -1);
653059Sgblack@eecs.umich.edu
663059Sgblack@eecs.umich.edu    /**
672973Sgblack@eecs.umich.edu     * Print state of address in memory system via PrintReq (for
682973Sgblack@eecs.umich.edu     * debugging).
693059Sgblack@eecs.umich.edu     */
703059Sgblack@eecs.umich.edu    void printAddr(Addr a);
713059Sgblack@eecs.umich.edu
723059Sgblack@eecs.umich.edu  protected:
733059Sgblack@eecs.umich.edu    class TickEvent : public Event
743059Sgblack@eecs.umich.edu    {
753059Sgblack@eecs.umich.edu      private:
763059Sgblack@eecs.umich.edu        MemTest *cpu;
773059Sgblack@eecs.umich.edu
783059Sgblack@eecs.umich.edu      public:
793059Sgblack@eecs.umich.edu        TickEvent(MemTest *c) : Event(CPU_Tick_Pri), cpu(c) {}
803059Sgblack@eecs.umich.edu        void process() { cpu->tick(); }
813059Sgblack@eecs.umich.edu        virtual const char *description() const { return "MemTest tick"; }
823059Sgblack@eecs.umich.edu    };
833059Sgblack@eecs.umich.edu
843059Sgblack@eecs.umich.edu    TickEvent tickEvent;
853059Sgblack@eecs.umich.edu
863059Sgblack@eecs.umich.edu    class CpuPort : public Port
873059Sgblack@eecs.umich.edu    {
883059Sgblack@eecs.umich.edu        MemTest *memtest;
893059Sgblack@eecs.umich.edu
903059Sgblack@eecs.umich.edu      public:
913059Sgblack@eecs.umich.edu
923059Sgblack@eecs.umich.edu        CpuPort(const std::string &_name, MemTest *_memtest)
933059Sgblack@eecs.umich.edu            : Port(_name, _memtest), memtest(_memtest)
943059Sgblack@eecs.umich.edu        { }
953059Sgblack@eecs.umich.edu
963059Sgblack@eecs.umich.edu        bool snoopRangeSent;
973059Sgblack@eecs.umich.edu
983059Sgblack@eecs.umich.edu      protected:
993059Sgblack@eecs.umich.edu
1003059Sgblack@eecs.umich.edu        virtual bool recvTiming(PacketPtr pkt);
1013059Sgblack@eecs.umich.edu
1023059Sgblack@eecs.umich.edu        virtual Tick recvAtomic(PacketPtr pkt);
1033059Sgblack@eecs.umich.edu
1043059Sgblack@eecs.umich.edu        virtual void recvFunctional(PacketPtr pkt);
1053059Sgblack@eecs.umich.edu
1063059Sgblack@eecs.umich.edu        virtual void recvStatusChange(Status status);
1073059Sgblack@eecs.umich.edu
1083059Sgblack@eecs.umich.edu        virtual void recvRetry();
1093059Sgblack@eecs.umich.edu
1103059Sgblack@eecs.umich.edu        virtual void getDeviceAddressRanges(AddrRangeList &resp,
1113059Sgblack@eecs.umich.edu                                            bool &snoop)
1123059Sgblack@eecs.umich.edu        { resp.clear(); snoop = false; }
1133059Sgblack@eecs.umich.edu    };
1142973Sgblack@eecs.umich.edu
1152973Sgblack@eecs.umich.edu    CpuPort cachePort;
1162973Sgblack@eecs.umich.edu    CpuPort funcPort;
1172973Sgblack@eecs.umich.edu
1182973Sgblack@eecs.umich.edu    bool snoopRangeSent;
1192973Sgblack@eecs.umich.edu
1202973Sgblack@eecs.umich.edu    class MemTestSenderState : public Packet::SenderState, public FastAlloc
1212973Sgblack@eecs.umich.edu    {
1222973Sgblack@eecs.umich.edu      public:
1232973Sgblack@eecs.umich.edu        /** Constructor. */
1242973Sgblack@eecs.umich.edu        MemTestSenderState(uint8_t *_data)
1252973Sgblack@eecs.umich.edu            : data(_data)
1262973Sgblack@eecs.umich.edu        { }
1272973Sgblack@eecs.umich.edu
1282973Sgblack@eecs.umich.edu        // Hold onto data pointer
1292973Sgblack@eecs.umich.edu        uint8_t *data;
1302973Sgblack@eecs.umich.edu    };
1312973Sgblack@eecs.umich.edu
1322973Sgblack@eecs.umich.edu    PacketPtr retryPkt;
1332973Sgblack@eecs.umich.edu
1342973Sgblack@eecs.umich.edu    bool accessRetry;
1352973Sgblack@eecs.umich.edu
1362973Sgblack@eecs.umich.edu    //
1372973Sgblack@eecs.umich.edu    // The dmaOustanding flag enforces only one dma at a time
1382973Sgblack@eecs.umich.edu    //
1392973Sgblack@eecs.umich.edu    bool dmaOutstanding;
1402973Sgblack@eecs.umich.edu
1412973Sgblack@eecs.umich.edu    unsigned size;              // size of testing memory region
1422973Sgblack@eecs.umich.edu
1431968SN/A    unsigned percentReads;      // target percentage of read accesses
1441968SN/A    unsigned percentFunctional; // target percentage of functional accesses
1451968SN/A    unsigned percentUncacheable;
1461968SN/A
1471968SN/A    bool issueDmas;
1481968SN/A
1491967SN/A    int id;
1501967SN/A
1511967SN/A    std::set<unsigned> outstandingAddrs;
1521967SN/A
1531967SN/A    unsigned blockSize;
1541967SN/A
1551967SN/A    Addr blockAddrMask;
1561967SN/A
1571967SN/A    Addr blockAddr(Addr addr)
1581967SN/A    {
1591904SN/A        return (addr & ~blockAddrMask);
1601904SN/A    }
1611904SN/A
1621904SN/A    Addr traceBlockAddr;
163452SN/A
1641904SN/A    Addr baseAddr1;             // fix this to option
1652SN/A    Addr baseAddr2;             // fix this to option
1661904SN/A    Addr uncacheAddr;
1671904SN/A
1682SN/A    unsigned progressInterval;  // frequency of progress reports
1691904SN/A    Tick nextProgressMessage;   // access # for next progress report
1701904SN/A
1712SN/A    unsigned percentSourceUnaligned;
1722SN/A    unsigned percentDestUnaligned;
1731904SN/A
1741904SN/A    Tick noResponseCycles;
1751904SN/A
1762299SN/A    uint64_t numReads;
1772299SN/A    uint64_t numWrites;
1781904SN/A    uint64_t maxLoads;
1791904SN/A
1801904SN/A    bool atomic;
1811904SN/A    bool suppress_func_warnings;
1821904SN/A
1831904SN/A    Stats::Scalar numReadsStat;
1841904SN/A    Stats::Scalar numWritesStat;
185452SN/A    Stats::Scalar numCopiesStat;
1861904SN/A
1871904SN/A    // called by MemCompleteEvent::process()
1881904SN/A    void completeRequest(PacketPtr pkt);
1892SN/A
1902SN/A    void sendPkt(PacketPtr pkt);
1911904SN/A
1921904SN/A    void doRetry();
1931904SN/A
1941904SN/A    friend class MemCompleteEvent;
1951904SN/A};
1961904SN/A
1972SN/A#endif // __CPU_MEMTEST_MEMTEST_HH__
1981904SN/A
1992SN/A
2002SN/A
2011904SN/A