ruby_mem_test.py revision 8437:94c7423ecd87
17322Sgblack@eecs.umich.edu# Copyright (c) 2006-2007 The Regents of The University of Michigan 27322Sgblack@eecs.umich.edu# Copyright (c) 2009 Advanced Micro Devices, Inc. 310037SARM gem5 Developers# All rights reserved. 47322Sgblack@eecs.umich.edu# 57322Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 67322Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 77322Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 87322Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 97322Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 107322Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 117322Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 127322Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 137322Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 147322Sgblack@eecs.umich.edu# this software without specific prior written permission. 157322Sgblack@eecs.umich.edu# 167322Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177322Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187322Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197322Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207322Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217322Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227322Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237322Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247322Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257322Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267322Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277322Sgblack@eecs.umich.edu# 287322Sgblack@eecs.umich.edu# Authors: Ron Dreslinski 297322Sgblack@eecs.umich.edu# Brad Beckmann 307322Sgblack@eecs.umich.edu 317322Sgblack@eecs.umich.eduimport m5 327322Sgblack@eecs.umich.edufrom m5.objects import * 337322Sgblack@eecs.umich.edufrom m5.defines import buildEnv 347322Sgblack@eecs.umich.edufrom m5.util import addToPath 357322Sgblack@eecs.umich.eduimport os, optparse, sys 367322Sgblack@eecs.umich.eduaddToPath('../common') 377322Sgblack@eecs.umich.eduaddToPath('../ruby') 387322Sgblack@eecs.umich.edu 397322Sgblack@eecs.umich.eduimport Ruby 407376Sgblack@eecs.umich.edu 417376Sgblack@eecs.umich.eduif buildEnv['FULL_SYSTEM']: 427376Sgblack@eecs.umich.edu panic("This script requires system-emulation mode (*_SE).") 437376Sgblack@eecs.umich.edu 447376Sgblack@eecs.umich.edu# Get paths we might need. It's expected this file is in m5/configs/example. 457376Sgblack@eecs.umich.educonfig_path = os.path.dirname(os.path.abspath(__file__)) 467376Sgblack@eecs.umich.educonfig_root = os.path.dirname(config_path) 477376Sgblack@eecs.umich.edum5_root = os.path.dirname(config_root) 487376Sgblack@eecs.umich.edu 497376Sgblack@eecs.umich.eduparser = optparse.OptionParser() 507376Sgblack@eecs.umich.edu 517376Sgblack@eecs.umich.eduparser.add_option("-l", "--maxloads", metavar="N", default=0, 527376Sgblack@eecs.umich.edu help="Stop after N loads") 537376Sgblack@eecs.umich.eduparser.add_option("--progress", type="int", default=1000, 547376Sgblack@eecs.umich.edu metavar="NLOADS", 557376Sgblack@eecs.umich.edu help="Progress message interval " 567376Sgblack@eecs.umich.edu "[default: %default]") 577376Sgblack@eecs.umich.eduparser.add_option("--num-dmas", type="int", default=0, help="# of dma testers") 587376Sgblack@eecs.umich.eduparser.add_option("--functional", type="int", default=0, 597376Sgblack@eecs.umich.edu help="percentage of accesses that should be functional") 607376Sgblack@eecs.umich.eduparser.add_option("--suppress-func-warnings", action="store_true", 617376Sgblack@eecs.umich.edu help="suppress warnings when functional accesses fail") 627376Sgblack@eecs.umich.edu 637376Sgblack@eecs.umich.edu# 647376Sgblack@eecs.umich.edu# Add the ruby specific and protocol specific options 657376Sgblack@eecs.umich.edu# 667376Sgblack@eecs.umich.eduRuby.define_options(parser) 677376Sgblack@eecs.umich.edu 687376Sgblack@eecs.umich.eduexecfile(os.path.join(config_root, "common", "Options.py")) 697376Sgblack@eecs.umich.edu 707376Sgblack@eecs.umich.edu(options, args) = parser.parse_args() 717376Sgblack@eecs.umich.edu 727376Sgblack@eecs.umich.edu# 737376Sgblack@eecs.umich.edu# Set the default cache size and associativity to be very small to encourage 747376Sgblack@eecs.umich.edu# races between requests and writebacks. 757376Sgblack@eecs.umich.edu# 767376Sgblack@eecs.umich.eduoptions.l1d_size="256B" 777376Sgblack@eecs.umich.eduoptions.l1i_size="256B" 787376Sgblack@eecs.umich.eduoptions.l2_size="512B" 797376Sgblack@eecs.umich.eduoptions.l3_size="1kB" 807376Sgblack@eecs.umich.eduoptions.l1d_assoc=2 817376Sgblack@eecs.umich.eduoptions.l1i_assoc=2 827376Sgblack@eecs.umich.eduoptions.l2_assoc=2 837376Sgblack@eecs.umich.eduoptions.l3_assoc=2 847376Sgblack@eecs.umich.edu 857376Sgblack@eecs.umich.eduif args: 867376Sgblack@eecs.umich.edu print "Error: script doesn't take any positional arguments" 877376Sgblack@eecs.umich.edu sys.exit(1) 887376Sgblack@eecs.umich.edu 897376Sgblack@eecs.umich.edublock_size = 64 907376Sgblack@eecs.umich.edu 917376Sgblack@eecs.umich.eduif options.num_cpus > block_size: 927376Sgblack@eecs.umich.edu print "Error: Number of testers %d limited to %d because of false sharing" \ 937376Sgblack@eecs.umich.edu % (options.num_cpus, block_size) 947376Sgblack@eecs.umich.edu sys.exit(1) 957376Sgblack@eecs.umich.edu 967376Sgblack@eecs.umich.edu# 977376Sgblack@eecs.umich.edu# Currently ruby does not support atomic or uncacheable accesses 987376Sgblack@eecs.umich.edu# 997376Sgblack@eecs.umich.educpus = [ MemTest(atomic = False, 1007376Sgblack@eecs.umich.edu max_loads = options.maxloads, 1017376Sgblack@eecs.umich.edu issue_dmas = False, 1027376Sgblack@eecs.umich.edu percent_functional = options.functional, 1037376Sgblack@eecs.umich.edu percent_uncacheable = 0, 1047376Sgblack@eecs.umich.edu progress_interval = options.progress, 1057376Sgblack@eecs.umich.edu suppress_func_warnings = options.suppress_func_warnings) \ 1067376Sgblack@eecs.umich.edu for i in xrange(options.num_cpus) ] 1077376Sgblack@eecs.umich.edu 1087376Sgblack@eecs.umich.edusystem = System(cpu = cpus, 1097376Sgblack@eecs.umich.edu funcmem = PhysicalMemory(), 1107376Sgblack@eecs.umich.edu physmem = PhysicalMemory()) 1117376Sgblack@eecs.umich.edu 1127376Sgblack@eecs.umich.eduif options.num_dmas > 0: 1137376Sgblack@eecs.umich.edu dmas = [ MemTest(atomic = False, 1147376Sgblack@eecs.umich.edu max_loads = options.maxloads, 1157376Sgblack@eecs.umich.edu issue_dmas = True, 1167376Sgblack@eecs.umich.edu percent_functional = 0, 1177376Sgblack@eecs.umich.edu percent_uncacheable = 0, 1187376Sgblack@eecs.umich.edu progress_interval = options.progress, 1197376Sgblack@eecs.umich.edu warn_on_failure = options.warn_on_failure) \ 1207376Sgblack@eecs.umich.edu for i in xrange(options.num_dmas) ] 1217376Sgblack@eecs.umich.edu system.dma_devices = dmas 1227376Sgblack@eecs.umich.eduelse: 1237376Sgblack@eecs.umich.edu dmas = [] 1247376Sgblack@eecs.umich.edu 1257376Sgblack@eecs.umich.eduRuby.create_system(options, system, dma_devices = dmas) 1267376Sgblack@eecs.umich.edu 1277376Sgblack@eecs.umich.edu# 1287376Sgblack@eecs.umich.edu# The tester is most effective when randomization is turned on and 1297376Sgblack@eecs.umich.edu# artifical delay is randomly inserted on messages 1307376Sgblack@eecs.umich.edu# 1317376Sgblack@eecs.umich.edusystem.ruby.randomization = True 1327376Sgblack@eecs.umich.edu 1337376Sgblack@eecs.umich.eduassert(len(cpus) == len(system.ruby._cpu_ruby_ports)) 1347376Sgblack@eecs.umich.edu 1357376Sgblack@eecs.umich.edufor (i, cpu) in enumerate(cpus): 1367376Sgblack@eecs.umich.edu # 1377376Sgblack@eecs.umich.edu # Tie the cpu memtester ports to the correct system ports 1387376Sgblack@eecs.umich.edu # 1397376Sgblack@eecs.umich.edu cpu.test = system.ruby._cpu_ruby_ports[i].port 1407376Sgblack@eecs.umich.edu cpu.functional = system.funcmem.port 1417376Sgblack@eecs.umich.edu 1427376Sgblack@eecs.umich.edu # 1437376Sgblack@eecs.umich.edu # Since the memtester is incredibly bursty, increase the deadlock 1447376Sgblack@eecs.umich.edu # threshold to 5 million cycles 1457376Sgblack@eecs.umich.edu # 1467376Sgblack@eecs.umich.edu system.ruby._cpu_ruby_ports[i].deadlock_threshold = 5000000 1477376Sgblack@eecs.umich.edu 1487376Sgblack@eecs.umich.edu # 1497376Sgblack@eecs.umich.edu # Ruby doesn't need the backing image of memory when running with 1507376Sgblack@eecs.umich.edu # the tester. 1517376Sgblack@eecs.umich.edu # 1527376Sgblack@eecs.umich.edu system.ruby._cpu_ruby_ports[i].access_phys_mem = False 1537376Sgblack@eecs.umich.edu 1547376Sgblack@eecs.umich.edufor (i, dma) in enumerate(dmas): 1557376Sgblack@eecs.umich.edu # 1567376Sgblack@eecs.umich.edu # Tie the dma memtester ports to the correct functional port 1577376Sgblack@eecs.umich.edu # Note that the test port has already been connected to the dma_sequencer 1587376Sgblack@eecs.umich.edu # 1597376Sgblack@eecs.umich.edu dma.functional = system.funcmem.port 1607376Sgblack@eecs.umich.edu 1617376Sgblack@eecs.umich.edu# ----------------------- 1627376Sgblack@eecs.umich.edu# run simulation 1637376Sgblack@eecs.umich.edu# ----------------------- 1647376Sgblack@eecs.umich.edu 1657376Sgblack@eecs.umich.eduroot = Root( system = system ) 1667376Sgblack@eecs.umich.eduroot.system.mem_mode = 'timing' 1677376Sgblack@eecs.umich.edu 1687376Sgblack@eecs.umich.edu# Not much point in this being higher than the L1 latency 1697376Sgblack@eecs.umich.edum5.ticks.setGlobalFrequency('1ns') 1707376Sgblack@eecs.umich.edu 1717376Sgblack@eecs.umich.edu# instantiate configuration 1727376Sgblack@eecs.umich.edum5.instantiate() 1737376Sgblack@eecs.umich.edu 1747376Sgblack@eecs.umich.edu# simulate until program terminates 1757376Sgblack@eecs.umich.eduexit_event = m5.simulate(options.maxtick) 1767376Sgblack@eecs.umich.edu 1777376Sgblack@eecs.umich.eduprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause() 1787376Sgblack@eecs.umich.edu