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