memtest.hh revision 3262
19243SN/A/* 210889Sandreas.hansson@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 39243SN/A * All rights reserved. 49243SN/A * 59243SN/A * Redistribution and use in source and binary forms, with or without 69243SN/A * modification, are permitted provided that the following conditions are 79243SN/A * met: redistributions of source code must retain the above copyright 89243SN/A * notice, this list of conditions and the following disclaimer; 99243SN/A * redistributions in binary form must reproduce the above copyright 109243SN/A * notice, this list of conditions and the following disclaimer in the 119243SN/A * documentation and/or other materials provided with the distribution; 129243SN/A * neither the name of the copyright holders nor the names of its 139243SN/A * contributors may be used to endorse or promote products derived from 149831SN/A * this software without specific prior written permission. 159831SN/A * 169831SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179243SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189243SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199243SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209243SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219243SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229243SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239243SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249243SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259243SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269243SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279243SN/A * 289243SN/A * Authors: Erik Hallnor 299243SN/A * Steve Reinhardt 309243SN/A */ 319243SN/A 329243SN/A#ifndef __CPU_MEMTEST_MEMTEST_HH__ 339243SN/A#define __CPU_MEMTEST_MEMTEST_HH__ 349243SN/A 359243SN/A#include <set> 369243SN/A 379243SN/A#include "base/statistics.hh" 389243SN/A//#include "mem/functional/functional.hh" 399243SN/A//#include "mem/mem_interface.hh" 409243SN/A#include "sim/eventq.hh" 419243SN/A#include "sim/sim_exit.hh" 429967SN/A#include "sim/sim_object.hh" 4310618SOmar.Naji@arm.com#include "sim/stats.hh" 449243SN/A#include "mem/mem_object.hh" 459243SN/A#include "mem/port.hh" 4610146Sandreas.hansson@arm.com 479356SN/Aclass Packet; 4810146Sandreas.hansson@arm.comclass MemTest : public MemObject 4910247Sandreas.hansson@arm.com{ 5010208Sandreas.hansson@arm.com public: 519352SN/A 5210146Sandreas.hansson@arm.com MemTest(const std::string &name, 539814SN/A// MemInterface *_cache_interface, 549243SN/A// PhysicalMemory *main_mem, 559243SN/A// PhysicalMemory *check_mem, 5610432SOmar.Naji@arm.com unsigned _memorySize, 579243SN/A unsigned _percentReads, 5810146Sandreas.hansson@arm.com// unsigned _percentCopies, 599243SN/A unsigned _percentUncacheable, 6010619Sandreas.hansson@arm.com unsigned _progressInterval, 619243SN/A unsigned _percentSourceUnaligned, 6210211Sandreas.hansson@arm.com unsigned _percentDestUnaligned, 6310618SOmar.Naji@arm.com Addr _traceAddr, 6410208Sandreas.hansson@arm.com Counter _max_loads, 6510489SOmar.Naji@arm.com bool _atomic); 669831SN/A 679831SN/A virtual void init(); 689831SN/A 699831SN/A // register statistics 709831SN/A virtual void regStats(); 7110140SN/A 7210646Sandreas.hansson@arm.com inline Tick cycles(int numCycles) const { return numCycles; } 739243SN/A 7410394Swendy.elsasser@arm.com // main simulation loop (one cycle) 7510394Swendy.elsasser@arm.com void tick(); 769566SN/A 779243SN/A virtual Port *getPort(const std::string &if_name, int idx = -1); 789243SN/A 7910140SN/A protected: 8010140SN/A class TickEvent : public Event 8110147Sandreas.hansson@arm.com { 8210147Sandreas.hansson@arm.com private: 8310393Swendy.elsasser@arm.com MemTest *cpu; 8410394Swendy.elsasser@arm.com public: 8510394Swendy.elsasser@arm.com TickEvent(MemTest *c) 8610394Swendy.elsasser@arm.com : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {} 879243SN/A void process() {cpu->tick();} 889243SN/A virtual const char *description() { return "tick event"; } 8910141SN/A }; 909726SN/A 919726SN/A TickEvent tickEvent; 9210618SOmar.Naji@arm.com class CpuPort : public Port 9310618SOmar.Naji@arm.com { 949243SN/A 9510620Sandreas.hansson@arm.com MemTest *memtest; 9610620Sandreas.hansson@arm.com 9710620Sandreas.hansson@arm.com public: 9810620Sandreas.hansson@arm.com 9910620Sandreas.hansson@arm.com CpuPort(const std::string &_name, MemTest *_memtest) 10010889Sandreas.hansson@arm.com : Port(_name), memtest(_memtest) 10110889Sandreas.hansson@arm.com { } 10210889Sandreas.hansson@arm.com 10310618SOmar.Naji@arm.com protected: 10410618SOmar.Naji@arm.com 10510618SOmar.Naji@arm.com virtual bool recvTiming(Packet *pkt); 10610432SOmar.Naji@arm.com 10710618SOmar.Naji@arm.com virtual Tick recvAtomic(Packet *pkt); 10810618SOmar.Naji@arm.com 10910618SOmar.Naji@arm.com virtual void recvFunctional(Packet *pkt); 11010432SOmar.Naji@arm.com 11110246Sandreas.hansson@arm.com virtual void recvStatusChange(Status status); 11210618SOmar.Naji@arm.com 11310561SOmar.Naji@arm.com virtual void recvRetry(); 11410561SOmar.Naji@arm.com 11510561SOmar.Naji@arm.com virtual void getDeviceAddressRanges(AddrRangeList &resp, 11610394Swendy.elsasser@arm.com AddrRangeList &snoop) 11710394Swendy.elsasser@arm.com { resp.clear(); snoop.clear(); snoop.push_back(RangeSize(0,-1)); } 11810394Swendy.elsasser@arm.com }; 11910394Swendy.elsasser@arm.com 12010394Swendy.elsasser@arm.com CpuPort cachePort; 12110394Swendy.elsasser@arm.com CpuPort funcPort; 12210394Swendy.elsasser@arm.com 12310394Swendy.elsasser@arm.com class MemTestSenderState : public Packet::SenderState 12410618SOmar.Naji@arm.com { 12510394Swendy.elsasser@arm.com public: 12610394Swendy.elsasser@arm.com /** Constructor. */ 12710618SOmar.Naji@arm.com MemTestSenderState(uint8_t *_data) 12810394Swendy.elsasser@arm.com : data(_data) 12910246Sandreas.hansson@arm.com { } 13010246Sandreas.hansson@arm.com 13110246Sandreas.hansson@arm.com // Hold onto data pointer 13210140SN/A uint8_t *data; 13310140SN/A }; 13410140SN/A 13510140SN/A// Request *dataReq; 13610140SN/A Packet *retryPkt; 1379243SN/A// MemInterface *cacheInterface; 1389243SN/A// PhysicalMemory *mainMem; 1399567SN/A// PhysicalMemory *checkMem; 1409243SN/A// SimpleThread *thread; 14110489SOmar.Naji@arm.com 14210489SOmar.Naji@arm.com bool accessRetry; 14310489SOmar.Naji@arm.com 14410489SOmar.Naji@arm.com unsigned size; // size of testing memory region 14510489SOmar.Naji@arm.com 14610489SOmar.Naji@arm.com unsigned percentReads; // target percentage of read accesses 14710489SOmar.Naji@arm.com// unsigned percentCopies; // target percentage of copy accesses 14810489SOmar.Naji@arm.com unsigned percentUncacheable; 14910489SOmar.Naji@arm.com 15010489SOmar.Naji@arm.com int id; 1519243SN/A 1529243SN/A std::set<unsigned> outstandingAddrs; 1539831SN/A 1549831SN/A unsigned blockSize; 1559831SN/A 1569831SN/A Addr blockAddrMask; 1579831SN/A 1589243SN/A Addr blockAddr(Addr addr) 15910207Sandreas.hansson@arm.com { 16010207Sandreas.hansson@arm.com return (addr & ~blockAddrMask); 16110207Sandreas.hansson@arm.com } 16210207Sandreas.hansson@arm.com 16310207Sandreas.hansson@arm.com Addr traceBlockAddr; 16410394Swendy.elsasser@arm.com 16510394Swendy.elsasser@arm.com Addr baseAddr1; // fix this to option 16610394Swendy.elsasser@arm.com Addr baseAddr2; // fix this to option 16710394Swendy.elsasser@arm.com Addr uncacheAddr; 16810394Swendy.elsasser@arm.com 16910394Swendy.elsasser@arm.com unsigned progressInterval; // frequency of progress reports 17010394Swendy.elsasser@arm.com Tick nextProgressMessage; // access # for next progress report 17110394Swendy.elsasser@arm.com 17210394Swendy.elsasser@arm.com unsigned percentSourceUnaligned; 17310394Swendy.elsasser@arm.com unsigned percentDestUnaligned; 17410394Swendy.elsasser@arm.com 17510394Swendy.elsasser@arm.com Tick noResponseCycles; 17610394Swendy.elsasser@arm.com 17710394Swendy.elsasser@arm.com uint64_t numReads; 17810394Swendy.elsasser@arm.com uint64_t maxLoads; 17910394Swendy.elsasser@arm.com 18010394Swendy.elsasser@arm.com bool atomic; 18110394Swendy.elsasser@arm.com 18210394Swendy.elsasser@arm.com Stats::Scalar<> numReadsStat; 18310394Swendy.elsasser@arm.com Stats::Scalar<> numWritesStat; 18410394Swendy.elsasser@arm.com Stats::Scalar<> numCopiesStat; 18510394Swendy.elsasser@arm.com 18610561SOmar.Naji@arm.com // called by MemCompleteEvent::process() 18710561SOmar.Naji@arm.com void completeRequest(Packet *pkt); 18810394Swendy.elsasser@arm.com 18910394Swendy.elsasser@arm.com void sendPkt(Packet *pkt); 19010394Swendy.elsasser@arm.com 19110394Swendy.elsasser@arm.com void doRetry(); 19210394Swendy.elsasser@arm.com 19310394Swendy.elsasser@arm.com friend class MemCompleteEvent; 1949243SN/A}; 1959243SN/A 1969243SN/A#endif // __CPU_MEMTEST_MEMTEST_HH__ 19710146Sandreas.hansson@arm.com 19810140SN/A 19910466Sandreas.hansson@arm.com 20010466Sandreas.hansson@arm.com