ruby_random_test.py revision 10300:ed3816dae6d5
15425Sgblack@eecs.umich.edu# Copyright (c) 2006-2007 The Regents of The University of Michigan
25425Sgblack@eecs.umich.edu# Copyright (c) 2009 Advanced Micro Devices, Inc.
35425Sgblack@eecs.umich.edu# All rights reserved.
47087Snate@binkert.org#
57087Snate@binkert.org# Redistribution and use in source and binary forms, with or without
67087Snate@binkert.org# modification, are permitted provided that the following conditions are
77087Snate@binkert.org# met: redistributions of source code must retain the above copyright
87087Snate@binkert.org# notice, this list of conditions and the following disclaimer;
97087Snate@binkert.org# redistributions in binary form must reproduce the above copyright
107087Snate@binkert.org# notice, this list of conditions and the following disclaimer in the
117087Snate@binkert.org# documentation and/or other materials provided with the distribution;
125425Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its
137087Snate@binkert.org# contributors may be used to endorse or promote products derived from
147087Snate@binkert.org# this software without specific prior written permission.
157087Snate@binkert.org#
167087Snate@binkert.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177087Snate@binkert.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187087Snate@binkert.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197087Snate@binkert.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207087Snate@binkert.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215425Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227087Snate@binkert.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235425Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245425Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255425Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265425Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275425Sgblack@eecs.umich.edu#
285425Sgblack@eecs.umich.edu# Authors: Ron Dreslinski
295425Sgblack@eecs.umich.edu#          Brad Beckmann
305425Sgblack@eecs.umich.edu
315425Sgblack@eecs.umich.eduimport m5
325425Sgblack@eecs.umich.edufrom m5.objects import *
335425Sgblack@eecs.umich.edufrom m5.defines import buildEnv
345425Sgblack@eecs.umich.edufrom m5.util import addToPath
355425Sgblack@eecs.umich.eduimport os, optparse, sys
365425Sgblack@eecs.umich.eduaddToPath('../common')
375425Sgblack@eecs.umich.eduaddToPath('../ruby')
385425Sgblack@eecs.umich.eduaddToPath('../topologies')
395425Sgblack@eecs.umich.edu
405425Sgblack@eecs.umich.eduimport Options
415425Sgblack@eecs.umich.eduimport Ruby
425425Sgblack@eecs.umich.edu
435425Sgblack@eecs.umich.edu# Get paths we might need.  It's expected this file is in m5/configs/example.
445425Sgblack@eecs.umich.educonfig_path = os.path.dirname(os.path.abspath(__file__))
455425Sgblack@eecs.umich.educonfig_root = os.path.dirname(config_path)
465425Sgblack@eecs.umich.edum5_root = os.path.dirname(config_root)
475425Sgblack@eecs.umich.edu
487965Sgblack@eecs.umich.eduparser = optparse.OptionParser()
497965Sgblack@eecs.umich.eduOptions.addCommonOptions(parser)
505425Sgblack@eecs.umich.edu
515425Sgblack@eecs.umich.eduparser.add_option("--maxloads", metavar="N", default=100,
525425Sgblack@eecs.umich.edu                  help="Stop after N loads")
535425Sgblack@eecs.umich.eduparser.add_option("-f", "--wakeup_freq", metavar="N", default=10,
547965Sgblack@eecs.umich.edu                  help="Wakeup every N cycles")
557620Sgblack@eecs.umich.edu
567965Sgblack@eecs.umich.edu#
577965Sgblack@eecs.umich.edu# Add the ruby specific and protocol specific options
587965Sgblack@eecs.umich.edu#
597965Sgblack@eecs.umich.eduRuby.define_options(parser)
605425Sgblack@eecs.umich.edu
617965Sgblack@eecs.umich.eduexecfile(os.path.join(config_root, "common", "Options.py"))
627965Sgblack@eecs.umich.edu
637965Sgblack@eecs.umich.edu(options, args) = parser.parse_args()
647965Sgblack@eecs.umich.edu
657965Sgblack@eecs.umich.edu#
667965Sgblack@eecs.umich.edu# Set the default cache size and associativity to be very small to encourage
677965Sgblack@eecs.umich.edu# races between requests and writebacks.
687965Sgblack@eecs.umich.edu#
697965Sgblack@eecs.umich.eduoptions.l1d_size="256B"
707965Sgblack@eecs.umich.eduoptions.l1i_size="256B"
715425Sgblack@eecs.umich.eduoptions.l2_size="512B"
725425Sgblack@eecs.umich.eduoptions.l3_size="1kB"
735425Sgblack@eecs.umich.eduoptions.l1d_assoc=2
745425Sgblack@eecs.umich.eduoptions.l1i_assoc=2
755425Sgblack@eecs.umich.eduoptions.l2_assoc=2
765425Sgblack@eecs.umich.eduoptions.l3_assoc=2
775425Sgblack@eecs.umich.edu
785425Sgblack@eecs.umich.eduif args:
797620Sgblack@eecs.umich.edu     print "Error: script doesn't take any positional arguments"
805425Sgblack@eecs.umich.edu     sys.exit(1)
815425Sgblack@eecs.umich.edu
825425Sgblack@eecs.umich.edu#
835425Sgblack@eecs.umich.edu# Create the ruby random tester
845425Sgblack@eecs.umich.edu#
855425Sgblack@eecs.umich.edu
867965Sgblack@eecs.umich.edu# Check the protocol
877965Sgblack@eecs.umich.educheck_flush = False
885425Sgblack@eecs.umich.eduif buildEnv['PROTOCOL'] == 'MOESI_hammer':
895425Sgblack@eecs.umich.edu    check_flush = True
905425Sgblack@eecs.umich.edu
915425Sgblack@eecs.umich.edutester = RubyTester(check_flush = check_flush,
925425Sgblack@eecs.umich.edu                    checks_to_complete = options.maxloads,
937965Sgblack@eecs.umich.edu                    wakeup_frequency = options.wakeup_freq)
947965Sgblack@eecs.umich.edu
957965Sgblack@eecs.umich.edu#
965425Sgblack@eecs.umich.edu# Create the M5 system.  Note that the Memory Object isn't
975425Sgblack@eecs.umich.edu# actually used by the rubytester, but is included to support the
985425Sgblack@eecs.umich.edu# M5 memory size == Ruby memory size checks
995425Sgblack@eecs.umich.edu#
1005425Sgblack@eecs.umich.edusystem = System(cpu = tester, physmem = SimpleMemory(),
1017975Sgblack@eecs.umich.edu                mem_ranges = [AddrRange(options.mem_size)])
1027620Sgblack@eecs.umich.edu
1035425Sgblack@eecs.umich.edu# Create a top-level voltage domain and clock domain
1045425Sgblack@eecs.umich.edusystem.voltage_domain = VoltageDomain(voltage = options.sys_voltage)
1057965Sgblack@eecs.umich.edu
1065425Sgblack@eecs.umich.edusystem.clk_domain = SrcClockDomain(clock = options.sys_clock,
1077626Sgblack@eecs.umich.edu                                   voltage_domain = system.voltage_domain)
1085425Sgblack@eecs.umich.edu
1095425Sgblack@eecs.umich.eduRuby.create_system(options, system)
1105425Sgblack@eecs.umich.edu
1115425Sgblack@eecs.umich.edu# Create a seperate clock domain for Ruby
1125425Sgblack@eecs.umich.edusystem.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock,
1135425Sgblack@eecs.umich.edu                                        voltage_domain = system.voltage_domain)
1145425Sgblack@eecs.umich.edu
1155425Sgblack@eecs.umich.eduassert(options.num_cpus == len(system.ruby._cpu_ports))
1165425Sgblack@eecs.umich.edu
1175425Sgblack@eecs.umich.edutester.num_cpus = len(system.ruby._cpu_ports)
1185425Sgblack@eecs.umich.edu
1195425Sgblack@eecs.umich.edu#
1205425Sgblack@eecs.umich.edu# The tester is most effective when randomization is turned on and
1215425Sgblack@eecs.umich.edu# artifical delay is randomly inserted on messages
1225425Sgblack@eecs.umich.edu#
1237620Sgblack@eecs.umich.edusystem.ruby.randomization = True
1247620Sgblack@eecs.umich.edu
1255425Sgblack@eecs.umich.edufor ruby_port in system.ruby._cpu_ports:
1265425Sgblack@eecs.umich.edu    #
1275425Sgblack@eecs.umich.edu    # Tie the ruby tester ports to the ruby cpu read and write ports
1285425Sgblack@eecs.umich.edu    #
1295425Sgblack@eecs.umich.edu    if ruby_port.support_data_reqs:
1305425Sgblack@eecs.umich.edu         tester.cpuDataPort = ruby_port.slave
1315425Sgblack@eecs.umich.edu    if ruby_port.support_inst_reqs:
1325425Sgblack@eecs.umich.edu         tester.cpuInstPort = ruby_port.slave
1335425Sgblack@eecs.umich.edu
1345425Sgblack@eecs.umich.edu    #
1355425Sgblack@eecs.umich.edu    # Tell each sequencer this is the ruby tester so that it
1367965Sgblack@eecs.umich.edu    # copies the subblock back to the checker
1375425Sgblack@eecs.umich.edu    #
1385425Sgblack@eecs.umich.edu    ruby_port.using_ruby_tester = True
1395425Sgblack@eecs.umich.edu
1405425Sgblack@eecs.umich.edu    #
1415425Sgblack@eecs.umich.edu    # Ruby doesn't need the backing image of memory when running with
1425425Sgblack@eecs.umich.edu    # the tester.
1437965Sgblack@eecs.umich.edu    #
1445425Sgblack@eecs.umich.edu    ruby_port.access_phys_mem = False
1455425Sgblack@eecs.umich.edu
1465425Sgblack@eecs.umich.edu# -----------------------
1475425Sgblack@eecs.umich.edu# run simulation
1485425Sgblack@eecs.umich.edu# -----------------------
1495425Sgblack@eecs.umich.edu
1505425Sgblack@eecs.umich.eduroot = Root( full_system = False, system = system )
1515425Sgblack@eecs.umich.eduroot.system.mem_mode = 'timing'
1525425Sgblack@eecs.umich.edu
1537965Sgblack@eecs.umich.edu# Not much point in this being higher than the L1 latency
1545425Sgblack@eecs.umich.edum5.ticks.setGlobalFrequency('1ns')
1555425Sgblack@eecs.umich.edu
1565425Sgblack@eecs.umich.edu# instantiate configuration
1575425Sgblack@eecs.umich.edum5.instantiate()
1585425Sgblack@eecs.umich.edu
1595425Sgblack@eecs.umich.edu# simulate until program terminates
1605425Sgblack@eecs.umich.eduexit_event = m5.simulate(options.abs_max_tick)
1615425Sgblack@eecs.umich.edu
1625425Sgblack@eecs.umich.eduprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
1635425Sgblack@eecs.umich.edu