memtest.hh revision 8948
12292SN/A/* 22292SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 32292SN/A * All rights reserved. 42292SN/A * 52292SN/A * Redistribution and use in source and binary forms, with or without 62292SN/A * modification, are permitted provided that the following conditions are 72292SN/A * met: redistributions of source code must retain the above copyright 82292SN/A * notice, this list of conditions and the following disclaimer; 92292SN/A * redistributions in binary form must reproduce the above copyright 102292SN/A * notice, this list of conditions and the following disclaimer in the 112292SN/A * documentation and/or other materials provided with the distribution; 122292SN/A * neither the name of the copyright holders nor the names of its 132292SN/A * contributors may be used to endorse or promote products derived from 142292SN/A * this software without specific prior written permission. 152292SN/A * 162292SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182292SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192292SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202292SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212292SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222292SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232292SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242292SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252292SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262292SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272689Sktlim@umich.edu * 282689Sktlim@umich.edu * Authors: Erik Hallnor 292689Sktlim@umich.edu * Steve Reinhardt 302292SN/A */ 312292SN/A 322316SN/A#ifndef __CPU_MEMTEST_MEMTEST_HH__ 332292SN/A#define __CPU_MEMTEST_MEMTEST_HH__ 342292SN/A 352669Sktlim@umich.edu#include <set> 362292SN/A 372669Sktlim@umich.edu#include "base/fast_alloc.hh" 382678Sktlim@umich.edu#include "base/statistics.hh" 392678Sktlim@umich.edu#include "mem/mem_object.hh" 402678Sktlim@umich.edu#include "mem/port.hh" 412292SN/A#include "mem/port_proxy.hh" 422678Sktlim@umich.edu#include "params/MemTest.hh" 432292SN/A#include "sim/eventq.hh" 442292SN/A#include "sim/sim_exit.hh" 452669Sktlim@umich.edu#include "sim/sim_object.hh" 462292SN/A#include "sim/stats.hh" 472678Sktlim@umich.edu 482292SN/Aclass Packet; 492678Sktlim@umich.educlass MemTest : public MemObject 502678Sktlim@umich.edu{ 512678Sktlim@umich.edu public: 522678Sktlim@umich.edu typedef MemTestParams Params; 532678Sktlim@umich.edu MemTest(const Params *p); 542292SN/A 552678Sktlim@umich.edu virtual void init(); 562678Sktlim@umich.edu 572678Sktlim@umich.edu // register statistics 582678Sktlim@umich.edu virtual void regStats(); 592678Sktlim@umich.edu 602678Sktlim@umich.edu inline Tick ticks(int numCycles) const { return numCycles; } 612292SN/A 622678Sktlim@umich.edu // main simulation loop (one cycle) 632678Sktlim@umich.edu void tick(); 642678Sktlim@umich.edu 652678Sktlim@umich.edu virtual MasterPort &getMasterPort(const std::string &if_name, 662678Sktlim@umich.edu int idx = -1); 672678Sktlim@umich.edu 682678Sktlim@umich.edu /** 692678Sktlim@umich.edu * Print state of address in memory system via PrintReq (for 702344SN/A * debugging). 712678Sktlim@umich.edu */ 722678Sktlim@umich.edu void printAddr(Addr a); 732678Sktlim@umich.edu 742678Sktlim@umich.edu protected: 752678Sktlim@umich.edu class TickEvent : public Event 762307SN/A { 772678Sktlim@umich.edu private: 782678Sktlim@umich.edu MemTest *cpu; 792678Sktlim@umich.edu 802678Sktlim@umich.edu public: 812678Sktlim@umich.edu TickEvent(MemTest *c) : Event(CPU_Tick_Pri), cpu(c) {} 822678Sktlim@umich.edu void process() { cpu->tick(); } 832678Sktlim@umich.edu virtual const char *description() const { return "MemTest tick"; } 842678Sktlim@umich.edu }; 852344SN/A 862307SN/A TickEvent tickEvent; 872678Sktlim@umich.edu 882678Sktlim@umich.edu class CpuPort : public MasterPort 892292SN/A { 902292SN/A MemTest *memtest; 912292SN/A 922669Sktlim@umich.edu public: 932669Sktlim@umich.edu 942292SN/A CpuPort(const std::string &_name, MemTest *_memtest) 952669Sktlim@umich.edu : MasterPort(_name, _memtest), memtest(_memtest) 962669Sktlim@umich.edu { } 972669Sktlim@umich.edu 982669Sktlim@umich.edu protected: 992669Sktlim@umich.edu 1002669Sktlim@umich.edu virtual bool recvTiming(PacketPtr pkt); 1012669Sktlim@umich.edu 1022669Sktlim@umich.edu virtual bool recvTimingSnoop(PacketPtr pkt) { return true; } 1032669Sktlim@umich.edu 1042669Sktlim@umich.edu virtual Tick recvAtomicSnoop(PacketPtr pkt) { return 0; } 1052669Sktlim@umich.edu 1062669Sktlim@umich.edu virtual void recvFunctionalSnoop(PacketPtr pkt) { } 1072669Sktlim@umich.edu 1082669Sktlim@umich.edu virtual void recvRetry(); 1092669Sktlim@umich.edu }; 1102669Sktlim@umich.edu 1112669Sktlim@umich.edu CpuPort cachePort; 1122669Sktlim@umich.edu CpuPort funcPort; 1132669Sktlim@umich.edu PortProxy funcProxy; 1142669Sktlim@umich.edu 1152669Sktlim@umich.edu class MemTestSenderState : public Packet::SenderState, public FastAlloc 1162669Sktlim@umich.edu { 1172669Sktlim@umich.edu public: 1182669Sktlim@umich.edu /** Constructor. */ 1192669Sktlim@umich.edu MemTestSenderState(uint8_t *_data) 1202669Sktlim@umich.edu : data(_data) 1212669Sktlim@umich.edu { } 1222669Sktlim@umich.edu 1232669Sktlim@umich.edu // Hold onto data pointer 1242669Sktlim@umich.edu uint8_t *data; 1252669Sktlim@umich.edu }; 1262669Sktlim@umich.edu 1272669Sktlim@umich.edu PacketPtr retryPkt; 1282693Sktlim@umich.edu 1292292SN/A bool accessRetry; 1302292SN/A 1312292SN/A // 1322292SN/A // The dmaOustanding flag enforces only one dma at a time 1332678Sktlim@umich.edu // 1342678Sktlim@umich.edu bool dmaOutstanding; 1352292SN/A 1362292SN/A unsigned size; // size of testing memory region 1372292SN/A 1382292SN/A unsigned percentReads; // target percentage of read accesses 1392292SN/A unsigned percentFunctional; // target percentage of functional accesses 1402292SN/A unsigned percentUncacheable; 1412292SN/A 1422292SN/A bool issueDmas; 1432292SN/A 1442292SN/A /** Request id for all generated traffic */ 1452292SN/A MasterID masterId; 1462307SN/A 1472307SN/A int id; 1482292SN/A 1492292SN/A std::set<unsigned> outstandingAddrs; 1502329SN/A 1512329SN/A unsigned blockSize; 1522329SN/A 1532292SN/A Addr blockAddrMask; 1542292SN/A 1552292SN/A Addr blockAddr(Addr addr) 1562292SN/A { 1572292SN/A return (addr & ~blockAddrMask); 1582292SN/A } 1592292SN/A 1602292SN/A Addr traceBlockAddr; 1612292SN/A 1622292SN/A Addr baseAddr1; // fix this to option 1632292SN/A Addr baseAddr2; // fix this to option 1642678Sktlim@umich.edu Addr uncacheAddr; 1652292SN/A 1662329SN/A unsigned progressInterval; // frequency of progress reports 1672292SN/A Tick nextProgressMessage; // access # for next progress report 1682292SN/A 1692292SN/A unsigned percentSourceUnaligned; 1702292SN/A unsigned percentDestUnaligned; 1712292SN/A 1722669Sktlim@umich.edu Tick noResponseCycles; 1732669Sktlim@umich.edu 1742669Sktlim@umich.edu uint64_t numReads; 1752669Sktlim@umich.edu uint64_t numWrites; 1762669Sktlim@umich.edu uint64_t maxLoads; 1772678Sktlim@umich.edu 1782678Sktlim@umich.edu bool atomic; 1792678Sktlim@umich.edu bool suppress_func_warnings; 1802678Sktlim@umich.edu 1812679Sktlim@umich.edu Stats::Scalar numReadsStat; 1822679Sktlim@umich.edu Stats::Scalar numWritesStat; 1832679Sktlim@umich.edu Stats::Scalar numCopiesStat; 1842679Sktlim@umich.edu 1852669Sktlim@umich.edu // called by MemCompleteEvent::process() 1862669Sktlim@umich.edu void completeRequest(PacketPtr pkt); 1872669Sktlim@umich.edu 1882292SN/A void sendPkt(PacketPtr pkt); 1892292SN/A 1902292SN/A void doRetry(); 1912292SN/A 1922292SN/A friend class MemCompleteEvent; 1932292SN/A}; 1942292SN/A 1952292SN/A#endif // __CPU_MEMTEST_MEMTEST_HH__ 1962292SN/A 1972292SN/A 1982292SN/A 1992292SN/A