2 # Copyright (c) 2010-2015 Advanced Micro Devices, Inc.
5 # For use for simulation and test purposes only
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are met:
10 # 1. Redistributions of source code must retain the above copyright notice,
11 # this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright notice,
14 # this list of conditions and the following disclaimer in the documentation
15 # and/or other materials provided with the distribution.
17 # 3. Neither the name of the copyright holder nor the names of its contributors
18 # may be used to endorse or promote products derived from this software
19 # without specific prior written permission.
21 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 # POSSIBILITY OF SUCH DAMAGE.
33 # Author: Brad Beckmann
37 from m5
.objects
import *
38 from m5
.defines
import buildEnv
39 from m5
.util
import addToPath
40 import os
, optparse
, sys
42 m5
.util
.addToPath('../configs/')
45 from common
import Options
47 parser
= optparse
.OptionParser()
48 Options
.addCommonOptions(parser
)
50 # add the gpu specific options expected by the the gpu and gpu_RfO
51 parser
.add_option("-u", "--num-compute-units", type="int", default
=8,
52 help="number of compute units in the GPU")
53 parser
.add_option("--num-cp", type="int", default
=0,
54 help="Number of GPU Command Processors (CP)")
55 parser
.add_option("--simds-per-cu", type="int", default
=4, help="SIMD units" \
57 parser
.add_option("--wf-size", type="int", default
=64,
58 help="Wavefront size(in workitems)")
59 parser
.add_option("--wfs-per-simd", type="int", default
=10, help="Number of " \
62 # Add the ruby specific and protocol specific options
63 Ruby
.define_options(parser
)
65 (options
, args
) = parser
.parse_args()
68 # Set the default cache size and associativity to be very small to encourage
69 # races between requests and writebacks.
71 options
.l1d_size
="256B"
72 options
.l1i_size
="256B"
73 options
.l2_size
="512B"
79 options
.num_compute_units
=8
82 # Check to for the GPU_RfO protocol. Other GPU protocols are non-SC and will
83 # not work with the Ruby random tester.
84 assert(buildEnv
['PROTOCOL'] == 'GPU_RfO')
87 # create the tester and system, including ruby
89 tester
= RubyTester(check_flush
= False, checks_to_complete
= 100,
90 wakeup_frequency
= 10, num_cpus
= options
.num_cpus
)
92 # We set the testers as cpu for ruby to find the correct clock domains
94 system
= System(cpu
= tester
)
96 # Dummy voltage domain for all our clock domains
97 system
.voltage_domain
= VoltageDomain(voltage
= options
.sys_voltage
)
98 system
.clk_domain
= SrcClockDomain(clock
= '1GHz',
99 voltage_domain
= system
.voltage_domain
)
101 system
.mem_ranges
= AddrRange('256MB')
103 Ruby
.create_system(options
, False, system
)
105 # Create a separate clock domain for Ruby
106 system
.ruby
.clk_domain
= SrcClockDomain(clock
= '1GHz',
107 voltage_domain
= system
.voltage_domain
)
109 tester
.num_cpus
= len(system
.ruby
._cpu
_ports
)
112 # The tester is most effective when randomization is turned on and
113 # artifical delay is randomly inserted on messages
115 system
.ruby
.randomization
= True
117 for ruby_port
in system
.ruby
._cpu
_ports
:
119 # Tie the ruby tester ports to the ruby cpu read and write ports
121 if ruby_port
.support_data_reqs
and ruby_port
.support_inst_reqs
:
122 tester
.cpuInstDataPort
= ruby_port
.slave
123 elif ruby_port
.support_data_reqs
:
124 tester
.cpuDataPort
= ruby_port
.slave
125 elif ruby_port
.support_inst_reqs
:
126 tester
.cpuInstPort
= ruby_port
.slave
128 # Do not automatically retry stalled Ruby requests
129 ruby_port
.no_retry_on_stall
= True
132 # Tell the sequencer this is the ruby tester so that it
133 # copies the subblock back to the checker
135 ruby_port
.using_ruby_tester
= True
137 # -----------------------
139 # -----------------------
141 root
= Root(full_system
= False, system
= system
)
142 root
.system
.mem_mode
= 'timing'