ruby_direct_test.py revision 6899
13569Sgblack@eecs.umich.edu# Copyright (c) 2006-2007 The Regents of The University of Michigan 23569Sgblack@eecs.umich.edu# Copyright (c) 2009 Advanced Micro Devices, Inc. 33569Sgblack@eecs.umich.edu# All rights reserved. 43569Sgblack@eecs.umich.edu# 53569Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 63569Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 73569Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 83569Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 93569Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 103569Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 113569Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 123569Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 133569Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 143569Sgblack@eecs.umich.edu# this software without specific prior written permission. 153569Sgblack@eecs.umich.edu# 163569Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173569Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183569Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193569Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203569Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213569Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223569Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233569Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243569Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253569Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263569Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273569Sgblack@eecs.umich.edu# 283804Ssaidi@eecs.umich.edu# Authors: Ron Dreslinski 293569Sgblack@eecs.umich.edu# Brad Beckmann 303569Sgblack@eecs.umich.edu 313804Ssaidi@eecs.umich.eduimport m5 323811Ssaidi@eecs.umich.edufrom m5.objects import * 333569Sgblack@eecs.umich.edufrom m5.defines import buildEnv 343824Ssaidi@eecs.umich.edufrom m5.util import addToPath 353811Ssaidi@eecs.umich.eduimport os, optparse, sys 363811Ssaidi@eecs.umich.eduaddToPath('../common') 373823Ssaidi@eecs.umich.eduaddToPath('../ruby') 383823Ssaidi@eecs.umich.edu 393823Ssaidi@eecs.umich.eduimport Ruby 403569Sgblack@eecs.umich.edu 413569Sgblack@eecs.umich.eduif buildEnv['FULL_SYSTEM']: 423804Ssaidi@eecs.umich.edu panic("This script requires system-emulation mode (*_SE).") 433804Ssaidi@eecs.umich.edu 443569Sgblack@eecs.umich.edu# Get paths we might need. It's expected this file is in m5/configs/example. 453569Sgblack@eecs.umich.educonfig_path = os.path.dirname(os.path.abspath(__file__)) 463569Sgblack@eecs.umich.educonfig_root = os.path.dirname(config_path) 473804Ssaidi@eecs.umich.edum5_root = os.path.dirname(config_root) 483836Ssaidi@eecs.umich.edu 493804Ssaidi@eecs.umich.eduparser = optparse.OptionParser() 503804Ssaidi@eecs.umich.edu 513804Ssaidi@eecs.umich.eduparser.add_option("-l", "--checks", metavar="N", default=100, 523804Ssaidi@eecs.umich.edu help="Stop after N checks (loads)") 533569Sgblack@eecs.umich.eduparser.add_option("-f", "--wakeup_freq", metavar="N", default=10, 543804Ssaidi@eecs.umich.edu help="Wakeup every N cycles") 553804Ssaidi@eecs.umich.edu 563804Ssaidi@eecs.umich.edu# 573569Sgblack@eecs.umich.edu# Set the default cache size and associativity to be very small to encourage 583804Ssaidi@eecs.umich.edu# races between requests and writebacks. 593804Ssaidi@eecs.umich.edu# 603804Ssaidi@eecs.umich.eduparser.add_option("--l1d_size", type="string", default="256B") 613804Ssaidi@eecs.umich.eduparser.add_option("--l1i_size", type="string", default="256B") 623804Ssaidi@eecs.umich.eduparser.add_option("--l2_size", type="string", default="512B") 633804Ssaidi@eecs.umich.eduparser.add_option("--l1d_assoc", type="int", default=2) 643804Ssaidi@eecs.umich.eduparser.add_option("--l1i_assoc", type="int", default=2) 653804Ssaidi@eecs.umich.eduparser.add_option("--l2_assoc", type="int", default=2) 663804Ssaidi@eecs.umich.edu 673804Ssaidi@eecs.umich.eduexecfile(os.path.join(config_root, "common", "Options.py")) 683804Ssaidi@eecs.umich.edu 693804Ssaidi@eecs.umich.edu(options, args) = parser.parse_args() 703569Sgblack@eecs.umich.edu 713569Sgblack@eecs.umich.eduif args: 723804Ssaidi@eecs.umich.edu print "Error: script doesn't take any positional arguments" 733804Ssaidi@eecs.umich.edu sys.exit(1) 743826Ssaidi@eecs.umich.edu 753804Ssaidi@eecs.umich.edu# 763569Sgblack@eecs.umich.edu# Create the ruby random tester 773569Sgblack@eecs.umich.edu# 783804Ssaidi@eecs.umich.edutester = RubyTester(checks_to_complete = options.checks, 793826Ssaidi@eecs.umich.edu wakeup_frequency = options.wakeup_freq) 803826Ssaidi@eecs.umich.edu 813811Ssaidi@eecs.umich.edu# 823836Ssaidi@eecs.umich.edu# Create the M5 system. Note that the PhysicalMemory Object isn't 833836Ssaidi@eecs.umich.edu# actually used by the rubytester, but is included to support the 843826Ssaidi@eecs.umich.edu# M5 memory size == Ruby memory size checks 853826Ssaidi@eecs.umich.edu# 863811Ssaidi@eecs.umich.edusystem = System(physmem = PhysicalMemory()) 873826Ssaidi@eecs.umich.edu 883826Ssaidi@eecs.umich.edusystem.ruby = Ruby.create_system(options, system.physmem) 893826Ssaidi@eecs.umich.edu 903826Ssaidi@eecs.umich.eduassert(options.num_cpus == len(system.ruby.cpu_ruby_ports)) 913826Ssaidi@eecs.umich.edu 923826Ssaidi@eecs.umich.edu# 933826Ssaidi@eecs.umich.edu# The tester is most effective when randomization is turned on and 943826Ssaidi@eecs.umich.edu# artifical delay is randomly inserted on messages 953826Ssaidi@eecs.umich.edu# 963804Ssaidi@eecs.umich.edusystem.ruby.randomization = True 973569Sgblack@eecs.umich.edu 983569Sgblack@eecs.umich.edufor ruby_port in system.ruby.cpu_ruby_ports: 993804Ssaidi@eecs.umich.edu # 1003826Ssaidi@eecs.umich.edu # Tie the ruby tester ports to the ruby cpu ports 1013826Ssaidi@eecs.umich.edu # 1023569Sgblack@eecs.umich.edu tester.cpuPort = ruby_port.port 1033804Ssaidi@eecs.umich.edu 1043804Ssaidi@eecs.umich.edu # 1053804Ssaidi@eecs.umich.edu # Tell each sequencer this is the ruby tester so that it 1063804Ssaidi@eecs.umich.edu # copies the subblock back to the checker 1073804Ssaidi@eecs.umich.edu # 1083804Ssaidi@eecs.umich.edu ruby_port.using_ruby_tester = True 1093804Ssaidi@eecs.umich.edu 1103804Ssaidi@eecs.umich.edu# ----------------------- 1113804Ssaidi@eecs.umich.edu# run simulation 1123804Ssaidi@eecs.umich.edu# ----------------------- 1133569Sgblack@eecs.umich.edu 1143569Sgblack@eecs.umich.eduroot = Root( system = system ) 1153804Ssaidi@eecs.umich.eduroot.system.mem_mode = 'timing' 1163804Ssaidi@eecs.umich.edu 1173804Ssaidi@eecs.umich.edu# Not much point in this being higher than the L1 latency 1183804Ssaidi@eecs.umich.edum5.ticks.setGlobalFrequency('1ns') 1193804Ssaidi@eecs.umich.edu 1203804Ssaidi@eecs.umich.edu# instantiate configuration 1213804Ssaidi@eecs.umich.edum5.instantiate(root) 1223804Ssaidi@eecs.umich.edu 1233811Ssaidi@eecs.umich.edu# simulate until program terminates 1243804Ssaidi@eecs.umich.eduexit_event = m5.simulate(options.maxtick) 1253569Sgblack@eecs.umich.edu 1263569Sgblack@eecs.umich.eduprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause() 1273863Ssaidi@eecs.umich.edu