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