112647Santhony.gutierrez@amd.com# Copyright (c) 2015-2017 Advanced Micro Devices, Inc. 212647Santhony.gutierrez@amd.com# All rights reserved. 311308Santhony.gutierrez@amd.com# 412647Santhony.gutierrez@amd.com# For use for simulation and test purposes only 511308Santhony.gutierrez@amd.com# 612647Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without 712647Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are met: 811308Santhony.gutierrez@amd.com# 912647Santhony.gutierrez@amd.com# 1. Redistributions of source code must retain the above copyright notice, 1012647Santhony.gutierrez@amd.com# this list of conditions and the following disclaimer. 1111308Santhony.gutierrez@amd.com# 1212647Santhony.gutierrez@amd.com# 2. Redistributions in binary form must reproduce the above copyright notice, 1312647Santhony.gutierrez@amd.com# this list of conditions and the following disclaimer in the documentation 1412647Santhony.gutierrez@amd.com# and/or other materials provided with the distribution. 1511308Santhony.gutierrez@amd.com# 1612647Santhony.gutierrez@amd.com# 3. Neither the name of the copyright holder nor the names of its 1712647Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from this 1812647Santhony.gutierrez@amd.com# software without specific prior written permission. 1911308Santhony.gutierrez@amd.com# 2012647Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2112647Santhony.gutierrez@amd.com# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2212647Santhony.gutierrez@amd.com# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2312647Santhony.gutierrez@amd.com# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2412647Santhony.gutierrez@amd.com# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2512647Santhony.gutierrez@amd.com# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2612647Santhony.gutierrez@amd.com# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2712647Santhony.gutierrez@amd.com# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2812647Santhony.gutierrez@amd.com# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2912647Santhony.gutierrez@amd.com# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3012647Santhony.gutierrez@amd.com# POSSIBILITY OF SUCH DAMAGE. 3111308Santhony.gutierrez@amd.com# 3212647Santhony.gutierrez@amd.com# Authors: Sooraj Puthoor, 3312647Santhony.gutierrez@amd.com# Lisa Hsu 3411308Santhony.gutierrez@amd.com 3511308Santhony.gutierrez@amd.comimport math 3611308Santhony.gutierrez@amd.comimport m5 3711308Santhony.gutierrez@amd.comfrom m5.objects import * 3811308Santhony.gutierrez@amd.comfrom m5.defines import buildEnv 3913400Sodanrc@yahoo.com.brfrom m5.util import addToPath, convert 4011308Santhony.gutierrez@amd.comfrom CntrlBase import * 4113400Sodanrc@yahoo.com.br 4213400Sodanrc@yahoo.com.braddToPath('../') 4313400Sodanrc@yahoo.com.br 4411670Sandreas.hansson@arm.comfrom topologies.Cluster import Cluster 4511308Santhony.gutierrez@amd.com 4611308Santhony.gutierrez@amd.com# 4711308Santhony.gutierrez@amd.com# Note: the L1 Cache latency is only used by the sequencer on fast path hits 4811308Santhony.gutierrez@amd.com# 4911308Santhony.gutierrez@amd.comclass L1Cache(RubyCache): 5011308Santhony.gutierrez@amd.com latency = 1 5111308Santhony.gutierrez@amd.com resourceStalls = False 5211308Santhony.gutierrez@amd.com def create(self, size, assoc, options): 5311308Santhony.gutierrez@amd.com self.size = MemorySize(size) 5411308Santhony.gutierrez@amd.com self.assoc = assoc 5511308Santhony.gutierrez@amd.com self.replacement_policy = PseudoLRUReplacementPolicy() 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.com# 5811308Santhony.gutierrez@amd.com# Note: the L2 Cache latency is not currently used 5911308Santhony.gutierrez@amd.com# 6011308Santhony.gutierrez@amd.comclass L2Cache(RubyCache): 6111308Santhony.gutierrez@amd.com latency = 10 6211308Santhony.gutierrez@amd.com resourceStalls = False 6311308Santhony.gutierrez@amd.com def create(self, size, assoc, options): 6411308Santhony.gutierrez@amd.com self.size = MemorySize(size) 6511308Santhony.gutierrez@amd.com self.assoc = assoc 6611308Santhony.gutierrez@amd.com self.replacement_policy = PseudoLRUReplacementPolicy() 6711308Santhony.gutierrez@amd.comclass CPCntrl(AMD_Base_Controller, CntrlBase): 6811308Santhony.gutierrez@amd.com 6911308Santhony.gutierrez@amd.com def create(self, options, ruby_system, system): 7011308Santhony.gutierrez@amd.com self.version = self.versionCount() 7111308Santhony.gutierrez@amd.com self.cntrl_id = self.cntrlCount() 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com self.L1Icache = L1Cache() 7411308Santhony.gutierrez@amd.com self.L1Icache.create(options.l1i_size, options.l1i_assoc, options) 7511308Santhony.gutierrez@amd.com self.L1D0cache = L1Cache() 7611308Santhony.gutierrez@amd.com self.L1D0cache.create(options.l1d_size, options.l1d_assoc, options) 7711308Santhony.gutierrez@amd.com self.L1D1cache = L1Cache() 7811308Santhony.gutierrez@amd.com self.L1D1cache.create(options.l1d_size, options.l1d_assoc, options) 7911308Santhony.gutierrez@amd.com self.L2cache = L2Cache() 8011308Santhony.gutierrez@amd.com self.L2cache.create(options.l2_size, options.l2_assoc, options) 8111308Santhony.gutierrez@amd.com 8211308Santhony.gutierrez@amd.com self.sequencer = RubySequencer() 8311308Santhony.gutierrez@amd.com self.sequencer.version = self.seqCount() 8411308Santhony.gutierrez@amd.com self.sequencer.icache = self.L1Icache 8511308Santhony.gutierrez@amd.com self.sequencer.dcache = self.L1D0cache 8611308Santhony.gutierrez@amd.com self.sequencer.ruby_system = ruby_system 8711308Santhony.gutierrez@amd.com self.sequencer.coreid = 0 8811308Santhony.gutierrez@amd.com self.sequencer.is_cpu_sequencer = True 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.com self.sequencer1 = RubySequencer() 9111308Santhony.gutierrez@amd.com self.sequencer1.version = self.seqCount() 9211308Santhony.gutierrez@amd.com self.sequencer1.icache = self.L1Icache 9311308Santhony.gutierrez@amd.com self.sequencer1.dcache = self.L1D1cache 9411308Santhony.gutierrez@amd.com self.sequencer1.ruby_system = ruby_system 9511308Santhony.gutierrez@amd.com self.sequencer1.coreid = 1 9611308Santhony.gutierrez@amd.com self.sequencer1.is_cpu_sequencer = True 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com self.issue_latency = options.cpu_to_dir_latency 9911308Santhony.gutierrez@amd.com self.send_evictions = send_evicts(options) 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.com self.ruby_system = ruby_system 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com if options.recycle_latency: 10411308Santhony.gutierrez@amd.com self.recycle_latency = options.recycle_latency 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.comdef define_options(parser): 10711308Santhony.gutierrez@amd.com parser.add_option("--cpu-to-dir-latency", type="int", default=15) 10811308Santhony.gutierrez@amd.com 10911308Santhony.gutierrez@amd.comdef construct(options, system, ruby_system): 11011308Santhony.gutierrez@amd.com if (buildEnv['PROTOCOL'] != 'GPU_VIPER' or 11111308Santhony.gutierrez@amd.com buildEnv['PROTOCOL'] != 'GPU_VIPER_Region' or 11211308Santhony.gutierrez@amd.com buildEnv['PROTOCOL'] != 'GPU_VIPER_Baseline'): 11311308Santhony.gutierrez@amd.com panic("This script requires VIPER based protocols \ 11411308Santhony.gutierrez@amd.com to be built.") 11511308Santhony.gutierrez@amd.com cpu_sequencers = [] 11611308Santhony.gutierrez@amd.com cpuCluster = None 11711308Santhony.gutierrez@amd.com cpuCluster = Cluster(name="CPU Cluster", extBW = 8, intBW=8) # 16 GB/s 11813731Sandreas.sandberg@arm.com for i in range((options.num_cpus + 1) // 2): 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.com cp_cntrl = CPCntrl() 12111308Santhony.gutierrez@amd.com cp_cntrl.create(options, ruby_system, system) 12211308Santhony.gutierrez@amd.com 12311308Santhony.gutierrez@amd.com # Connect the CP controllers to the ruby network 12411308Santhony.gutierrez@amd.com cp_cntrl.requestFromCore = ruby_system.network.slave 12511308Santhony.gutierrez@amd.com cp_cntrl.responseFromCore = ruby_system.network.slave 12611308Santhony.gutierrez@amd.com cp_cntrl.unblockFromCore = ruby_system.network.slave 12711308Santhony.gutierrez@amd.com cp_cntrl.probeToCore = ruby_system.network.master 12811308Santhony.gutierrez@amd.com cp_cntrl.responseToCore = ruby_system.network.master 12911308Santhony.gutierrez@amd.com 13011308Santhony.gutierrez@amd.com exec("system.cp_cntrl%d = cp_cntrl" % i) 13111308Santhony.gutierrez@amd.com # 13211308Santhony.gutierrez@amd.com # Add controllers and sequencers to the appropriate lists 13311308Santhony.gutierrez@amd.com # 13411308Santhony.gutierrez@amd.com cpu_sequencers.extend([cp_cntrl.sequencer, cp_cntrl.sequencer1]) 13511308Santhony.gutierrez@amd.com cpuCluster.add(cp_cntrl) 13611308Santhony.gutierrez@amd.com return cpu_sequencers, cpuCluster 137