memtest.hh revision 5336
16019Shines@cs.fsu.edu/* 213882Sgiacomo.travaglini@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 37399SAli.Saidi@ARM.com * All rights reserved. 47399SAli.Saidi@ARM.com * 57399SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 67399SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 77399SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 87399SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 97399SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 107399SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 117399SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 127399SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 137399SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 146019Shines@cs.fsu.edu * this software without specific prior written permission. 156019Shines@cs.fsu.edu * 166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276019Shines@cs.fsu.edu * 286019Shines@cs.fsu.edu * Authors: Erik Hallnor 296019Shines@cs.fsu.edu * Steve Reinhardt 306019Shines@cs.fsu.edu */ 316019Shines@cs.fsu.edu 326019Shines@cs.fsu.edu#ifndef __CPU_MEMTEST_MEMTEST_HH__ 336019Shines@cs.fsu.edu#define __CPU_MEMTEST_MEMTEST_HH__ 346019Shines@cs.fsu.edu 356019Shines@cs.fsu.edu#include <set> 366019Shines@cs.fsu.edu 376019Shines@cs.fsu.edu#include "base/statistics.hh" 386019Shines@cs.fsu.edu#include "params/MemTest.hh" 396019Shines@cs.fsu.edu#include "sim/eventq.hh" 407399SAli.Saidi@ARM.com#include "sim/sim_exit.hh" 416019Shines@cs.fsu.edu#include "sim/sim_object.hh" 426019Shines@cs.fsu.edu#include "sim/stats.hh" 436019Shines@cs.fsu.edu#include "mem/mem_object.hh" 446019Shines@cs.fsu.edu#include "mem/port.hh" 456019Shines@cs.fsu.edu 466019Shines@cs.fsu.educlass Packet; 476019Shines@cs.fsu.educlass MemTest : public MemObject 488229Snate@binkert.org{ 496019Shines@cs.fsu.edu public: 506019Shines@cs.fsu.edu typedef MemTestParams Params; 5110687SAndreas.Sandberg@ARM.com MemTest(const Params *p); 526019Shines@cs.fsu.edu 536019Shines@cs.fsu.edu virtual void init(); 546116Snate@binkert.org 5510463SAndreas.Sandberg@ARM.com // register statistics 566019Shines@cs.fsu.edu virtual void regStats(); 576019Shines@cs.fsu.edu 586019Shines@cs.fsu.edu inline Tick ticks(int numCycles) const { return numCycles; } 596019Shines@cs.fsu.edu 606019Shines@cs.fsu.edu // main simulation loop (one cycle) 617404SAli.Saidi@ARM.com void tick(); 6210037SARM gem5 Developers 6310037SARM gem5 Developers virtual Port *getPort(const std::string &if_name, int idx = -1); 6411395Sandreas.sandberg@arm.com 6511395Sandreas.sandberg@arm.com /** 6611395Sandreas.sandberg@arm.com * Print state of address in memory system via PrintReq (for 6711395Sandreas.sandberg@arm.com * debugging). 6811395Sandreas.sandberg@arm.com */ 6911395Sandreas.sandberg@arm.com void printAddr(Addr a); 7011395Sandreas.sandberg@arm.com 7111395Sandreas.sandberg@arm.com protected: 7211395Sandreas.sandberg@arm.com class TickEvent : public Event 7311395Sandreas.sandberg@arm.com { 7411395Sandreas.sandberg@arm.com private: 7511395Sandreas.sandberg@arm.com MemTest *cpu; 7611395Sandreas.sandberg@arm.com public: 7711395Sandreas.sandberg@arm.com TickEvent(MemTest *c) 7811395Sandreas.sandberg@arm.com : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {} 7911395Sandreas.sandberg@arm.com void process() {cpu->tick();} 8012749Sgiacomo.travaglini@arm.com virtual const char *description() const { return "MemTest tick"; } 8111395Sandreas.sandberg@arm.com }; 8211395Sandreas.sandberg@arm.com 8311395Sandreas.sandberg@arm.com TickEvent tickEvent; 8411395Sandreas.sandberg@arm.com 8511395Sandreas.sandberg@arm.com class CpuPort : public Port 8611395Sandreas.sandberg@arm.com { 8711395Sandreas.sandberg@arm.com MemTest *memtest; 8811395Sandreas.sandberg@arm.com 8911395Sandreas.sandberg@arm.com public: 9011395Sandreas.sandberg@arm.com 9111395Sandreas.sandberg@arm.com CpuPort(const std::string &_name, MemTest *_memtest) 9211395Sandreas.sandberg@arm.com : Port(_name, _memtest), memtest(_memtest) 9311395Sandreas.sandberg@arm.com { } 9411395Sandreas.sandberg@arm.com 9511395Sandreas.sandberg@arm.com bool snoopRangeSent; 9611395Sandreas.sandberg@arm.com 9711395Sandreas.sandberg@arm.com protected: 9811395Sandreas.sandberg@arm.com 9911395Sandreas.sandberg@arm.com virtual bool recvTiming(PacketPtr pkt); 10011395Sandreas.sandberg@arm.com 1017404SAli.Saidi@ARM.com virtual Tick recvAtomic(PacketPtr pkt); 1026019Shines@cs.fsu.edu 1036019Shines@cs.fsu.edu virtual void recvFunctional(PacketPtr pkt); 1047294Sgblack@eecs.umich.edu 1057294Sgblack@eecs.umich.edu virtual void recvStatusChange(Status status); 10610037SARM gem5 Developers 1077294Sgblack@eecs.umich.edu virtual void recvRetry(); 1087294Sgblack@eecs.umich.edu 1097294Sgblack@eecs.umich.edu virtual void getDeviceAddressRanges(AddrRangeList &resp, 11010037SARM gem5 Developers bool &snoop) 11110037SARM gem5 Developers { resp.clear(); snoop = false; } 11210037SARM gem5 Developers }; 11310037SARM gem5 Developers 1147294Sgblack@eecs.umich.edu CpuPort cachePort; 11510037SARM gem5 Developers CpuPort funcPort; 1167404SAli.Saidi@ARM.com 11710037SARM gem5 Developers bool snoopRangeSent; 1187294Sgblack@eecs.umich.edu 1197294Sgblack@eecs.umich.edu class MemTestSenderState : public Packet::SenderState 1207294Sgblack@eecs.umich.edu { 12110037SARM gem5 Developers public: 12210037SARM gem5 Developers /** Constructor. */ 12310037SARM gem5 Developers MemTestSenderState(uint8_t *_data) 12410037SARM gem5 Developers : data(_data) 12510037SARM gem5 Developers { } 12610037SARM gem5 Developers 12710037SARM gem5 Developers // Hold onto data pointer 12810037SARM gem5 Developers uint8_t *data; 12910037SARM gem5 Developers }; 13011577SDylan.Johnson@ARM.com 13111577SDylan.Johnson@ARM.com PacketPtr retryPkt; 13211577SDylan.Johnson@ARM.com 13311577SDylan.Johnson@ARM.com bool accessRetry; 13411577SDylan.Johnson@ARM.com 13511577SDylan.Johnson@ARM.com unsigned size; // size of testing memory region 13611577SDylan.Johnson@ARM.com 13711577SDylan.Johnson@ARM.com unsigned percentReads; // target percentage of read accesses 13811577SDylan.Johnson@ARM.com unsigned percentFunctional; // target percentage of functional accesses 13911577SDylan.Johnson@ARM.com unsigned percentUncacheable; 14011577SDylan.Johnson@ARM.com 1417294Sgblack@eecs.umich.edu int id; 14212735Sandreas.sandberg@arm.com 14312735Sandreas.sandberg@arm.com std::set<unsigned> outstandingAddrs; 14412735Sandreas.sandberg@arm.com 14512735Sandreas.sandberg@arm.com unsigned blockSize; 14612735Sandreas.sandberg@arm.com 14712735Sandreas.sandberg@arm.com Addr blockAddrMask; 14812735Sandreas.sandberg@arm.com 14912735Sandreas.sandberg@arm.com Addr blockAddr(Addr addr) 1506019Shines@cs.fsu.edu { 15110037SARM gem5 Developers return (addr & ~blockAddrMask); 15210037SARM gem5 Developers } 15310037SARM gem5 Developers 15410037SARM gem5 Developers Addr traceBlockAddr; 15513374Sanouk.vanlaer@arm.com 15613374Sanouk.vanlaer@arm.com Addr baseAddr1; // fix this to option 15713374Sanouk.vanlaer@arm.com Addr baseAddr2; // fix this to option 15813374Sanouk.vanlaer@arm.com Addr uncacheAddr; 15910037SARM gem5 Developers 16010037SARM gem5 Developers unsigned progressInterval; // frequency of progress reports 16110037SARM gem5 Developers Tick nextProgressMessage; // access # for next progress report 1627436Sdam.sunwoo@arm.com 1637404SAli.Saidi@ARM.com unsigned percentSourceUnaligned; 16410037SARM gem5 Developers unsigned percentDestUnaligned; 16510037SARM gem5 Developers 1666019Shines@cs.fsu.edu Tick noResponseCycles; 16711395Sandreas.sandberg@arm.com 16811395Sandreas.sandberg@arm.com uint64_t numReads; 1697399SAli.Saidi@ARM.com uint64_t maxLoads; 1707734SAli.Saidi@ARM.com 1717734SAli.Saidi@ARM.com bool atomic; 1727734SAli.Saidi@ARM.com 1737734SAli.Saidi@ARM.com Stats::Scalar<> numReadsStat; 1747734SAli.Saidi@ARM.com Stats::Scalar<> numWritesStat; 1757734SAli.Saidi@ARM.com Stats::Scalar<> numCopiesStat; 1767734SAli.Saidi@ARM.com 1777734SAli.Saidi@ARM.com // called by MemCompleteEvent::process() 1787734SAli.Saidi@ARM.com void completeRequest(PacketPtr pkt); 1797734SAli.Saidi@ARM.com 1807734SAli.Saidi@ARM.com void sendPkt(PacketPtr pkt); 1817734SAli.Saidi@ARM.com 1827734SAli.Saidi@ARM.com void doRetry(); 1837734SAli.Saidi@ARM.com 1847734SAli.Saidi@ARM.com friend class MemCompleteEvent; 1857734SAli.Saidi@ARM.com}; 1867734SAli.Saidi@ARM.com 1877734SAli.Saidi@ARM.com#endif // __CPU_MEMTEST_MEMTEST_HH__ 1887734SAli.Saidi@ARM.com 1897734SAli.Saidi@ARM.com 1906019Shines@cs.fsu.edu 1916019Shines@cs.fsu.edu