ruby_direct_test.py revision 7538
18706Sandreas.hansson@arm.com# Copyright (c) 2006-2007 The Regents of The University of Michigan
28706Sandreas.hansson@arm.com# Copyright (c) 2009 Advanced Micro Devices, Inc.
38706Sandreas.hansson@arm.com# All rights reserved.
48706Sandreas.hansson@arm.com#
58706Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without
68706Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are
78706Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright
88706Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer;
98706Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright
108706Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the
118706Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution;
128706Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its
136892SBrad.Beckmann@amd.com# contributors may be used to endorse or promote products derived from
146892SBrad.Beckmann@amd.com# this software without specific prior written permission.
156892SBrad.Beckmann@amd.com#
166892SBrad.Beckmann@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176892SBrad.Beckmann@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186892SBrad.Beckmann@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196892SBrad.Beckmann@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206892SBrad.Beckmann@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216892SBrad.Beckmann@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226892SBrad.Beckmann@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236892SBrad.Beckmann@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246892SBrad.Beckmann@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256892SBrad.Beckmann@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266892SBrad.Beckmann@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276892SBrad.Beckmann@amd.com#
286892SBrad.Beckmann@amd.com# Authors: Ron Dreslinski
296892SBrad.Beckmann@amd.com#          Brad Beckmann
306892SBrad.Beckmann@amd.com
316892SBrad.Beckmann@amd.comimport m5
326892SBrad.Beckmann@amd.comfrom m5.objects import *
336892SBrad.Beckmann@amd.comfrom m5.defines import buildEnv
346892SBrad.Beckmann@amd.comfrom m5.util import addToPath
356892SBrad.Beckmann@amd.comimport os, optparse, sys
366892SBrad.Beckmann@amd.comaddToPath('../common')
376892SBrad.Beckmann@amd.comaddToPath('../ruby')
386892SBrad.Beckmann@amd.com
396892SBrad.Beckmann@amd.comimport Ruby
406892SBrad.Beckmann@amd.com
416892SBrad.Beckmann@amd.comif buildEnv['FULL_SYSTEM']:
427563SBrad.Beckmann@amd.com    panic("This script requires system-emulation mode (*_SE).")
436892SBrad.Beckmann@amd.com
446892SBrad.Beckmann@amd.com# Get paths we might need.  It's expected this file is in m5/configs/example.
456892SBrad.Beckmann@amd.comconfig_path = os.path.dirname(os.path.abspath(__file__))
466892SBrad.Beckmann@amd.comconfig_root = os.path.dirname(config_path)
477538SBrad.Beckmann@amd.comm5_root = os.path.dirname(config_root)
488939SBrad.Beckmann@amd.com
498939SBrad.Beckmann@amd.comparser = optparse.OptionParser()
508939SBrad.Beckmann@amd.com
517538SBrad.Beckmann@amd.comparser.add_option("-l", "--checks", metavar="N", default=100,
527538SBrad.Beckmann@amd.com                  help="Stop after N checks (loads)")
537538SBrad.Beckmann@amd.comparser.add_option("-f", "--wakeup_freq", metavar="N", default=10,
547538SBrad.Beckmann@amd.com                  help="Wakeup every N cycles")
557538SBrad.Beckmann@amd.com
569576Snilay@cs.wisc.edu#
579576Snilay@cs.wisc.edu# Add the ruby specific and protocol specific options
588612Stushar@csail.mit.edu#
598612Stushar@csail.mit.eduRuby.define_options(parser)
607538SBrad.Beckmann@amd.com
617538SBrad.Beckmann@amd.comexecfile(os.path.join(config_root, "common", "Options.py"))
627917SBrad.Beckmann@amd.com
637563SBrad.Beckmann@amd.com(options, args) = parser.parse_args()
647563SBrad.Beckmann@amd.com
657538SBrad.Beckmann@amd.com#
667538SBrad.Beckmann@amd.com# Set the default cache size and associativity to be very small to encourage
677538SBrad.Beckmann@amd.com# races between requests and writebacks.
687538SBrad.Beckmann@amd.com#
697538SBrad.Beckmann@amd.comoptions.l1d_size="256B"
707566SBrad.Beckmann@amd.comoptions.l1i_size="256B"
717566SBrad.Beckmann@amd.comoptions.l2_size="512B"
727809Snilay@cs.wisc.eduoptions.l3_size="1kB"
737809Snilay@cs.wisc.eduoptions.l1d_assoc=2
747809Snilay@cs.wisc.eduoptions.l1i_assoc=2
757809Snilay@cs.wisc.eduoptions.l2_assoc=2
768638Sglohoptions.l3_assoc=2
778638Sgloh
787538SBrad.Beckmann@amd.comif args:
797538SBrad.Beckmann@amd.com     print "Error: script doesn't take any positional arguments"
807538SBrad.Beckmann@amd.com     sys.exit(1)
817538SBrad.Beckmann@amd.com
829100SBrad.Beckmann@amd.com#
839100SBrad.Beckmann@amd.com# Create the ruby random tester
849100SBrad.Beckmann@amd.com#
859100SBrad.Beckmann@amd.comtester = RubyTester(checks_to_complete = options.checks,
869100SBrad.Beckmann@amd.com                    wakeup_frequency = options.wakeup_freq)
879100SBrad.Beckmann@amd.com
889100SBrad.Beckmann@amd.com#
899100SBrad.Beckmann@amd.com# Create the M5 system.  Note that the PhysicalMemory Object isn't
909100SBrad.Beckmann@amd.com# actually used by the rubytester, but is included to support the
919100SBrad.Beckmann@amd.com# M5 memory size == Ruby memory size checks
928929Snilay@cs.wisc.edu#
936892SBrad.Beckmann@amd.comsystem = System(physmem = PhysicalMemory())
948638Sgloh
958690Snilay@cs.wisc.edusystem.ruby = Ruby.create_system(options, system.physmem)
968690Snilay@cs.wisc.edu
978436SBrad.Beckmann@amd.comassert(options.num_cpus == len(system.ruby.cpu_ruby_ports))
988436SBrad.Beckmann@amd.com
997032SBrad.Beckmann@amd.com#
1007032SBrad.Beckmann@amd.com# The tester is most effective when randomization is turned on and
1016923SBrad.Beckmann@amd.com# artifical delay is randomly inserted on messages
1029100SBrad.Beckmann@amd.com#
1038929Snilay@cs.wisc.edusystem.ruby.randomization = True
1047557SBrad.Beckmann@amd.com
1056923SBrad.Beckmann@amd.comfor ruby_port in system.ruby.cpu_ruby_ports:
1066923SBrad.Beckmann@amd.com    #
1077557SBrad.Beckmann@amd.com    # Tie the ruby tester ports to the ruby cpu ports
1088257SBrad.Beckmann@amd.com    #
1098706Sandreas.hansson@arm.com    tester.cpuPort = ruby_port.port
1108706Sandreas.hansson@arm.com
1118706Sandreas.hansson@arm.com    #
1128923Sandreas.hansson@arm.com    # Tell each sequencer this is the ruby tester so that it
1138706Sandreas.hansson@arm.com    # copies the subblock back to the checker
1148706Sandreas.hansson@arm.com    #
1158706Sandreas.hansson@arm.com    ruby_port.using_ruby_tester = True
1168706Sandreas.hansson@arm.com
1178732Sandreas.hansson@arm.com# -----------------------
1188839Sandreas.hansson@arm.com# run simulation
1198732Sandreas.hansson@arm.com# -----------------------
1208732Sandreas.hansson@arm.com
1218257SBrad.Beckmann@amd.comroot = Root( system = system )
1228257SBrad.Beckmann@amd.comroot.system.mem_mode = 'timing'
1238257SBrad.Beckmann@amd.com
1248257SBrad.Beckmann@amd.com# Not much point in this being higher than the L1 latency
1258257SBrad.Beckmann@amd.comm5.ticks.setGlobalFrequency('1ns')
1268257SBrad.Beckmann@amd.com
1278257SBrad.Beckmann@amd.com# instantiate configuration
1288257SBrad.Beckmann@amd.comm5.instantiate()
1298257SBrad.Beckmann@amd.com
1308257SBrad.Beckmann@amd.com# simulate until program terminates
1318257SBrad.Beckmann@amd.comexit_event = m5.simulate(options.maxtick)
1328257SBrad.Beckmann@amd.com
1338257SBrad.Beckmann@amd.comprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
1348257SBrad.Beckmann@amd.com