ruby_direct_test.py revision 9365
15584Snate@binkert.org# Copyright (c) 2006-2007 The Regents of The University of Michigan
25584Snate@binkert.org# Copyright (c) 2009 Advanced Micro Devices, Inc.
35584Snate@binkert.org# All rights reserved.
45584Snate@binkert.org#
55584Snate@binkert.org# Redistribution and use in source and binary forms, with or without
65584Snate@binkert.org# modification, are permitted provided that the following conditions are
75584Snate@binkert.org# met: redistributions of source code must retain the above copyright
85584Snate@binkert.org# notice, this list of conditions and the following disclaimer;
95584Snate@binkert.org# redistributions in binary form must reproduce the above copyright
105584Snate@binkert.org# notice, this list of conditions and the following disclaimer in the
115584Snate@binkert.org# documentation and/or other materials provided with the distribution;
125584Snate@binkert.org# neither the name of the copyright holders nor the names of its
135584Snate@binkert.org# contributors may be used to endorse or promote products derived from
145584Snate@binkert.org# this software without specific prior written permission.
155584Snate@binkert.org#
165584Snate@binkert.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175584Snate@binkert.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185584Snate@binkert.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195584Snate@binkert.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205584Snate@binkert.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215584Snate@binkert.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225584Snate@binkert.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235584Snate@binkert.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245584Snate@binkert.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255584Snate@binkert.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265584Snate@binkert.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275584Snate@binkert.org#
285584Snate@binkert.org# Authors: Ron Dreslinski
295584Snate@binkert.org#          Brad Beckmann
305584Snate@binkert.org
315584Snate@binkert.orgimport m5
325584Snate@binkert.orgfrom m5.objects import *
335584Snate@binkert.orgfrom m5.defines import buildEnv
345584Snate@binkert.orgfrom m5.util import addToPath
355584Snate@binkert.orgimport os, optparse, sys
365584Snate@binkert.orgaddToPath('../common')
375584Snate@binkert.orgaddToPath('../ruby')
385584Snate@binkert.orgaddToPath('../topologies')
395584Snate@binkert.org
405584Snate@binkert.orgimport Options
415584Snate@binkert.orgimport Ruby
425584Snate@binkert.org
435584Snate@binkert.org# Get paths we might need.  It's expected this file is in m5/configs/example.
445584Snate@binkert.orgconfig_path = os.path.dirname(os.path.abspath(__file__))
455584Snate@binkert.orgconfig_root = os.path.dirname(config_path)
465584Snate@binkert.orgm5_root = os.path.dirname(config_root)
475584Snate@binkert.org
485584Snate@binkert.orgparser = optparse.OptionParser()
49Options.addCommonOptions(parser)
50
51parser.add_option("-l", "--requests", metavar="N", default=100,
52                  help="Stop after N requests")
53parser.add_option("-f", "--wakeup_freq", metavar="N", default=10,
54                  help="Wakeup every N cycles")
55parser.add_option("--test-type", type="choice", default="SeriesGetx",
56                  choices = ["SeriesGetx", "SeriesGets", "SeriesGetMixed",
57                             "Invalidate"],
58                  help = "Type of test")
59parser.add_option("--percent-writes", type="int", default=100,
60                  help="percentage of accesses that should be writes")
61
62#
63# Add the ruby specific and protocol specific options
64#
65Ruby.define_options(parser)
66(options, args) = parser.parse_args()
67
68if args:
69     print "Error: script doesn't take any positional arguments"
70     sys.exit(1)
71
72#
73# Select the direct test generator
74#
75if options.test_type == "SeriesGetx":
76    generator = SeriesRequestGenerator(num_cpus = options.num_cpus,
77                                       percent_writes = 100)
78elif options.test_type == "SeriesGets":
79    generator = SeriesRequestGenerator(num_cpus = options.num_cpus,
80                                       percent_writes = 0)
81elif options.test_type == "SeriesGetMixed":
82    generator = SeriesRequestGenerator(num_cpus = options.num_cpus,
83                                       percent_writes = options.percent_writes)
84elif options.test_type == "Invalidate":
85    generator = InvalidateGenerator(num_cpus = options.num_cpus)
86else:
87    print "Error: unknown direct test generator"
88    sys.exit(1)
89
90#
91# Create the M5 system.  Note that the Memory Object isn't
92# actually used by the rubytester, but is included to support the
93# M5 memory size == Ruby memory size checks
94#
95system = System(physmem = SimpleMemory())
96
97#
98# Create the ruby random tester
99#
100system.tester = RubyDirectedTester(requests_to_complete = \
101                                   options.requests,
102                                   generator = generator)
103
104Ruby.create_system(options, system)
105
106assert(options.num_cpus == len(system.ruby._cpu_ruby_ports))
107
108for ruby_port in system.ruby._cpu_ruby_ports:
109    #
110    # Tie the ruby tester ports to the ruby cpu ports
111    #
112    system.tester.cpuPort = ruby_port.slave
113
114# -----------------------
115# run simulation
116# -----------------------
117
118root = Root( full_system = False, system = system )
119root.system.mem_mode = 'timing'
120
121# Not much point in this being higher than the L1 latency
122m5.ticks.setGlobalFrequency('1ns')
123
124# instantiate configuration
125m5.instantiate()
126
127# simulate until program terminates
128exit_event = m5.simulate(options.maxtick)
129
130print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
131