Adding gem5 source to svn.
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1819 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
185
simulators/gem5/configs/example/fs.py
Normal file
185
simulators/gem5/configs/example/fs.py
Normal file
@ -0,0 +1,185 @@
|
||||
# Copyright (c) 2010-2012 ARM Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# The license below extends only to copyright in the software and shall
|
||||
# not be construed as granting a license to any other intellectual
|
||||
# property including but not limited to intellectual property relating
|
||||
# to a hardware implementation of the functionality of the software
|
||||
# licensed hereunder. You may use the software subject to the license
|
||||
# terms below provided that you ensure that this notice is replicated
|
||||
# unmodified and in its entirety in all distributions of the software,
|
||||
# modified or unmodified, in source code or in binary form.
|
||||
#
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ali Saidi
|
||||
|
||||
import optparse
|
||||
import sys
|
||||
|
||||
import m5
|
||||
from m5.defines import buildEnv
|
||||
from m5.objects import *
|
||||
from m5.util import addToPath, fatal
|
||||
|
||||
addToPath('../common')
|
||||
|
||||
from FSConfig import *
|
||||
from SysPaths import *
|
||||
from Benchmarks import *
|
||||
import Simulation
|
||||
import CacheConfig
|
||||
from Caches import *
|
||||
import Options
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
Options.addFSOptions(parser)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
# driver system CPU is always simple... note this is an assignment of
|
||||
# a class, not an instance.
|
||||
DriveCPUClass = AtomicSimpleCPU
|
||||
drive_mem_mode = 'atomic'
|
||||
|
||||
# system under test can be any CPU
|
||||
(TestCPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
|
||||
|
||||
TestCPUClass.clock = '2GHz'
|
||||
DriveCPUClass.clock = '2GHz'
|
||||
|
||||
if options.benchmark:
|
||||
try:
|
||||
bm = Benchmarks[options.benchmark]
|
||||
except KeyError:
|
||||
print "Error benchmark %s has not been defined." % options.benchmark
|
||||
print "Valid benchmarks are: %s" % DefinedBenchmarks
|
||||
sys.exit(1)
|
||||
else:
|
||||
if options.dual:
|
||||
bm = [SysConfig(disk=options.disk_image, mem=options.mem_size), SysConfig(disk=options.disk_image, mem=options.mem_size)]
|
||||
else:
|
||||
bm = [SysConfig(disk=options.disk_image, mem=options.mem_size)]
|
||||
|
||||
np = options.num_cpus
|
||||
|
||||
if buildEnv['TARGET_ISA'] == "alpha":
|
||||
test_sys = makeLinuxAlphaSystem(test_mem_mode, bm[0])
|
||||
elif buildEnv['TARGET_ISA'] == "mips":
|
||||
test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
|
||||
elif buildEnv['TARGET_ISA'] == "sparc":
|
||||
test_sys = makeSparcSystem(test_mem_mode, bm[0])
|
||||
elif buildEnv['TARGET_ISA'] == "x86":
|
||||
test_sys = makeLinuxX86System(test_mem_mode, options.num_cpus, bm[0])
|
||||
elif buildEnv['TARGET_ISA'] == "arm":
|
||||
test_sys = makeArmSystem(test_mem_mode,
|
||||
options.machine_type, bm[0],
|
||||
bare_metal=options.bare_metal)
|
||||
else:
|
||||
fatal("Incapable of building %s full system!", buildEnv['TARGET_ISA'])
|
||||
|
||||
if options.kernel is not None:
|
||||
test_sys.kernel = binary(options.kernel)
|
||||
|
||||
if options.script is not None:
|
||||
test_sys.readfile = options.script
|
||||
|
||||
test_sys.init_param = options.init_param
|
||||
|
||||
test_sys.cpu = [TestCPUClass(cpu_id=i) for i in xrange(np)]
|
||||
|
||||
if bm[0]:
|
||||
mem_size = bm[0].mem()
|
||||
else:
|
||||
mem_size = SysConfig().mem()
|
||||
if options.caches or options.l2cache:
|
||||
test_sys.iocache = IOCache(addr_ranges=[test_sys.physmem.range])
|
||||
test_sys.iocache.cpu_side = test_sys.iobus.master
|
||||
test_sys.iocache.mem_side = test_sys.membus.slave
|
||||
else:
|
||||
test_sys.iobridge = Bridge(delay='50ns', nack_delay='4ns',
|
||||
ranges = [test_sys.physmem.range])
|
||||
test_sys.iobridge.slave = test_sys.iobus.master
|
||||
test_sys.iobridge.master = test_sys.membus.slave
|
||||
|
||||
# Sanity check
|
||||
if options.fastmem and (options.caches or options.l2cache):
|
||||
fatal("You cannot use fastmem in combination with caches!")
|
||||
|
||||
for i in xrange(np):
|
||||
if options.fastmem:
|
||||
test_sys.cpu[i].fastmem = True
|
||||
if options.checker:
|
||||
test_sys.cpu[i].addCheckerCpu()
|
||||
|
||||
CacheConfig.config_cache(options, test_sys)
|
||||
|
||||
if len(bm) == 2:
|
||||
if buildEnv['TARGET_ISA'] == 'alpha':
|
||||
drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
|
||||
elif buildEnv['TARGET_ISA'] == 'mips':
|
||||
drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
|
||||
elif buildEnv['TARGET_ISA'] == 'sparc':
|
||||
drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
|
||||
elif buildEnv['TARGET_ISA'] == 'x86':
|
||||
drive_sys = makeX86System(drive_mem_mode, np, bm[1])
|
||||
elif buildEnv['TARGET_ISA'] == 'arm':
|
||||
drive_sys = makeArmSystem(drive_mem_mode, options.machine_type, bm[1])
|
||||
|
||||
drive_sys.cpu = DriveCPUClass(cpu_id=0)
|
||||
drive_sys.cpu.createInterruptController()
|
||||
drive_sys.cpu.connectAllPorts(drive_sys.membus)
|
||||
if options.fastmem:
|
||||
drive_sys.cpu.fastmem = True
|
||||
if options.kernel is not None:
|
||||
drive_sys.kernel = binary(options.kernel)
|
||||
drive_sys.iobridge = Bridge(delay='50ns', nack_delay='4ns',
|
||||
ranges = [drive_sys.physmem.range])
|
||||
drive_sys.iobridge.slave = drive_sys.iobus.master
|
||||
drive_sys.iobridge.master = drive_sys.membus.slave
|
||||
|
||||
drive_sys.init_param = options.init_param
|
||||
root = makeDualRoot(True, test_sys, drive_sys, options.etherdump)
|
||||
elif len(bm) == 1:
|
||||
root = Root(full_system=True, system=test_sys)
|
||||
else:
|
||||
print "Error I don't know how to create more than 2 systems."
|
||||
sys.exit(1)
|
||||
|
||||
if options.timesync:
|
||||
root.time_sync_enable = True
|
||||
|
||||
if options.frame_capture:
|
||||
VncServer.frame_capture = True
|
||||
|
||||
Simulation.setWorkCountOptions(test_sys, options)
|
||||
Simulation.run(options, root, test_sys, FutureClass)
|
||||
199
simulators/gem5/configs/example/memtest.py
Normal file
199
simulators/gem5/configs/example/memtest.py
Normal file
@ -0,0 +1,199 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ron Dreslinski
|
||||
|
||||
import optparse
|
||||
import sys
|
||||
|
||||
import m5
|
||||
from m5.objects import *
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
|
||||
parser.add_option("-a", "--atomic", action="store_true",
|
||||
help="Use atomic (non-timing) mode")
|
||||
parser.add_option("-b", "--blocking", action="store_true",
|
||||
help="Use blocking caches")
|
||||
parser.add_option("-l", "--maxloads", metavar="N", default=0,
|
||||
help="Stop after N loads")
|
||||
parser.add_option("-m", "--maxtick", type="int", default=m5.MaxTick,
|
||||
metavar="T",
|
||||
help="Stop after T ticks")
|
||||
|
||||
#
|
||||
# The "tree" specification is a colon-separated list of one or more
|
||||
# integers. The first integer is the number of caches/testers
|
||||
# connected directly to main memory. The last integer in the list is
|
||||
# the number of testers associated with the uppermost level of memory
|
||||
# (L1 cache, if there are caches, or main memory if no caches). Thus
|
||||
# if there is only one integer, there are no caches, and the integer
|
||||
# specifies the number of testers connected directly to main memory.
|
||||
# The other integers (if any) specify the number of caches at each
|
||||
# level of the hierarchy between.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# "2:1" Two caches connected to memory with a single tester behind each
|
||||
# (single-level hierarchy, two testers total)
|
||||
#
|
||||
# "2:2:1" Two-level hierarchy, 2 L1s behind each of 2 L2s, 4 testers total
|
||||
#
|
||||
parser.add_option("-t", "--treespec", type="string", default="8:1",
|
||||
help="Colon-separated multilevel tree specification, "
|
||||
"see script comments for details "
|
||||
"[default: %default]")
|
||||
|
||||
parser.add_option("--force-bus", action="store_true",
|
||||
help="Use bus between levels even with single cache")
|
||||
|
||||
parser.add_option("-f", "--functional", type="int", default=0,
|
||||
metavar="PCT",
|
||||
help="Target percentage of functional accesses "
|
||||
"[default: %default]")
|
||||
parser.add_option("-u", "--uncacheable", type="int", default=0,
|
||||
metavar="PCT",
|
||||
help="Target percentage of uncacheable accesses "
|
||||
"[default: %default]")
|
||||
|
||||
parser.add_option("--progress", type="int", default=1000,
|
||||
metavar="NLOADS",
|
||||
help="Progress message interval "
|
||||
"[default: %default]")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
block_size = 64
|
||||
|
||||
try:
|
||||
treespec = [int(x) for x in options.treespec.split(':')]
|
||||
numtesters = reduce(lambda x,y: x*y, treespec)
|
||||
except:
|
||||
print "Error parsing treespec option"
|
||||
sys.exit(1)
|
||||
|
||||
if numtesters > block_size:
|
||||
print "Error: Number of testers limited to %s because of false sharing" \
|
||||
% (block_size)
|
||||
sys.exit(1)
|
||||
|
||||
if len(treespec) < 1:
|
||||
print "Error parsing treespec"
|
||||
sys.exit(1)
|
||||
|
||||
# define prototype L1 cache
|
||||
proto_l1 = BaseCache(size = '32kB', assoc = 4, block_size = block_size,
|
||||
latency = '1ns', tgts_per_mshr = 8)
|
||||
|
||||
if options.blocking:
|
||||
proto_l1.mshrs = 1
|
||||
else:
|
||||
proto_l1.mshrs = 4
|
||||
|
||||
# build a list of prototypes, one for each level of treespec, starting
|
||||
# at the end (last entry is tester objects)
|
||||
prototypes = [ MemTest(atomic=options.atomic, max_loads=options.maxloads,
|
||||
percent_functional=options.functional,
|
||||
percent_uncacheable=options.uncacheable,
|
||||
progress_interval=options.progress) ]
|
||||
|
||||
# next comes L1 cache, if any
|
||||
if len(treespec) > 1:
|
||||
prototypes.insert(0, proto_l1)
|
||||
|
||||
# now add additional cache levels (if any) by scaling L1 params
|
||||
for scale in treespec[:-2]:
|
||||
# clone previous level and update params
|
||||
prev = prototypes[0]
|
||||
next = prev()
|
||||
next.size = prev.size * scale
|
||||
next.latency = prev.latency * 10
|
||||
next.assoc = prev.assoc * scale
|
||||
next.mshrs = prev.mshrs * scale
|
||||
prototypes.insert(0, next)
|
||||
|
||||
# system simulated
|
||||
system = System(funcmem = SimpleMemory(in_addr_map = False),
|
||||
physmem = SimpleMemory(latency = "100ns"))
|
||||
|
||||
def make_level(spec, prototypes, attach_obj, attach_port):
|
||||
fanout = spec[0]
|
||||
parent = attach_obj # use attach obj as config parent too
|
||||
if len(spec) > 1 and (fanout > 1 or options.force_bus):
|
||||
port = getattr(attach_obj, attach_port)
|
||||
new_bus = CoherentBus(clock="500MHz", width=16)
|
||||
if (port.role == 'MASTER'):
|
||||
new_bus.slave = port
|
||||
attach_port = "master"
|
||||
else:
|
||||
new_bus.master = port
|
||||
attach_port = "slave"
|
||||
parent.cpu_side_bus = new_bus
|
||||
attach_obj = new_bus
|
||||
objs = [prototypes[0]() for i in xrange(fanout)]
|
||||
if len(spec) > 1:
|
||||
# we just built caches, more levels to go
|
||||
parent.cache = objs
|
||||
for cache in objs:
|
||||
cache.mem_side = getattr(attach_obj, attach_port)
|
||||
make_level(spec[1:], prototypes[1:], cache, "cpu_side")
|
||||
else:
|
||||
# we just built the MemTest objects
|
||||
parent.cpu = objs
|
||||
for t in objs:
|
||||
t.test = getattr(attach_obj, attach_port)
|
||||
t.functional = system.funcmem.port
|
||||
|
||||
make_level(treespec, prototypes, system.physmem, "port")
|
||||
|
||||
# -----------------------
|
||||
# run simulation
|
||||
# -----------------------
|
||||
|
||||
root = Root( full_system = False, system = system )
|
||||
if options.atomic:
|
||||
root.system.mem_mode = 'atomic'
|
||||
else:
|
||||
root.system.mem_mode = 'timing'
|
||||
|
||||
# The system port is never used in the tester so merely connect it
|
||||
# to avoid problems
|
||||
root.system.system_port = root.system.physmem.port
|
||||
|
||||
# Not much point in this being higher than the L1 latency
|
||||
m5.ticks.setGlobalFrequency('1ns')
|
||||
|
||||
# instantiate configuration
|
||||
m5.instantiate()
|
||||
|
||||
# simulate until program terminates
|
||||
exit_event = m5.simulate(options.maxtick)
|
||||
|
||||
print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
|
||||
125
simulators/gem5/configs/example/ruby_direct_test.py
Normal file
125
simulators/gem5/configs/example/ruby_direct_test.py
Normal file
@ -0,0 +1,125 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# Copyright (c) 2009 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ron Dreslinski
|
||||
# Brad Beckmann
|
||||
|
||||
import m5
|
||||
from m5.objects import *
|
||||
from m5.defines import buildEnv
|
||||
from m5.util import addToPath
|
||||
import os, optparse, sys
|
||||
addToPath('../common')
|
||||
addToPath('../ruby')
|
||||
|
||||
import Options
|
||||
import Ruby
|
||||
|
||||
# Get paths we might need. It's expected this file is in m5/configs/example.
|
||||
config_path = os.path.dirname(os.path.abspath(__file__))
|
||||
config_root = os.path.dirname(config_path)
|
||||
m5_root = os.path.dirname(config_root)
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
|
||||
parser.add_option("-l", "--requests", metavar="N", default=100,
|
||||
help="Stop after N requests")
|
||||
parser.add_option("-f", "--wakeup_freq", metavar="N", default=10,
|
||||
help="Wakeup every N cycles")
|
||||
parser.add_option("--test-type", type="string", default="SeriesGetx",
|
||||
help="SeriesGetx|SeriesGets|Invalidate")
|
||||
|
||||
#
|
||||
# Add the ruby specific and protocol specific options
|
||||
#
|
||||
Ruby.define_options(parser)
|
||||
|
||||
execfile(os.path.join(config_root, "common", "Options.py"))
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
#
|
||||
# Select the direct test generator
|
||||
#
|
||||
if options.test_type == "SeriesGetx":
|
||||
generator = SeriesRequestGenerator(num_cpus = options.num_cpus,
|
||||
issue_writes = True)
|
||||
elif options.test_type == "SeriesGets":
|
||||
generator = SeriesRequestGenerator(num_cpus = options.num_cpus,
|
||||
issue_writes = False)
|
||||
elif options.test_type == "Invalidate":
|
||||
generator = InvalidateGenerator(num_cpus = options.num_cpus)
|
||||
else:
|
||||
print "Error: unknown direct test generator"
|
||||
sys.exit(1)
|
||||
|
||||
#
|
||||
# Create the M5 system. Note that the Memory Object isn't
|
||||
# actually used by the rubytester, but is included to support the
|
||||
# M5 memory size == Ruby memory size checks
|
||||
#
|
||||
system = System(physmem = SimpleMemory())
|
||||
|
||||
#
|
||||
# Create the ruby random tester
|
||||
#
|
||||
system.tester = RubyDirectedTester(requests_to_complete = \
|
||||
options.requests,
|
||||
generator = generator)
|
||||
|
||||
Ruby.create_system(options, system)
|
||||
|
||||
assert(options.num_cpus == len(system.ruby._cpu_ruby_ports))
|
||||
|
||||
for ruby_port in system.ruby._cpu_ruby_ports:
|
||||
#
|
||||
# Tie the ruby tester ports to the ruby cpu ports
|
||||
#
|
||||
system.tester.cpuPort = ruby_port.slave
|
||||
|
||||
# -----------------------
|
||||
# run simulation
|
||||
# -----------------------
|
||||
|
||||
root = Root( full_system = False, system = system )
|
||||
root.system.mem_mode = 'timing'
|
||||
|
||||
# Not much point in this being higher than the L1 latency
|
||||
m5.ticks.setGlobalFrequency('1ns')
|
||||
|
||||
# instantiate configuration
|
||||
m5.instantiate()
|
||||
|
||||
# simulate until program terminates
|
||||
exit_event = m5.simulate(options.maxtick)
|
||||
|
||||
print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
|
||||
116
simulators/gem5/configs/example/ruby_fs.py
Normal file
116
simulators/gem5/configs/example/ruby_fs.py
Normal file
@ -0,0 +1,116 @@
|
||||
# Copyright (c) 2009-2011 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Brad Beckmann
|
||||
|
||||
#
|
||||
# Full system configuraiton for ruby
|
||||
#
|
||||
|
||||
import optparse
|
||||
import sys
|
||||
|
||||
import m5
|
||||
from m5.defines import buildEnv
|
||||
from m5.objects import *
|
||||
from m5.util import addToPath, fatal
|
||||
|
||||
addToPath('../common')
|
||||
addToPath('../ruby')
|
||||
|
||||
import Ruby
|
||||
|
||||
from FSConfig import *
|
||||
from SysPaths import *
|
||||
from Benchmarks import *
|
||||
import Options
|
||||
import Simulation
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
Options.addFSOptions(parser)
|
||||
|
||||
# Add the ruby specific and protocol specific options
|
||||
Ruby.define_options(parser)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
options.ruby = True
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
if options.benchmark:
|
||||
try:
|
||||
bm = Benchmarks[options.benchmark]
|
||||
except KeyError:
|
||||
print "Error benchmark %s has not been defined." % options.benchmark
|
||||
print "Valid benchmarks are: %s" % DefinedBenchmarks
|
||||
sys.exit(1)
|
||||
else:
|
||||
bm = [SysConfig(disk=options.disk_image, mem=options.mem_size)]
|
||||
|
||||
# Check for timing mode because ruby does not support atomic accesses
|
||||
if not (options.cpu_type == "detailed" or options.cpu_type == "timing"):
|
||||
print >> sys.stderr, "Ruby requires TimingSimpleCPU or O3CPU!!"
|
||||
sys.exit(1)
|
||||
(CPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
|
||||
|
||||
CPUClass.clock = options.clock
|
||||
|
||||
if buildEnv['TARGET_ISA'] == "alpha":
|
||||
system = makeLinuxAlphaRubySystem(test_mem_mode, bm[0])
|
||||
elif buildEnv['TARGET_ISA'] == "x86":
|
||||
system = makeLinuxX86System(test_mem_mode, options.num_cpus, bm[0], True)
|
||||
Simulation.setWorkCountOptions(system, options)
|
||||
else:
|
||||
fatal("incapable of building non-alpha or non-x86 full system!")
|
||||
|
||||
if options.kernel is not None:
|
||||
system.kernel = binary(options.kernel)
|
||||
|
||||
if options.script is not None:
|
||||
system.readfile = options.script
|
||||
|
||||
system.cpu = [CPUClass(cpu_id=i) for i in xrange(options.num_cpus)]
|
||||
Ruby.create_system(options, system, system.piobus, system._dma_ports)
|
||||
|
||||
for (i, cpu) in enumerate(system.cpu):
|
||||
#
|
||||
# Tie the cpu ports to the correct ruby system ports
|
||||
#
|
||||
cpu.createInterruptController()
|
||||
cpu.icache_port = system.ruby._cpu_ruby_ports[i].slave
|
||||
cpu.dcache_port = system.ruby._cpu_ruby_ports[i].slave
|
||||
if buildEnv['TARGET_ISA'] == "x86":
|
||||
cpu.itb.walker.port = system.ruby._cpu_ruby_ports[i].slave
|
||||
cpu.dtb.walker.port = system.ruby._cpu_ruby_ports[i].slave
|
||||
cpu.interrupts.pio = system.piobus.master
|
||||
cpu.interrupts.int_master = system.piobus.slave
|
||||
cpu.interrupts.int_slave = system.piobus.master
|
||||
|
||||
root = Root(full_system = True, system = system)
|
||||
Simulation.run(options, root, system, FutureClass)
|
||||
180
simulators/gem5/configs/example/ruby_mem_test.py
Normal file
180
simulators/gem5/configs/example/ruby_mem_test.py
Normal file
@ -0,0 +1,180 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# Copyright (c) 2009 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ron Dreslinski
|
||||
# Brad Beckmann
|
||||
|
||||
import m5
|
||||
from m5.objects import *
|
||||
from m5.defines import buildEnv
|
||||
from m5.util import addToPath
|
||||
import os, optparse, sys
|
||||
addToPath('../common')
|
||||
addToPath('../ruby')
|
||||
|
||||
import Options
|
||||
import Ruby
|
||||
|
||||
# Get paths we might need. It's expected this file is in m5/configs/example.
|
||||
config_path = os.path.dirname(os.path.abspath(__file__))
|
||||
config_root = os.path.dirname(config_path)
|
||||
m5_root = os.path.dirname(config_root)
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
|
||||
parser.add_option("-l", "--maxloads", metavar="N", default=0,
|
||||
help="Stop after N loads")
|
||||
parser.add_option("--progress", type="int", default=1000,
|
||||
metavar="NLOADS",
|
||||
help="Progress message interval "
|
||||
"[default: %default]")
|
||||
parser.add_option("--num-dmas", type="int", default=0, help="# of dma testers")
|
||||
parser.add_option("--functional", type="int", default=0,
|
||||
help="percentage of accesses that should be functional")
|
||||
parser.add_option("--suppress-func-warnings", action="store_true",
|
||||
help="suppress warnings when functional accesses fail")
|
||||
|
||||
#
|
||||
# Add the ruby specific and protocol specific options
|
||||
#
|
||||
Ruby.define_options(parser)
|
||||
|
||||
execfile(os.path.join(config_root, "common", "Options.py"))
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
#
|
||||
# Set the default cache size and associativity to be very small to encourage
|
||||
# races between requests and writebacks.
|
||||
#
|
||||
options.l1d_size="256B"
|
||||
options.l1i_size="256B"
|
||||
options.l2_size="512B"
|
||||
options.l3_size="1kB"
|
||||
options.l1d_assoc=2
|
||||
options.l1i_assoc=2
|
||||
options.l2_assoc=2
|
||||
options.l3_assoc=2
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
block_size = 64
|
||||
|
||||
if options.num_cpus > block_size:
|
||||
print "Error: Number of testers %d limited to %d because of false sharing" \
|
||||
% (options.num_cpus, block_size)
|
||||
sys.exit(1)
|
||||
|
||||
#
|
||||
# Currently ruby does not support atomic or uncacheable accesses
|
||||
#
|
||||
cpus = [ MemTest(atomic = False,
|
||||
max_loads = options.maxloads,
|
||||
issue_dmas = False,
|
||||
percent_functional = options.functional,
|
||||
percent_uncacheable = 0,
|
||||
progress_interval = options.progress,
|
||||
suppress_func_warnings = options.suppress_func_warnings) \
|
||||
for i in xrange(options.num_cpus) ]
|
||||
|
||||
system = System(cpu = cpus,
|
||||
funcmem = SimpleMemory(in_addr_map = False),
|
||||
physmem = SimpleMemory())
|
||||
|
||||
if options.num_dmas > 0:
|
||||
dmas = [ MemTest(atomic = False,
|
||||
max_loads = options.maxloads,
|
||||
issue_dmas = True,
|
||||
percent_functional = 0,
|
||||
percent_uncacheable = 0,
|
||||
progress_interval = options.progress,
|
||||
suppress_func_warnings =
|
||||
not options.suppress_func_warnings) \
|
||||
for i in xrange(options.num_dmas) ]
|
||||
system.dma_devices = dmas
|
||||
else:
|
||||
dmas = []
|
||||
|
||||
dma_ports = []
|
||||
for (i, dma) in enumerate(dmas):
|
||||
dma_ports.append(dma.test)
|
||||
Ruby.create_system(options, system, dma_ports = dma_ports)
|
||||
|
||||
#
|
||||
# The tester is most effective when randomization is turned on and
|
||||
# artifical delay is randomly inserted on messages
|
||||
#
|
||||
system.ruby.randomization = True
|
||||
|
||||
assert(len(cpus) == len(system.ruby._cpu_ruby_ports))
|
||||
|
||||
for (i, cpu) in enumerate(cpus):
|
||||
#
|
||||
# Tie the cpu memtester ports to the correct system ports
|
||||
#
|
||||
cpu.test = system.ruby._cpu_ruby_ports[i].slave
|
||||
cpu.functional = system.funcmem.port
|
||||
|
||||
#
|
||||
# Since the memtester is incredibly bursty, increase the deadlock
|
||||
# threshold to 5 million cycles
|
||||
#
|
||||
system.ruby._cpu_ruby_ports[i].deadlock_threshold = 5000000
|
||||
|
||||
#
|
||||
# Ruby doesn't need the backing image of memory when running with
|
||||
# the tester.
|
||||
#
|
||||
system.ruby._cpu_ruby_ports[i].access_phys_mem = False
|
||||
|
||||
for (i, dma) in enumerate(dmas):
|
||||
#
|
||||
# Tie the dma memtester ports to the correct functional port
|
||||
# Note that the test port has already been connected to the dma_sequencer
|
||||
#
|
||||
dma.functional = system.funcmem.port
|
||||
|
||||
# -----------------------
|
||||
# run simulation
|
||||
# -----------------------
|
||||
|
||||
root = Root( full_system = False, system = system )
|
||||
root.system.mem_mode = 'timing'
|
||||
|
||||
# Not much point in this being higher than the L1 latency
|
||||
m5.ticks.setGlobalFrequency('1ns')
|
||||
|
||||
# instantiate configuration
|
||||
m5.instantiate()
|
||||
|
||||
# simulate until program terminates
|
||||
exit_event = m5.simulate(options.maxtick)
|
||||
|
||||
print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
|
||||
136
simulators/gem5/configs/example/ruby_network_test.py
Normal file
136
simulators/gem5/configs/example/ruby_network_test.py
Normal file
@ -0,0 +1,136 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# Copyright (c) 2010 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ron Dreslinski
|
||||
# Tushar Krishna
|
||||
|
||||
import m5
|
||||
from m5.objects import *
|
||||
from m5.defines import buildEnv
|
||||
from m5.util import addToPath
|
||||
import os, optparse, sys
|
||||
addToPath('../common')
|
||||
addToPath('../ruby')
|
||||
|
||||
import Options
|
||||
import Ruby
|
||||
|
||||
# Get paths we might need. It's expected this file is in m5/configs/example.
|
||||
config_path = os.path.dirname(os.path.abspath(__file__))
|
||||
config_root = os.path.dirname(config_path)
|
||||
m5_root = os.path.dirname(config_root)
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
|
||||
parser.add_option("--synthetic", type="int", default=0,
|
||||
help="Synthetic Traffic type. 0 = Uniform Random,\
|
||||
1 = Tornado, 2 = Bit Complement")
|
||||
|
||||
parser.add_option("-i", "--injectionrate", type="float", default=0.1,
|
||||
metavar="I",
|
||||
help="Injection rate in packets per cycle per node. \
|
||||
Takes decimal value between 0 to 1 (eg. 0.225). \
|
||||
Number of digits after 0 depends upon --precision.")
|
||||
|
||||
parser.add_option("--precision", type="int", default=3,
|
||||
help="Number of digits of precision after decimal point\
|
||||
for injection rate")
|
||||
|
||||
parser.add_option("--sim-cycles", type="int", default=1000,
|
||||
help="Number of simulation cycles")
|
||||
|
||||
parser.add_option("--fixed-pkts", action="store_true",
|
||||
help="Network_test: inject --maxpackets and stop")
|
||||
|
||||
parser.add_option("--maxpackets", type="int", default=1,
|
||||
help="Stop injecting after --maxpackets. \
|
||||
Works only with --fixed-pkts")
|
||||
|
||||
#
|
||||
# Add the ruby specific and protocol specific options
|
||||
#
|
||||
Ruby.define_options(parser)
|
||||
|
||||
execfile(os.path.join(config_root, "common", "Options.py"))
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
block_size = 64
|
||||
|
||||
if options.num_cpus > block_size:
|
||||
print "Error: Number of cores %d limited to %d because of false sharing" \
|
||||
% (options.num_cpus, block_size)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
cpus = [ NetworkTest(fixed_pkts=options.fixed_pkts,
|
||||
max_packets=options.maxpackets,
|
||||
sim_cycles=options.sim_cycles,
|
||||
traffic_type=options.synthetic,
|
||||
inj_rate=options.injectionrate,
|
||||
precision=options.precision,
|
||||
num_memories=options.num_dirs) \
|
||||
for i in xrange(options.num_cpus) ]
|
||||
|
||||
# create the desired simulated system
|
||||
system = System(cpu = cpus,
|
||||
physmem = SimpleMemory())
|
||||
|
||||
Ruby.create_system(options, system)
|
||||
|
||||
i = 0
|
||||
for ruby_port in system.ruby._cpu_ruby_ports:
|
||||
#
|
||||
# Tie the cpu test ports to the ruby cpu port
|
||||
#
|
||||
cpus[i].test = ruby_port.slave
|
||||
ruby_port.access_phys_mem = False
|
||||
|
||||
i += 1
|
||||
|
||||
# -----------------------
|
||||
# run simulation
|
||||
# -----------------------
|
||||
|
||||
root = Root( full_system = False, system = system )
|
||||
root.system.mem_mode = 'timing'
|
||||
|
||||
# Not much point in this being higher than the L1 latency
|
||||
m5.ticks.setGlobalFrequency('1ns')
|
||||
|
||||
# instantiate configuration
|
||||
m5.instantiate()
|
||||
|
||||
# simulate until program terminates
|
||||
exit_event = m5.simulate(options.maxtick)
|
||||
|
||||
print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
|
||||
149
simulators/gem5/configs/example/ruby_random_test.py
Normal file
149
simulators/gem5/configs/example/ruby_random_test.py
Normal file
@ -0,0 +1,149 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# Copyright (c) 2009 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ron Dreslinski
|
||||
# Brad Beckmann
|
||||
|
||||
import m5
|
||||
from m5.objects import *
|
||||
from m5.defines import buildEnv
|
||||
from m5.util import addToPath
|
||||
import os, optparse, sys
|
||||
addToPath('../common')
|
||||
addToPath('../ruby')
|
||||
|
||||
import Options
|
||||
import Ruby
|
||||
|
||||
# Get paths we might need. It's expected this file is in m5/configs/example.
|
||||
config_path = os.path.dirname(os.path.abspath(__file__))
|
||||
config_root = os.path.dirname(config_path)
|
||||
m5_root = os.path.dirname(config_root)
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
|
||||
parser.add_option("-l", "--checks", metavar="N", default=100,
|
||||
help="Stop after N checks (loads)")
|
||||
parser.add_option("-f", "--wakeup_freq", metavar="N", default=10,
|
||||
help="Wakeup every N cycles")
|
||||
|
||||
#
|
||||
# Add the ruby specific and protocol specific options
|
||||
#
|
||||
Ruby.define_options(parser)
|
||||
|
||||
execfile(os.path.join(config_root, "common", "Options.py"))
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
#
|
||||
# Set the default cache size and associativity to be very small to encourage
|
||||
# races between requests and writebacks.
|
||||
#
|
||||
options.l1d_size="256B"
|
||||
options.l1i_size="256B"
|
||||
options.l2_size="512B"
|
||||
options.l3_size="1kB"
|
||||
options.l1d_assoc=2
|
||||
options.l1i_assoc=2
|
||||
options.l2_assoc=2
|
||||
options.l3_assoc=2
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
#
|
||||
# Create the ruby random tester
|
||||
#
|
||||
|
||||
# Check the protocol
|
||||
check_flush = False
|
||||
if buildEnv['PROTOCOL'] == 'MOESI_hammer':
|
||||
check_flush = True
|
||||
|
||||
tester = RubyTester(check_flush = check_flush,
|
||||
checks_to_complete = options.checks,
|
||||
wakeup_frequency = options.wakeup_freq,
|
||||
num_cpus = options.num_cpus)
|
||||
|
||||
#
|
||||
# Create the M5 system. Note that the Memory Object isn't
|
||||
# actually used by the rubytester, but is included to support the
|
||||
# M5 memory size == Ruby memory size checks
|
||||
#
|
||||
system = System(tester = tester, physmem = SimpleMemory())
|
||||
|
||||
Ruby.create_system(options, system)
|
||||
|
||||
assert(options.num_cpus == len(system.ruby._cpu_ruby_ports))
|
||||
|
||||
#
|
||||
# The tester is most effective when randomization is turned on and
|
||||
# artifical delay is randomly inserted on messages
|
||||
#
|
||||
system.ruby.randomization = True
|
||||
|
||||
for ruby_port in system.ruby._cpu_ruby_ports:
|
||||
#
|
||||
# Tie the ruby tester ports to the ruby cpu read and write ports
|
||||
#
|
||||
if ruby_port.support_data_reqs:
|
||||
tester.cpuDataPort = ruby_port.slave
|
||||
if ruby_port.support_inst_reqs:
|
||||
tester.cpuInstPort = ruby_port.slave
|
||||
|
||||
#
|
||||
# Tell each sequencer this is the ruby tester so that it
|
||||
# copies the subblock back to the checker
|
||||
#
|
||||
ruby_port.using_ruby_tester = True
|
||||
|
||||
#
|
||||
# Ruby doesn't need the backing image of memory when running with
|
||||
# the tester.
|
||||
#
|
||||
ruby_port.access_phys_mem = False
|
||||
|
||||
# -----------------------
|
||||
# run simulation
|
||||
# -----------------------
|
||||
|
||||
root = Root( full_system = False, system = system )
|
||||
root.system.mem_mode = 'timing'
|
||||
|
||||
# Not much point in this being higher than the L1 latency
|
||||
m5.ticks.setGlobalFrequency('1ns')
|
||||
|
||||
# instantiate configuration
|
||||
m5.instantiate()
|
||||
|
||||
# simulate until program terminates
|
||||
exit_event = m5.simulate(options.maxtick)
|
||||
|
||||
print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
|
||||
201
simulators/gem5/configs/example/se.py
Normal file
201
simulators/gem5/configs/example/se.py
Normal file
@ -0,0 +1,201 @@
|
||||
# Copyright (c) 2012 ARM Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# The license below extends only to copyright in the software and shall
|
||||
# not be construed as granting a license to any other intellectual
|
||||
# property including but not limited to intellectual property relating
|
||||
# to a hardware implementation of the functionality of the software
|
||||
# licensed hereunder. You may use the software subject to the license
|
||||
# terms below provided that you ensure that this notice is replicated
|
||||
# unmodified and in its entirety in all distributions of the software,
|
||||
# modified or unmodified, in source code or in binary form.
|
||||
#
|
||||
# Copyright (c) 2006-2008 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Steve Reinhardt
|
||||
|
||||
# Simple test script
|
||||
#
|
||||
# "m5 test.py"
|
||||
|
||||
import optparse
|
||||
import sys
|
||||
|
||||
import m5
|
||||
from m5.defines import buildEnv
|
||||
from m5.objects import *
|
||||
from m5.util import addToPath, fatal
|
||||
|
||||
addToPath('../common')
|
||||
addToPath('../ruby')
|
||||
|
||||
import Options
|
||||
import Ruby
|
||||
import Simulation
|
||||
import CacheConfig
|
||||
from Caches import *
|
||||
from cpu2000 import *
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
Options.addCommonOptions(parser)
|
||||
Options.addSEOptions(parser)
|
||||
|
||||
if '--ruby' in sys.argv:
|
||||
Ruby.define_options(parser)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if args:
|
||||
print "Error: script doesn't take any positional arguments"
|
||||
sys.exit(1)
|
||||
|
||||
multiprocesses = []
|
||||
apps = []
|
||||
|
||||
if options.bench:
|
||||
apps = options.bench.split("-")
|
||||
if len(apps) != options.num_cpus:
|
||||
print "number of benchmarks not equal to set num_cpus!"
|
||||
sys.exit(1)
|
||||
|
||||
for app in apps:
|
||||
try:
|
||||
if buildEnv['TARGET_ISA'] == 'alpha':
|
||||
exec("workload = %s('alpha', 'tru64', 'ref')" % app)
|
||||
else:
|
||||
exec("workload = %s(buildEnv['TARGET_ISA'], 'linux', 'ref')" % app)
|
||||
multiprocesses.append(workload.makeLiveProcess())
|
||||
except:
|
||||
print >>sys.stderr, "Unable to find workload for %s: %s" % (buildEnv['TARGET_ISA'], app)
|
||||
sys.exit(1)
|
||||
elif options.cmd:
|
||||
process = LiveProcess()
|
||||
process.executable = options.cmd
|
||||
process.cmd = [options.cmd] + options.options.split()
|
||||
multiprocesses.append(process)
|
||||
else:
|
||||
print >> sys.stderr, "No workload specified. Exiting!\n"
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if options.input != "":
|
||||
process.input = options.input
|
||||
if options.output != "":
|
||||
process.output = options.output
|
||||
if options.errout != "":
|
||||
process.errout = options.errout
|
||||
|
||||
|
||||
# By default, set workload to path of user-specified binary
|
||||
workloads = options.cmd
|
||||
numThreads = 1
|
||||
|
||||
if options.cpu_type == "detailed" or options.cpu_type == "inorder":
|
||||
#check for SMT workload
|
||||
workloads = options.cmd.split(';')
|
||||
if len(workloads) > 1:
|
||||
process = []
|
||||
smt_idx = 0
|
||||
inputs = []
|
||||
outputs = []
|
||||
errouts = []
|
||||
|
||||
if options.input != "":
|
||||
inputs = options.input.split(';')
|
||||
if options.output != "":
|
||||
outputs = options.output.split(';')
|
||||
if options.errout != "":
|
||||
errouts = options.errout.split(';')
|
||||
|
||||
for wrkld in workloads:
|
||||
smt_process = LiveProcess()
|
||||
smt_process.executable = wrkld
|
||||
smt_process.cmd = wrkld + " " + options.options
|
||||
if inputs and inputs[smt_idx]:
|
||||
smt_process.input = inputs[smt_idx]
|
||||
if outputs and outputs[smt_idx]:
|
||||
smt_process.output = outputs[smt_idx]
|
||||
if errouts and errouts[smt_idx]:
|
||||
smt_process.errout = errouts[smt_idx]
|
||||
process += [smt_process, ]
|
||||
smt_idx += 1
|
||||
numThreads = len(workloads)
|
||||
|
||||
(CPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
|
||||
CPUClass.clock = '2GHz'
|
||||
CPUClass.numThreads = numThreads;
|
||||
|
||||
np = options.num_cpus
|
||||
|
||||
system = System(cpu = [CPUClass(cpu_id=i) for i in xrange(np)],
|
||||
physmem = SimpleMemory(range=AddrRange("512MB")),
|
||||
membus = CoherentBus(), mem_mode = test_mem_mode)
|
||||
|
||||
# Sanity check
|
||||
if options.fastmem and (options.caches or options.l2cache):
|
||||
fatal("You cannot use fastmem in combination with caches!")
|
||||
|
||||
for i in xrange(np):
|
||||
if len(multiprocesses) == 1:
|
||||
system.cpu[i].workload = multiprocesses[0]
|
||||
else:
|
||||
system.cpu[i].workload = multiprocesses[i]
|
||||
|
||||
if options.fastmem:
|
||||
system.cpu[i].fastmem = True
|
||||
|
||||
if options.checker:
|
||||
system.cpu[i].addCheckerCpu()
|
||||
|
||||
if options.ruby:
|
||||
if not (options.cpu_type == "detailed" or options.cpu_type == "timing"):
|
||||
print >> sys.stderr, "Ruby requires TimingSimpleCPU or O3CPU!!"
|
||||
sys.exit(1)
|
||||
|
||||
options.use_map = True
|
||||
Ruby.create_system(options, system)
|
||||
assert(options.num_cpus == len(system.ruby._cpu_ruby_ports))
|
||||
|
||||
for i in xrange(np):
|
||||
ruby_port = system.ruby._cpu_ruby_ports[i]
|
||||
|
||||
# Create the interrupt controller and connect its ports to Ruby
|
||||
system.cpu[i].createInterruptController()
|
||||
system.cpu[i].interrupts.pio = ruby_port.master
|
||||
system.cpu[i].interrupts.int_master = ruby_port.slave
|
||||
system.cpu[i].interrupts.int_slave = ruby_port.master
|
||||
|
||||
# Connect the cpu's cache ports to Ruby
|
||||
system.cpu[i].icache_port = ruby_port.slave
|
||||
system.cpu[i].dcache_port = ruby_port.slave
|
||||
else:
|
||||
system.system_port = system.membus.slave
|
||||
system.physmem.port = system.membus.master
|
||||
CacheConfig.config_cache(options, system)
|
||||
|
||||
root = Root(full_system = False, system = system)
|
||||
Simulation.run(options, root, system, FutureClass)
|
||||
Reference in New Issue
Block a user