Garnet_standalone.py revision 12065
15081Sgblack@eecs.umich.edu# Copyright (c) 2009 Advanced Micro Devices, Inc. 25081Sgblack@eecs.umich.edu# Copyright (c) 2016 Georgia Institute of Technology 35081Sgblack@eecs.umich.edu# All rights reserved. 45081Sgblack@eecs.umich.edu# 55081Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 65081Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 75081Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 85081Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 95081Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 105081Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 115081Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 125081Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 135081Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 145081Sgblack@eecs.umich.edu# this software without specific prior written permission. 155081Sgblack@eecs.umich.edu# 165081Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175081Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185081Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195081Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205081Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215081Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225081Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235081Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245081Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255081Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265081Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275081Sgblack@eecs.umich.edu# 285081Sgblack@eecs.umich.edu# Authors: Brad Beckmann 295081Sgblack@eecs.umich.edu# Tushar Krishna 305081Sgblack@eecs.umich.edu 315081Sgblack@eecs.umich.eduimport m5 325081Sgblack@eecs.umich.edufrom m5.objects import * 335081Sgblack@eecs.umich.edufrom m5.defines import buildEnv 345081Sgblack@eecs.umich.edufrom m5.util import addToPath 355081Sgblack@eecs.umich.edufrom Ruby import create_topology, create_directories 365081Sgblack@eecs.umich.edu 375081Sgblack@eecs.umich.edu# 385081Sgblack@eecs.umich.edu# Declare caches used by the protocol 395081Sgblack@eecs.umich.edu# 405081Sgblack@eecs.umich.educlass L1Cache(RubyCache): pass 415081Sgblack@eecs.umich.edu 425081Sgblack@eecs.umich.edudef define_options(parser): 435081Sgblack@eecs.umich.edu return 445081Sgblack@eecs.umich.edu 455081Sgblack@eecs.umich.edudef create_system(options, full_system, system, dma_ports, ruby_system): 465081Sgblack@eecs.umich.edu if buildEnv['PROTOCOL'] != 'Garnet_standalone': 475081Sgblack@eecs.umich.edu panic("This script requires Garnet_standalone protocol to be built.") 485081Sgblack@eecs.umich.edu 495081Sgblack@eecs.umich.edu cpu_sequencers = [] 505081Sgblack@eecs.umich.edu 515081Sgblack@eecs.umich.edu # 525081Sgblack@eecs.umich.edu # The Garnet_standalone protocol does not support fs nor dma 535081Sgblack@eecs.umich.edu # 545081Sgblack@eecs.umich.edu assert(dma_ports == []) 555081Sgblack@eecs.umich.edu 565907Sgblack@eecs.umich.edu # 575907Sgblack@eecs.umich.edu # The ruby network creation expects the list of nodes in the system to be 585907Sgblack@eecs.umich.edu # consistent with the NetDest list. 595907Sgblack@eecs.umich.edu # Therefore the l1 controller nodes must be listed before 606062Sgblack@eecs.umich.edu # the directory nodes and directory nodes before dma nodes, etc. 615907Sgblack@eecs.umich.edu l1_cntrl_nodes = [] 625907Sgblack@eecs.umich.edu 635907Sgblack@eecs.umich.edu # 645907Sgblack@eecs.umich.edu # Must create the individual controllers before the network to ensure the 655907Sgblack@eecs.umich.edu # controller constructors are called before the network constructor 665907Sgblack@eecs.umich.edu # 676062Sgblack@eecs.umich.edu 685907Sgblack@eecs.umich.edu for i in xrange(options.num_cpus): 695907Sgblack@eecs.umich.edu # 705907Sgblack@eecs.umich.edu # First create the Ruby objects associated with this cpu 715907Sgblack@eecs.umich.edu # Only one cache exists for this protocol, so by default use the L1D 725907Sgblack@eecs.umich.edu # config parameters. 735907Sgblack@eecs.umich.edu # 745907Sgblack@eecs.umich.edu cache = L1Cache(size = options.l1d_size, 755907Sgblack@eecs.umich.edu assoc = options.l1d_assoc) 765907Sgblack@eecs.umich.edu 775907Sgblack@eecs.umich.edu # 785907Sgblack@eecs.umich.edu # Only one unified L1 cache exists. Can cache instructions and data. 795907Sgblack@eecs.umich.edu # 805907Sgblack@eecs.umich.edu l1_cntrl = L1Cache_Controller(version = i, 816062Sgblack@eecs.umich.edu cacheMemory = cache, 825907Sgblack@eecs.umich.edu ruby_system = ruby_system) 835907Sgblack@eecs.umich.edu 845907Sgblack@eecs.umich.edu cpu_seq = RubySequencer(icache = cache, 855907Sgblack@eecs.umich.edu dcache = cache, 865907Sgblack@eecs.umich.edu garnet_standalone = True, 875907Sgblack@eecs.umich.edu ruby_system = ruby_system) 885907Sgblack@eecs.umich.edu 895907Sgblack@eecs.umich.edu l1_cntrl.sequencer = cpu_seq 905907Sgblack@eecs.umich.edu exec("ruby_system.l1_cntrl%d = l1_cntrl" % i) 915907Sgblack@eecs.umich.edu 926062Sgblack@eecs.umich.edu # Add controllers and sequencers to the appropriate lists 935907Sgblack@eecs.umich.edu cpu_sequencers.append(cpu_seq) 945907Sgblack@eecs.umich.edu l1_cntrl_nodes.append(l1_cntrl) 955907Sgblack@eecs.umich.edu 965907Sgblack@eecs.umich.edu # Connect the L1 controllers and the network 975907Sgblack@eecs.umich.edu l1_cntrl.mandatoryQueue = MessageBuffer() 985907Sgblack@eecs.umich.edu l1_cntrl.requestFromCache = MessageBuffer() 995907Sgblack@eecs.umich.edu l1_cntrl.responseFromCache = MessageBuffer() 1005907Sgblack@eecs.umich.edu l1_cntrl.forwardFromCache = MessageBuffer() 1015907Sgblack@eecs.umich.edu 1025907Sgblack@eecs.umich.edu 1035907Sgblack@eecs.umich.edu dir_cntrl_nodes = create_directories(options, system.mem_ranges, 1045907Sgblack@eecs.umich.edu ruby_system) 1055907Sgblack@eecs.umich.edu for dir_cntrl in dir_cntrl_nodes: 1065907Sgblack@eecs.umich.edu # Connect the directory controllers and the network 1075907Sgblack@eecs.umich.edu dir_cntrl.requestToDir = MessageBuffer() 1085907Sgblack@eecs.umich.edu dir_cntrl.forwardToDir = MessageBuffer() 1096062Sgblack@eecs.umich.edu dir_cntrl.responseToDir = MessageBuffer() 1105907Sgblack@eecs.umich.edu 1115907Sgblack@eecs.umich.edu 1125907Sgblack@eecs.umich.edu all_cntrls = l1_cntrl_nodes + dir_cntrl_nodes 1135907Sgblack@eecs.umich.edu ruby_system.network.number_of_virtual_networks = 3 1145907Sgblack@eecs.umich.edu topology = create_topology(all_cntrls, options) 1155907Sgblack@eecs.umich.edu return (cpu_sequencers, dir_cntrl_nodes, topology) 1166062Sgblack@eecs.umich.edu