MI_example.py revision 9793
15703Ssaidi@eecs.umich.edu# Copyright (c) 2006-2007 The Regents of The University of Michigan 25703Ssaidi@eecs.umich.edu# Copyright (c) 2009 Advanced Micro Devices, Inc. 35703Ssaidi@eecs.umich.edu# All rights reserved. 45703Ssaidi@eecs.umich.edu# 55703Ssaidi@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 65703Ssaidi@eecs.umich.edu# modification, are permitted provided that the following conditions are 75703Ssaidi@eecs.umich.edu# met: redistributions of source code must retain the above copyright 85703Ssaidi@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 95703Ssaidi@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 105703Ssaidi@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 115703Ssaidi@eecs.umich.edu# documentation and/or other materials provided with the distribution; 125703Ssaidi@eecs.umich.edu# neither the name of the copyright holders nor the names of its 135703Ssaidi@eecs.umich.edu# contributors may be used to endorse or promote products derived from 145703Ssaidi@eecs.umich.edu# this software without specific prior written permission. 155703Ssaidi@eecs.umich.edu# 165703Ssaidi@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175703Ssaidi@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185703Ssaidi@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195703Ssaidi@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205703Ssaidi@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215703Ssaidi@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225703Ssaidi@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235703Ssaidi@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245703Ssaidi@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255703Ssaidi@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265703Ssaidi@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275703Ssaidi@eecs.umich.edu# 285703Ssaidi@eecs.umich.edu# Authors: Brad Beckmann 295703Ssaidi@eecs.umich.edu 305703Ssaidi@eecs.umich.eduimport math 315703Ssaidi@eecs.umich.eduimport m5 325703Ssaidi@eecs.umich.edufrom m5.objects import * 335703Ssaidi@eecs.umich.edufrom m5.defines import buildEnv 345703Ssaidi@eecs.umich.edufrom Ruby import create_topology 355703Ssaidi@eecs.umich.edu 365703Ssaidi@eecs.umich.edu# 375703Ssaidi@eecs.umich.edu# Note: the cache latency is only used by the sequencer on fast path hits 385703Ssaidi@eecs.umich.edu# 395703Ssaidi@eecs.umich.educlass Cache(RubyCache): 405703Ssaidi@eecs.umich.edu latency = 3 415703Ssaidi@eecs.umich.edu 425703Ssaidi@eecs.umich.edudef define_options(parser): 435703Ssaidi@eecs.umich.edu return 445703Ssaidi@eecs.umich.edu 455703Ssaidi@eecs.umich.edudef create_system(options, system, piobus, dma_ports, ruby_system): 465703Ssaidi@eecs.umich.edu 475703Ssaidi@eecs.umich.edu if buildEnv['PROTOCOL'] != 'MI_example': 485703Ssaidi@eecs.umich.edu panic("This script requires the MI_example protocol to be built.") 495703Ssaidi@eecs.umich.edu 505703Ssaidi@eecs.umich.edu cpu_sequencers = [] 515703Ssaidi@eecs.umich.edu 525703Ssaidi@eecs.umich.edu # 535703Ssaidi@eecs.umich.edu # The ruby network creation expects the list of nodes in the system to be 545703Ssaidi@eecs.umich.edu # consistent with the NetDest list. Therefore the l1 controller nodes must be 555703Ssaidi@eecs.umich.edu # listed before the directory nodes and directory nodes before dma nodes, etc. 565703Ssaidi@eecs.umich.edu # 575703Ssaidi@eecs.umich.edu l1_cntrl_nodes = [] 585703Ssaidi@eecs.umich.edu dir_cntrl_nodes = [] 595703Ssaidi@eecs.umich.edu dma_cntrl_nodes = [] 605703Ssaidi@eecs.umich.edu 615703Ssaidi@eecs.umich.edu # 625703Ssaidi@eecs.umich.edu # Must create the individual controllers before the network to ensure the 635703Ssaidi@eecs.umich.edu # controller constructors are called before the network constructor 645703Ssaidi@eecs.umich.edu # 655703Ssaidi@eecs.umich.edu block_size_bits = int(math.log(options.cacheline_size, 2)) 665703Ssaidi@eecs.umich.edu 675703Ssaidi@eecs.umich.edu cntrl_count = 0 685703Ssaidi@eecs.umich.edu 695703Ssaidi@eecs.umich.edu for i in xrange(options.num_cpus): 705703Ssaidi@eecs.umich.edu # 715703Ssaidi@eecs.umich.edu # First create the Ruby objects associated with this cpu 725703Ssaidi@eecs.umich.edu # Only one cache exists for this protocol, so by default use the L1D 735703Ssaidi@eecs.umich.edu # config parameters. 745703Ssaidi@eecs.umich.edu # 755703Ssaidi@eecs.umich.edu cache = Cache(size = options.l1d_size, 765703Ssaidi@eecs.umich.edu assoc = options.l1d_assoc, 775703Ssaidi@eecs.umich.edu start_index_bit = block_size_bits) 785703Ssaidi@eecs.umich.edu 795703Ssaidi@eecs.umich.edu # 805703Ssaidi@eecs.umich.edu # Only one unified L1 cache exists. Can cache instructions and data. 815703Ssaidi@eecs.umich.edu # 825703Ssaidi@eecs.umich.edu l1_cntrl = L1Cache_Controller(version = i, 835703Ssaidi@eecs.umich.edu cntrl_id = cntrl_count, 845703Ssaidi@eecs.umich.edu cacheMemory = cache, 855703Ssaidi@eecs.umich.edu send_evictions = ( 865703Ssaidi@eecs.umich.edu options.cpu_type == "detailed"), 875703Ssaidi@eecs.umich.edu ruby_system = ruby_system) 885703Ssaidi@eecs.umich.edu 895703Ssaidi@eecs.umich.edu cpu_seq = RubySequencer(version = i, 905703Ssaidi@eecs.umich.edu icache = cache, 915703Ssaidi@eecs.umich.edu dcache = cache, 925703Ssaidi@eecs.umich.edu ruby_system = ruby_system) 935703Ssaidi@eecs.umich.edu 945703Ssaidi@eecs.umich.edu l1_cntrl.sequencer = cpu_seq 955703Ssaidi@eecs.umich.edu 965703Ssaidi@eecs.umich.edu if piobus != None: 975703Ssaidi@eecs.umich.edu cpu_seq.pio_port = piobus.slave 985703Ssaidi@eecs.umich.edu 995703Ssaidi@eecs.umich.edu exec("ruby_system.l1_cntrl%d = l1_cntrl" % i) 100 # 101 # Add controllers and sequencers to the appropriate lists 102 # 103 cpu_sequencers.append(cpu_seq) 104 l1_cntrl_nodes.append(l1_cntrl) 105 106 cntrl_count += 1 107 108 phys_mem_size = sum(map(lambda mem: mem.range.size(), 109 system.memories.unproxy(system))) 110 mem_module_size = phys_mem_size / options.num_dirs 111 112 # Run each of the ruby memory controllers at a ratio of the frequency of 113 # the ruby system. 114 # clk_divider value is a fix to pass regression. 115 ruby_system.memctrl_clk_domain = DerivedClockDomain( 116 clk_domain=ruby_system.clk_domain, 117 clk_divider=3) 118 119 for i in xrange(options.num_dirs): 120 # 121 # Create the Ruby objects associated with the directory controller 122 # 123 124 mem_cntrl = RubyMemoryControl( 125 clk_domain = ruby_system.memctrl_clk_domain, 126 version = i, 127 ruby_system = ruby_system) 128 129 dir_size = MemorySize('0B') 130 dir_size.value = mem_module_size 131 132 dir_cntrl = Directory_Controller(version = i, 133 cntrl_id = cntrl_count, 134 directory = \ 135 RubyDirectoryMemory( \ 136 version = i, 137 size = dir_size, 138 use_map = options.use_map, 139 map_levels = \ 140 options.map_levels), 141 memBuffer = mem_cntrl, 142 ruby_system = ruby_system) 143 144 exec("ruby_system.dir_cntrl%d = dir_cntrl" % i) 145 dir_cntrl_nodes.append(dir_cntrl) 146 147 cntrl_count += 1 148 149 for i, dma_port in enumerate(dma_ports): 150 # 151 # Create the Ruby objects associated with the dma controller 152 # 153 dma_seq = DMASequencer(version = i, 154 ruby_system = ruby_system) 155 156 dma_cntrl = DMA_Controller(version = i, 157 cntrl_id = cntrl_count, 158 dma_sequencer = dma_seq, 159 ruby_system = ruby_system) 160 161 exec("ruby_system.dma_cntrl%d = dma_cntrl" % i) 162 exec("ruby_system.dma_cntrl%d.dma_sequencer.slave = dma_port" % i) 163 dma_cntrl_nodes.append(dma_cntrl) 164 cntrl_count += 1 165 166 all_cntrls = l1_cntrl_nodes + dir_cntrl_nodes + dma_cntrl_nodes 167 168 topology = create_topology(all_cntrls, options) 169 170 return (cpu_sequencers, dir_cntrl_nodes, topology) 171