memtest.hh revision 3187
19651SAndreas.Sandberg@ARM.com/* 29651SAndreas.Sandberg@ARM.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 39651SAndreas.Sandberg@ARM.com * All rights reserved. 49651SAndreas.Sandberg@ARM.com * 59651SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without 69651SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are 79651SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright 89651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer; 99651SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright 109651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the 119651SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution; 129651SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its 139651SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from 149651SAndreas.Sandberg@ARM.com * this software without specific prior written permission. 159651SAndreas.Sandberg@ARM.com * 169651SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179651SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189651SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199651SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209651SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219651SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229651SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239651SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249651SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259651SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269651SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279651SAndreas.Sandberg@ARM.com * 289651SAndreas.Sandberg@ARM.com * Authors: Erik Hallnor 299651SAndreas.Sandberg@ARM.com * Steve Reinhardt 309651SAndreas.Sandberg@ARM.com */ 319651SAndreas.Sandberg@ARM.com 329651SAndreas.Sandberg@ARM.com#ifndef __CPU_MEMTEST_MEMTEST_HH__ 339651SAndreas.Sandberg@ARM.com#define __CPU_MEMTEST_MEMTEST_HH__ 349651SAndreas.Sandberg@ARM.com 359651SAndreas.Sandberg@ARM.com#include <set> 369651SAndreas.Sandberg@ARM.com 379651SAndreas.Sandberg@ARM.com#include "base/statistics.hh" 389651SAndreas.Sandberg@ARM.com//#include "mem/functional/functional.hh" 399651SAndreas.Sandberg@ARM.com//#include "mem/mem_interface.hh" 409651SAndreas.Sandberg@ARM.com#include "sim/eventq.hh" 419651SAndreas.Sandberg@ARM.com#include "sim/sim_exit.hh" 429651SAndreas.Sandberg@ARM.com#include "sim/sim_object.hh" 439651SAndreas.Sandberg@ARM.com#include "sim/stats.hh" 449651SAndreas.Sandberg@ARM.com#include "mem/mem_object.hh" 459651SAndreas.Sandberg@ARM.com#include "mem/port.hh" 469651SAndreas.Sandberg@ARM.com 479651SAndreas.Sandberg@ARM.comclass Packet; 489651SAndreas.Sandberg@ARM.comclass MemTest : public MemObject 499651SAndreas.Sandberg@ARM.com{ 509651SAndreas.Sandberg@ARM.com public: 519683Sandreas@sandberg.pp.se 529651SAndreas.Sandberg@ARM.com MemTest(const std::string &name, 539651SAndreas.Sandberg@ARM.com// MemInterface *_cache_interface, 549651SAndreas.Sandberg@ARM.com// PhysicalMemory *main_mem, 559651SAndreas.Sandberg@ARM.com// PhysicalMemory *check_mem, 569651SAndreas.Sandberg@ARM.com unsigned _memorySize, 579651SAndreas.Sandberg@ARM.com unsigned _percentReads, 589651SAndreas.Sandberg@ARM.com// unsigned _percentCopies, 599651SAndreas.Sandberg@ARM.com unsigned _percentUncacheable, 609651SAndreas.Sandberg@ARM.com unsigned _progressInterval, 619651SAndreas.Sandberg@ARM.com unsigned _percentSourceUnaligned, 629651SAndreas.Sandberg@ARM.com unsigned _percentDestUnaligned, 639651SAndreas.Sandberg@ARM.com Addr _traceAddr, 649651SAndreas.Sandberg@ARM.com Counter _max_loads); 659651SAndreas.Sandberg@ARM.com 669651SAndreas.Sandberg@ARM.com virtual void init(); 679651SAndreas.Sandberg@ARM.com 689651SAndreas.Sandberg@ARM.com // register statistics 699651SAndreas.Sandberg@ARM.com virtual void regStats(); 709651SAndreas.Sandberg@ARM.com 719651SAndreas.Sandberg@ARM.com inline Tick cycles(int numCycles) const { return numCycles; } 729651SAndreas.Sandberg@ARM.com 739651SAndreas.Sandberg@ARM.com // main simulation loop (one cycle) 749651SAndreas.Sandberg@ARM.com void tick(); 759651SAndreas.Sandberg@ARM.com 769652SAndreas.Sandberg@ARM.com virtual Port *getPort(const std::string &if_name, int idx = -1); 779652SAndreas.Sandberg@ARM.com 789651SAndreas.Sandberg@ARM.com protected: 799651SAndreas.Sandberg@ARM.com class TickEvent : public Event 809651SAndreas.Sandberg@ARM.com { 819651SAndreas.Sandberg@ARM.com private: 829655SAndreas.Sandberg@ARM.com MemTest *cpu; 839752Sandreas@sandberg.pp.se public: 849752Sandreas@sandberg.pp.se TickEvent(MemTest *c) 859651SAndreas.Sandberg@ARM.com : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) {} 869651SAndreas.Sandberg@ARM.com void process() {cpu->tick();} 879651SAndreas.Sandberg@ARM.com virtual const char *description() { return "tick event"; } 889651SAndreas.Sandberg@ARM.com }; 899651SAndreas.Sandberg@ARM.com 909651SAndreas.Sandberg@ARM.com TickEvent tickEvent; 919651SAndreas.Sandberg@ARM.com class CpuPort : public Port 929651SAndreas.Sandberg@ARM.com { 939651SAndreas.Sandberg@ARM.com 949651SAndreas.Sandberg@ARM.com MemTest *memtest; 959651SAndreas.Sandberg@ARM.com 969651SAndreas.Sandberg@ARM.com public: 979651SAndreas.Sandberg@ARM.com 989651SAndreas.Sandberg@ARM.com CpuPort(const std::string &_name, MemTest *_memtest) 999655SAndreas.Sandberg@ARM.com : Port(_name), memtest(_memtest) 1009655SAndreas.Sandberg@ARM.com { } 1019655SAndreas.Sandberg@ARM.com 1029655SAndreas.Sandberg@ARM.com protected: 1039655SAndreas.Sandberg@ARM.com 1049655SAndreas.Sandberg@ARM.com virtual bool recvTiming(Packet *pkt); 1059655SAndreas.Sandberg@ARM.com 1069655SAndreas.Sandberg@ARM.com virtual Tick recvAtomic(Packet *pkt); 1079655SAndreas.Sandberg@ARM.com 1089651SAndreas.Sandberg@ARM.com virtual void recvFunctional(Packet *pkt); 1099651SAndreas.Sandberg@ARM.com 1109651SAndreas.Sandberg@ARM.com virtual void recvStatusChange(Status status); 1119651SAndreas.Sandberg@ARM.com 1129651SAndreas.Sandberg@ARM.com virtual void recvRetry(); 1139651SAndreas.Sandberg@ARM.com 1149651SAndreas.Sandberg@ARM.com virtual void getDeviceAddressRanges(AddrRangeList &resp, 1159651SAndreas.Sandberg@ARM.com AddrRangeList &snoop) 1169651SAndreas.Sandberg@ARM.com { resp.clear(); snoop.clear(); } 1179651SAndreas.Sandberg@ARM.com }; 1189651SAndreas.Sandberg@ARM.com 1199651SAndreas.Sandberg@ARM.com CpuPort cachePort; 1209651SAndreas.Sandberg@ARM.com CpuPort funcPort; 1219651SAndreas.Sandberg@ARM.com 1229651SAndreas.Sandberg@ARM.com class MemTestSenderState : public Packet::SenderState 1239651SAndreas.Sandberg@ARM.com { 1249651SAndreas.Sandberg@ARM.com public: 1259651SAndreas.Sandberg@ARM.com /** Constructor. */ 1269651SAndreas.Sandberg@ARM.com MemTestSenderState(uint8_t *_data) 1279651SAndreas.Sandberg@ARM.com : data(_data) 1289651SAndreas.Sandberg@ARM.com { } 1299651SAndreas.Sandberg@ARM.com 1309651SAndreas.Sandberg@ARM.com // Hold onto data pointer 1319651SAndreas.Sandberg@ARM.com uint8_t *data; 1329651SAndreas.Sandberg@ARM.com }; 1339651SAndreas.Sandberg@ARM.com 1349651SAndreas.Sandberg@ARM.com// Request *dataReq; 1359651SAndreas.Sandberg@ARM.com Packet *retryPkt; 1369651SAndreas.Sandberg@ARM.com// MemInterface *cacheInterface; 1379690Sandreas@sandberg.pp.se// PhysicalMemory *mainMem; 1389690Sandreas@sandberg.pp.se// PhysicalMemory *checkMem; 1399690Sandreas@sandberg.pp.se// SimpleThread *thread; 1409651SAndreas.Sandberg@ARM.com 1419651SAndreas.Sandberg@ARM.com bool accessRetry; 1429651SAndreas.Sandberg@ARM.com 1439651SAndreas.Sandberg@ARM.com unsigned size; // size of testing memory region 1449651SAndreas.Sandberg@ARM.com 1459651SAndreas.Sandberg@ARM.com unsigned percentReads; // target percentage of read accesses 1469651SAndreas.Sandberg@ARM.com// unsigned percentCopies; // target percentage of copy accesses 1479651SAndreas.Sandberg@ARM.com unsigned percentUncacheable; 1489651SAndreas.Sandberg@ARM.com 1499651SAndreas.Sandberg@ARM.com int id; 1509651SAndreas.Sandberg@ARM.com 1519651SAndreas.Sandberg@ARM.com std::set<unsigned> outstandingAddrs; 1529651SAndreas.Sandberg@ARM.com 1539651SAndreas.Sandberg@ARM.com unsigned blockSize; 1549651SAndreas.Sandberg@ARM.com 1559651SAndreas.Sandberg@ARM.com Addr blockAddrMask; 1569651SAndreas.Sandberg@ARM.com 1579651SAndreas.Sandberg@ARM.com Addr blockAddr(Addr addr) 1589651SAndreas.Sandberg@ARM.com { 1599651SAndreas.Sandberg@ARM.com return (addr & ~blockAddrMask); 1609651SAndreas.Sandberg@ARM.com } 1619651SAndreas.Sandberg@ARM.com 1629651SAndreas.Sandberg@ARM.com Addr traceBlockAddr; 1639651SAndreas.Sandberg@ARM.com 1649651SAndreas.Sandberg@ARM.com Addr baseAddr1; // fix this to option 1659651SAndreas.Sandberg@ARM.com Addr baseAddr2; // fix this to option 1669690Sandreas@sandberg.pp.se Addr uncacheAddr; 1679690Sandreas@sandberg.pp.se 1689690Sandreas@sandberg.pp.se unsigned progressInterval; // frequency of progress reports 1699651SAndreas.Sandberg@ARM.com Tick nextProgressMessage; // access # for next progress report 1709651SAndreas.Sandberg@ARM.com 1719651SAndreas.Sandberg@ARM.com unsigned percentSourceUnaligned; 1729651SAndreas.Sandberg@ARM.com unsigned percentDestUnaligned; 1739651SAndreas.Sandberg@ARM.com 1749651SAndreas.Sandberg@ARM.com Tick noResponseCycles; 1759732Sandreas@sandberg.pp.se 1769732Sandreas@sandberg.pp.se uint64_t numReads; 1779651SAndreas.Sandberg@ARM.com uint64_t maxLoads; 1789651SAndreas.Sandberg@ARM.com Stats::Scalar<> numReadsStat; 1799651SAndreas.Sandberg@ARM.com Stats::Scalar<> numWritesStat; 1809651SAndreas.Sandberg@ARM.com Stats::Scalar<> numCopiesStat; 1819651SAndreas.Sandberg@ARM.com 1829651SAndreas.Sandberg@ARM.com // called by MemCompleteEvent::process() 1839651SAndreas.Sandberg@ARM.com void completeRequest(Packet *pkt); 1849651SAndreas.Sandberg@ARM.com 1859651SAndreas.Sandberg@ARM.com void doRetry(); 1869684Sandreas@sandberg.pp.se 1879684Sandreas@sandberg.pp.se friend class MemCompleteEvent; 1889684Sandreas@sandberg.pp.se}; 1899684Sandreas@sandberg.pp.se 1909684Sandreas@sandberg.pp.se#endif // __CPU_MEMTEST_MEMTEST_HH__ 1919651SAndreas.Sandberg@ARM.com 1929651SAndreas.Sandberg@ARM.com 1939651SAndreas.Sandberg@ARM.com 1949651SAndreas.Sandberg@ARM.com