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