memtest.hh revision 5314
110448Snilay@cs.wisc.edu/* 210448Snilay@cs.wisc.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 310448Snilay@cs.wisc.edu * All rights reserved. 410448Snilay@cs.wisc.edu * 510448Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without 610448Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are 710448Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright 810448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer; 910448Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright 1010448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the 1110448Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution; 1210448Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its 1310448Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from 1410448Snilay@cs.wisc.edu * this software without specific prior written permission. 1510448Snilay@cs.wisc.edu * 1610448Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710448Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810448Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910448Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010448Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110448Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710447Snilay@cs.wisc.edu * 2810447Snilay@cs.wisc.edu * Authors: Erik Hallnor 2910447Snilay@cs.wisc.edu * Steve Reinhardt 3010447Snilay@cs.wisc.edu */ 3110447Snilay@cs.wisc.edu 3210447Snilay@cs.wisc.edu#ifndef __CPU_MEMTEST_MEMTEST_HH__ 3310447Snilay@cs.wisc.edu#define __CPU_MEMTEST_MEMTEST_HH__ 3410447Snilay@cs.wisc.edu 3510447Snilay@cs.wisc.edu#include <set> 3610447Snilay@cs.wisc.edu 3710447Snilay@cs.wisc.edu#include "base/statistics.hh" 3810447Snilay@cs.wisc.edu#include "params/MemTest.hh" 3910447Snilay@cs.wisc.edu#include "sim/eventq.hh" 4010447Snilay@cs.wisc.edu#include "sim/sim_exit.hh" 4110447Snilay@cs.wisc.edu#include "sim/sim_object.hh" 4210447Snilay@cs.wisc.edu#include "sim/stats.hh" 4310447Snilay@cs.wisc.edu#include "mem/mem_object.hh" 4410447Snilay@cs.wisc.edu#include "mem/port.hh" 4510447Snilay@cs.wisc.edu 4610447Snilay@cs.wisc.educlass Packet; 4710447Snilay@cs.wisc.educlass MemTest : public MemObject 4810447Snilay@cs.wisc.edu{ 4910447Snilay@cs.wisc.edu public: 5010447Snilay@cs.wisc.edu typedef MemTestParams Params; 5110447Snilay@cs.wisc.edu MemTest(const Params *p); 5210447Snilay@cs.wisc.edu 5310447Snilay@cs.wisc.edu virtual void init(); 5410447Snilay@cs.wisc.edu 5510447Snilay@cs.wisc.edu // register statistics 5610447Snilay@cs.wisc.edu virtual void regStats(); 5710447Snilay@cs.wisc.edu 5810447Snilay@cs.wisc.edu inline Tick ticks(int numCycles) const { return numCycles; } 5910447Snilay@cs.wisc.edu 6010447Snilay@cs.wisc.edu // main simulation loop (one cycle) 6110447Snilay@cs.wisc.edu void tick(); 6210447Snilay@cs.wisc.edu 6310447Snilay@cs.wisc.edu virtual Port *getPort(const std::string &if_name, int idx = -1); 6410447Snilay@cs.wisc.edu 6510447Snilay@cs.wisc.edu void printAddr(Addr a); 6610447Snilay@cs.wisc.edu 6710447Snilay@cs.wisc.edu protected: 6810447Snilay@cs.wisc.edu class TickEvent : public Event 6910447Snilay@cs.wisc.edu { 7010447Snilay@cs.wisc.edu private: 7110447Snilay@cs.wisc.edu MemTest *cpu; 7210447Snilay@cs.wisc.edu public: 7310447Snilay@cs.wisc.edu TickEvent(MemTest *c) 7410447Snilay@cs.wisc.edu : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {} 7510447Snilay@cs.wisc.edu void process() {cpu->tick();} 7610447Snilay@cs.wisc.edu virtual const char *description() { return "MemTest tick"; } 7710447Snilay@cs.wisc.edu }; 7810447Snilay@cs.wisc.edu 7910447Snilay@cs.wisc.edu TickEvent tickEvent; 8010447Snilay@cs.wisc.edu 8110447Snilay@cs.wisc.edu class CpuPort : public Port 8210447Snilay@cs.wisc.edu { 8310447Snilay@cs.wisc.edu MemTest *memtest; 8410447Snilay@cs.wisc.edu 8510447Snilay@cs.wisc.edu public: 8610447Snilay@cs.wisc.edu 8710447Snilay@cs.wisc.edu CpuPort(const std::string &_name, MemTest *_memtest) 8810447Snilay@cs.wisc.edu : Port(_name, _memtest), memtest(_memtest) 8910447Snilay@cs.wisc.edu { } 9010447Snilay@cs.wisc.edu 9110447Snilay@cs.wisc.edu bool snoopRangeSent; 9210447Snilay@cs.wisc.edu 9310447Snilay@cs.wisc.edu protected: 9410447Snilay@cs.wisc.edu 9510447Snilay@cs.wisc.edu virtual bool recvTiming(PacketPtr pkt); 9610447Snilay@cs.wisc.edu 9710447Snilay@cs.wisc.edu virtual Tick recvAtomic(PacketPtr pkt); 9810447Snilay@cs.wisc.edu 9910447Snilay@cs.wisc.edu virtual void recvFunctional(PacketPtr pkt); 10010447Snilay@cs.wisc.edu 10110447Snilay@cs.wisc.edu virtual void recvStatusChange(Status status); 10210447Snilay@cs.wisc.edu 10310447Snilay@cs.wisc.edu virtual void recvRetry(); 10410447Snilay@cs.wisc.edu 10510447Snilay@cs.wisc.edu virtual void getDeviceAddressRanges(AddrRangeList &resp, 10610447Snilay@cs.wisc.edu bool &snoop) 10710447Snilay@cs.wisc.edu { resp.clear(); snoop = false; } 10810447Snilay@cs.wisc.edu }; 10910447Snilay@cs.wisc.edu 11010447Snilay@cs.wisc.edu CpuPort cachePort; 11110447Snilay@cs.wisc.edu CpuPort funcPort; 11210447Snilay@cs.wisc.edu 11310447Snilay@cs.wisc.edu bool snoopRangeSent; 11410447Snilay@cs.wisc.edu 11510447Snilay@cs.wisc.edu class MemTestSenderState : public Packet::SenderState 11610447Snilay@cs.wisc.edu { 11710447Snilay@cs.wisc.edu public: 11810447Snilay@cs.wisc.edu /** Constructor. */ 11910447Snilay@cs.wisc.edu MemTestSenderState(uint8_t *_data) 12010447Snilay@cs.wisc.edu : data(_data) 12110447Snilay@cs.wisc.edu { } 12210447Snilay@cs.wisc.edu 12310447Snilay@cs.wisc.edu // Hold onto data pointer 12410447Snilay@cs.wisc.edu uint8_t *data; 12510447Snilay@cs.wisc.edu }; 12610447Snilay@cs.wisc.edu 12710447Snilay@cs.wisc.edu PacketPtr retryPkt; 12810447Snilay@cs.wisc.edu 12910447Snilay@cs.wisc.edu bool accessRetry; 13010447Snilay@cs.wisc.edu 13110447Snilay@cs.wisc.edu unsigned size; // size of testing memory region 13210447Snilay@cs.wisc.edu 13310447Snilay@cs.wisc.edu unsigned percentReads; // target percentage of read accesses 13410447Snilay@cs.wisc.edu unsigned percentFunctional; // target percentage of functional accesses 13510447Snilay@cs.wisc.edu unsigned percentUncacheable; 13610447Snilay@cs.wisc.edu 13710447Snilay@cs.wisc.edu int id; 13810447Snilay@cs.wisc.edu 13910447Snilay@cs.wisc.edu std::set<unsigned> outstandingAddrs; 14010447Snilay@cs.wisc.edu 14110447Snilay@cs.wisc.edu unsigned blockSize; 14210447Snilay@cs.wisc.edu 14310447Snilay@cs.wisc.edu Addr blockAddrMask; 14410447Snilay@cs.wisc.edu 14510447Snilay@cs.wisc.edu Addr blockAddr(Addr addr) 14610447Snilay@cs.wisc.edu { 14710447Snilay@cs.wisc.edu return (addr & ~blockAddrMask); 14810447Snilay@cs.wisc.edu } 14910447Snilay@cs.wisc.edu 15010447Snilay@cs.wisc.edu Addr traceBlockAddr; 15110447Snilay@cs.wisc.edu 15210447Snilay@cs.wisc.edu Addr baseAddr1; // fix this to option 15310447Snilay@cs.wisc.edu Addr baseAddr2; // fix this to option 15410447Snilay@cs.wisc.edu Addr uncacheAddr; 15510447Snilay@cs.wisc.edu 15610447Snilay@cs.wisc.edu unsigned progressInterval; // frequency of progress reports 15710447Snilay@cs.wisc.edu Tick nextProgressMessage; // access # for next progress report 15810447Snilay@cs.wisc.edu 15910447Snilay@cs.wisc.edu unsigned percentSourceUnaligned; 16010447Snilay@cs.wisc.edu unsigned percentDestUnaligned; 16110447Snilay@cs.wisc.edu 16210447Snilay@cs.wisc.edu Tick noResponseCycles; 16310447Snilay@cs.wisc.edu 16410447Snilay@cs.wisc.edu uint64_t numReads; 16510447Snilay@cs.wisc.edu uint64_t maxLoads; 16610447Snilay@cs.wisc.edu 16710447Snilay@cs.wisc.edu bool atomic; 16810447Snilay@cs.wisc.edu 16910447Snilay@cs.wisc.edu Stats::Scalar<> numReadsStat; 17010447Snilay@cs.wisc.edu Stats::Scalar<> numWritesStat; 17110447Snilay@cs.wisc.edu Stats::Scalar<> numCopiesStat; 17210447Snilay@cs.wisc.edu 17310447Snilay@cs.wisc.edu // called by MemCompleteEvent::process() 17410447Snilay@cs.wisc.edu void completeRequest(PacketPtr pkt); 17510447Snilay@cs.wisc.edu 17610447Snilay@cs.wisc.edu void sendPkt(PacketPtr pkt); 17710447Snilay@cs.wisc.edu 17810447Snilay@cs.wisc.edu void doRetry(); 17910447Snilay@cs.wisc.edu 18010447Snilay@cs.wisc.edu friend class MemCompleteEvent; 18110447Snilay@cs.wisc.edu}; 18210447Snilay@cs.wisc.edu 18310447Snilay@cs.wisc.edu#endif // __CPU_MEMTEST_MEMTEST_HH__ 18410447Snilay@cs.wisc.edu 18510447Snilay@cs.wisc.edu 18610447Snilay@cs.wisc.edu 18710447Snilay@cs.wisc.edu