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