memtest.hh revision 5543
14997Sgblack@eecs.umich.edu/* 24997Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 34997Sgblack@eecs.umich.edu * All rights reserved. 44997Sgblack@eecs.umich.edu * 54997Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64997Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 74997Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84997Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94997Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104997Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114997Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124997Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134997Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144997Sgblack@eecs.umich.edu * this software without specific prior written permission. 154997Sgblack@eecs.umich.edu * 164997Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174997Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184997Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194997Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204997Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214997Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224997Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234997Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244997Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254997Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264997Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274997Sgblack@eecs.umich.edu * 284997Sgblack@eecs.umich.edu * Authors: Erik Hallnor 294997Sgblack@eecs.umich.edu * Steve Reinhardt 304997Sgblack@eecs.umich.edu */ 314997Sgblack@eecs.umich.edu 324997Sgblack@eecs.umich.edu#ifndef __CPU_MEMTEST_MEMTEST_HH__ 334997Sgblack@eecs.umich.edu#define __CPU_MEMTEST_MEMTEST_HH__ 344997Sgblack@eecs.umich.edu 354997Sgblack@eecs.umich.edu#include <set> 364997Sgblack@eecs.umich.edu 374997Sgblack@eecs.umich.edu#include "base/statistics.hh" 384997Sgblack@eecs.umich.edu#include "base/fast_alloc.hh" 394997Sgblack@eecs.umich.edu#include "params/MemTest.hh" 404997Sgblack@eecs.umich.edu#include "sim/eventq.hh" 414997Sgblack@eecs.umich.edu#include "sim/sim_exit.hh" 424997Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 434997Sgblack@eecs.umich.edu#include "sim/stats.hh" 444997Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 454997Sgblack@eecs.umich.edu#include "mem/port.hh" 464997Sgblack@eecs.umich.edu 474997Sgblack@eecs.umich.educlass Packet; 484997Sgblack@eecs.umich.educlass MemTest : public MemObject 494997Sgblack@eecs.umich.edu{ 504997Sgblack@eecs.umich.edu public: 514997Sgblack@eecs.umich.edu typedef MemTestParams Params; 524997Sgblack@eecs.umich.edu MemTest(const Params *p); 534997Sgblack@eecs.umich.edu 544997Sgblack@eecs.umich.edu virtual void init(); 554997Sgblack@eecs.umich.edu 564997Sgblack@eecs.umich.edu // register statistics 574997Sgblack@eecs.umich.edu virtual void regStats(); 584997Sgblack@eecs.umich.edu 594997Sgblack@eecs.umich.edu inline Tick ticks(int numCycles) const { return numCycles; } 605086Sgblack@eecs.umich.edu 615086Sgblack@eecs.umich.edu // main simulation loop (one cycle) 625124Sgblack@eecs.umich.edu void tick(); 635086Sgblack@eecs.umich.edu 645149Sgblack@eecs.umich.edu virtual Port *getPort(const std::string &if_name, int idx = -1); 655086Sgblack@eecs.umich.edu 665086Sgblack@eecs.umich.edu /** 675237Sgblack@eecs.umich.edu * Print state of address in memory system via PrintReq (for 685086Sgblack@eecs.umich.edu * debugging). 695086Sgblack@eecs.umich.edu */ 705086Sgblack@eecs.umich.edu void printAddr(Addr a); 715086Sgblack@eecs.umich.edu 725245Sgblack@eecs.umich.edu protected: 735245Sgblack@eecs.umich.edu class TickEvent : public Event 745245Sgblack@eecs.umich.edu { 755245Sgblack@eecs.umich.edu private: 765086Sgblack@eecs.umich.edu MemTest *cpu; 775086Sgblack@eecs.umich.edu public: 785086Sgblack@eecs.umich.edu TickEvent(MemTest *c) 795358Sgblack@eecs.umich.edu : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {} 805124Sgblack@eecs.umich.edu void process() {cpu->tick();} 815124Sgblack@eecs.umich.edu virtual const char *description() const { return "MemTest tick"; } 825124Sgblack@eecs.umich.edu }; 835124Sgblack@eecs.umich.edu 845124Sgblack@eecs.umich.edu TickEvent tickEvent; 855124Sgblack@eecs.umich.edu 865124Sgblack@eecs.umich.edu class CpuPort : public Port 875237Sgblack@eecs.umich.edu { 885245Sgblack@eecs.umich.edu MemTest *memtest; 895245Sgblack@eecs.umich.edu 905245Sgblack@eecs.umich.edu public: 915236Sgblack@eecs.umich.edu 925236Sgblack@eecs.umich.edu CpuPort(const std::string &_name, MemTest *_memtest) 935236Sgblack@eecs.umich.edu : Port(_name, _memtest), memtest(_memtest) 945124Sgblack@eecs.umich.edu { } 955124Sgblack@eecs.umich.edu 965124Sgblack@eecs.umich.edu bool snoopRangeSent; 975124Sgblack@eecs.umich.edu 985124Sgblack@eecs.umich.edu protected: 995124Sgblack@eecs.umich.edu 1005124Sgblack@eecs.umich.edu virtual bool recvTiming(PacketPtr pkt); 1015124Sgblack@eecs.umich.edu 1025124Sgblack@eecs.umich.edu virtual Tick recvAtomic(PacketPtr pkt); 1035124Sgblack@eecs.umich.edu 1045124Sgblack@eecs.umich.edu virtual void recvFunctional(PacketPtr pkt); 1055124Sgblack@eecs.umich.edu 1065124Sgblack@eecs.umich.edu virtual void recvStatusChange(Status status); 1075124Sgblack@eecs.umich.edu 1085124Sgblack@eecs.umich.edu virtual void recvRetry(); 1095124Sgblack@eecs.umich.edu 1105124Sgblack@eecs.umich.edu virtual void getDeviceAddressRanges(AddrRangeList &resp, 1115124Sgblack@eecs.umich.edu bool &snoop) 1125124Sgblack@eecs.umich.edu { resp.clear(); snoop = false; } 1135124Sgblack@eecs.umich.edu }; 1145124Sgblack@eecs.umich.edu 1155124Sgblack@eecs.umich.edu CpuPort cachePort; 1165124Sgblack@eecs.umich.edu CpuPort funcPort; 1175124Sgblack@eecs.umich.edu 1185124Sgblack@eecs.umich.edu bool snoopRangeSent; 1195124Sgblack@eecs.umich.edu 1205124Sgblack@eecs.umich.edu class MemTestSenderState : public Packet::SenderState, public FastAlloc 1215124Sgblack@eecs.umich.edu { 1225124Sgblack@eecs.umich.edu public: 1235124Sgblack@eecs.umich.edu /** Constructor. */ 1245124Sgblack@eecs.umich.edu MemTestSenderState(uint8_t *_data) 1255124Sgblack@eecs.umich.edu : data(_data) 1265124Sgblack@eecs.umich.edu { } 1275124Sgblack@eecs.umich.edu 1285124Sgblack@eecs.umich.edu // Hold onto data pointer 1295124Sgblack@eecs.umich.edu uint8_t *data; 1305124Sgblack@eecs.umich.edu }; 1315245Sgblack@eecs.umich.edu 1325245Sgblack@eecs.umich.edu PacketPtr retryPkt; 1335245Sgblack@eecs.umich.edu 1345245Sgblack@eecs.umich.edu bool accessRetry; 1355245Sgblack@eecs.umich.edu 1365245Sgblack@eecs.umich.edu unsigned size; // size of testing memory region 1375245Sgblack@eecs.umich.edu 1385245Sgblack@eecs.umich.edu unsigned percentReads; // target percentage of read accesses 1395124Sgblack@eecs.umich.edu unsigned percentFunctional; // target percentage of functional accesses 1405124Sgblack@eecs.umich.edu unsigned percentUncacheable; 1415124Sgblack@eecs.umich.edu 1425242Sgblack@eecs.umich.edu int id; 1435242Sgblack@eecs.umich.edu 1445242Sgblack@eecs.umich.edu std::set<unsigned> outstandingAddrs; 1455242Sgblack@eecs.umich.edu 1465242Sgblack@eecs.umich.edu unsigned blockSize; 1475242Sgblack@eecs.umich.edu 1485124Sgblack@eecs.umich.edu Addr blockAddrMask; 1495124Sgblack@eecs.umich.edu 1505124Sgblack@eecs.umich.edu Addr blockAddr(Addr addr) 1515357Sgblack@eecs.umich.edu { 1525357Sgblack@eecs.umich.edu return (addr & ~blockAddrMask); 1535357Sgblack@eecs.umich.edu } 1545357Sgblack@eecs.umich.edu 1555357Sgblack@eecs.umich.edu Addr traceBlockAddr; 1565357Sgblack@eecs.umich.edu 1575124Sgblack@eecs.umich.edu Addr baseAddr1; // fix this to option 1585124Sgblack@eecs.umich.edu Addr baseAddr2; // fix this to option 1595242Sgblack@eecs.umich.edu Addr uncacheAddr; 1605242Sgblack@eecs.umich.edu 1615242Sgblack@eecs.umich.edu unsigned progressInterval; // frequency of progress reports 1625242Sgblack@eecs.umich.edu Tick nextProgressMessage; // access # for next progress report 1635242Sgblack@eecs.umich.edu 1645242Sgblack@eecs.umich.edu unsigned percentSourceUnaligned; 1655242Sgblack@eecs.umich.edu unsigned percentDestUnaligned; 1665242Sgblack@eecs.umich.edu 1675242Sgblack@eecs.umich.edu Tick noResponseCycles; 1685242Sgblack@eecs.umich.edu 1695124Sgblack@eecs.umich.edu uint64_t numReads; 1705124Sgblack@eecs.umich.edu uint64_t maxLoads; 1715124Sgblack@eecs.umich.edu 1725358Sgblack@eecs.umich.edu bool atomic; 1735086Sgblack@eecs.umich.edu 1745359Sgblack@eecs.umich.edu Stats::Scalar<> numReadsStat; 1755359Sgblack@eecs.umich.edu Stats::Scalar<> numWritesStat; 1765359Sgblack@eecs.umich.edu Stats::Scalar<> numCopiesStat; 1775359Sgblack@eecs.umich.edu 1785359Sgblack@eecs.umich.edu // called by MemCompleteEvent::process() 1795086Sgblack@eecs.umich.edu void completeRequest(PacketPtr pkt); 1805086Sgblack@eecs.umich.edu 1815140Sgblack@eecs.umich.edu void sendPkt(PacketPtr pkt); 1825086Sgblack@eecs.umich.edu 1835140Sgblack@eecs.umich.edu void doRetry(); 1845086Sgblack@eecs.umich.edu 1855124Sgblack@eecs.umich.edu friend class MemCompleteEvent; 1865140Sgblack@eecs.umich.edu}; 1875124Sgblack@eecs.umich.edu 1885124Sgblack@eecs.umich.edu#endif // __CPU_MEMTEST_MEMTEST_HH__ 1895140Sgblack@eecs.umich.edu 1905294Sgblack@eecs.umich.edu 1915124Sgblack@eecs.umich.edu 1925124Sgblack@eecs.umich.edu