mem-ruby: Sequencer can be used without cache
[gem5.git] / configs / ruby / MESI_Three_Level.py
index c05dca350f16a98a412d4997ae3bbb289e1e15a5..91ccb58963409224e60365fa2b4888cc515d0532 100644 (file)
@@ -31,8 +31,8 @@ import math
 import m5
 from m5.objects import *
 from m5.defines import buildEnv
-from Ruby import create_topology, create_directories
-from Ruby import send_evicts
+from .Ruby import create_topology, create_directories
+from .Ruby import send_evicts
 from common import FileSystemConfig
 
 #
@@ -53,6 +53,8 @@ def define_options(parser):
     parser.add_option("--l0_transitions_per_cycle", type="int", default=32)
     parser.add_option("--l1_transitions_per_cycle", type="int", default=32)
     parser.add_option("--l2_transitions_per_cycle", type="int", default=4)
+    parser.add_option("--enable-prefetch", action="store_true", default=False,\
+                        help="Enable Ruby hardware prefetcher")
     return
 
 def create_system(options, full_system, system, dma_ports, bootmem,
@@ -118,16 +120,27 @@ def create_system(options, full_system, system, dma_ports, bootmem,
             else:
                 clk_domain = system.cpu[i].clk_domain
 
+            # Ruby prefetcher
+            prefetcher = RubyPrefetcher(
+                num_streams=16,
+                unit_filter = 256,
+                nonunit_filter = 256,
+                train_misses = 5,
+                num_startup_pfs = 4,
+                cross_page = True
+            )
+
             l0_cntrl = L0Cache_Controller(
                    version = i * num_cpus_per_cluster + j,
                    Icache = l0i_cache, Dcache = l0d_cache,
                    transitions_per_cycle = options.l0_transitions_per_cycle,
+                   prefetcher = prefetcher,
+                   enable_prefetch = options.enable_prefetch,
                    send_evictions = send_evicts(options),
                    clk_domain = clk_domain,
                    ruby_system = ruby_system)
 
             cpu_seq = RubySequencer(version = i * num_cpus_per_cluster + j,
-                                    icache = l0i_cache,
                                     clk_domain = clk_domain,
                                     dcache = l0d_cache,
                                     ruby_system = ruby_system)
@@ -159,6 +172,7 @@ def create_system(options, full_system, system, dma_ports, bootmem,
             l1_cntrl_nodes.append(l1_cntrl)
 
             # Connect the L0 and L1 controllers
+            l0_cntrl.prefetchQueue = MessageBuffer()
             l0_cntrl.mandatoryQueue = MessageBuffer()
             l0_cntrl.bufferToL1 = MessageBuffer(ordered = True)
             l1_cntrl.bufferFromL0 = l0_cntrl.bufferToL1
@@ -229,6 +243,7 @@ def create_system(options, full_system, system, dma_ports, bootmem,
         dir_cntrl.responseToDir.slave = ruby_system.network.master
         dir_cntrl.responseFromDir = MessageBuffer()
         dir_cntrl.responseFromDir.master = ruby_system.network.slave
+        dir_cntrl.requestToMemory = MessageBuffer()
         dir_cntrl.responseFromMemory = MessageBuffer()
 
     for i, dma_port in enumerate(dma_ports):
@@ -278,10 +293,10 @@ def create_system(options, full_system, system, dma_ports, bootmem,
         all_cntrls = all_cntrls + [io_controller]
     # Register configuration with filesystem
     else:
-        for i in xrange(options.num_clusters):
-            for j in xrange(num_cpus_per_cluster):
+        for i in range(options.num_clusters):
+            for j in range(num_cpus_per_cluster):
                 FileSystemConfig.register_cpu(physical_package_id = 0,
-                                              core_siblings = xrange(options.num_cpus),
+                                              core_siblings = range(options.num_cpus),
                                               core_id = i*num_cpus_per_cluster+j,
                                               thread_siblings = [])
 
@@ -313,7 +328,7 @@ def create_system(options, full_system, system, dma_ports, bootmem,
                                                    num_l2caches_per_cluster)+'B',
                                             line_size = options.cacheline_size,
                                             assoc = options.l2_assoc,
-                                            cpus = [n for n in xrange(i*num_cpus_per_cluster, \
+                                            cpus = [n for n in range(i*num_cpus_per_cluster, \
                                                                      (i+1)*num_cpus_per_cluster)])
 
     ruby_system.network.number_of_virtual_networks = 3