ruby: cache configuration fix to use bytes
authorBrad Beckmann <Brad.Beckmann@amd.com>
Thu, 19 Nov 2009 00:34:31 +0000 (16:34 -0800)
committerBrad Beckmann <Brad.Beckmann@amd.com>
Thu, 19 Nov 2009 00:34:31 +0000 (16:34 -0800)
Changed cache size to be in bytes instead of kb so that testers can use very
small caches and increase the chance of writeback races.

src/mem/ruby/config/MI_example-homogeneous.rb
src/mem/ruby/config/cfg.rb
src/mem/ruby/system/CacheMemory.cc

index b7842aaafeb20735ee8bfa7fd8e91680afc3de62..1ed81ee42071e50458acabbc6fa43f037655fc64 100644 (file)
@@ -13,7 +13,7 @@ RubySystem.reset
 # default values
 
 num_cores = 2
-l1_cache_size_kb = 32
+l1_cache_size_kb = 32768
 l1_cache_assoc = 8
 l1_cache_latency = 1
 num_memories = 2
@@ -37,6 +37,12 @@ for i in 0..$*.size-1 do
   elsif $*[i] == "-s"
     memory_size_mb = $*[i+1].to_i
     i = i + 1
+  elsif $*[i] == "-C"
+    l1_cache_size_bytes = $*[i+1].to_i
+    i = i + 1
+  elsif $*[i] == "-A"
+    l1_cache_assoc = $*[i+1].to_i
+    i = i + 1
   elsif $*[i] == "-D"
     num_dma = $*[i+1].to_i
     i = i + 1
@@ -51,7 +57,7 @@ assert(protocol == "MI_example", __FILE__ + " cannot be used with protocol " + p
 require protocol+".rb"
 
 num_cores.times { |n|
-  cache = SetAssociativeCache.new("l1u_"+n.to_s, l1_cache_size_kb, l1_cache_latency, l1_cache_assoc, "PSEUDO_LRU")
+  cache = SetAssociativeCache.new("l1u_"+n.to_s, l1_cache_size_bytes, l1_cache_latency, l1_cache_assoc, "PSEUDO_LRU")
   sequencer = Sequencer.new("Sequencer_"+n.to_s, cache, cache)
   iface_ports << sequencer
   net_ports << MI_example_CacheController.new("L1CacheController_"+n.to_s,
index 1c261544d71ffdd8c4b4cb4bc7bfa39c19e3ce59..f2564e1d324c03863d64e13d7391d4420993e256 100644 (file)
@@ -401,17 +401,17 @@ class DMAController < NetPort
 end
 
 class Cache < LibRubyObject
-  attr :size_kb, :latency
+  attr :size, :latency
   attr_writer :controller
-  def initialize(obj_name, size_kb, latency)
+  def initialize(obj_name, size, latency)
     super(obj_name)
-    assert size_kb.is_a?(Integer), "Cache size must be an integer"
-    @size_kb = size_kb
+    assert size.is_a?(Integer), "Cache size must be an integer"
+    @size = size
     @latency = latency
   end
 
   def args
-    "controller "+@controller.obj_name+" size_kb "+@size_kb.to_s+" latency "+@latency.to_s
+    "controller "+@controller.obj_name+" size "+@size.to_s+" latency "+@latency.to_s
   end
 end
 
@@ -422,8 +422,8 @@ class SetAssociativeCache < Cache
   #  when an integer, it represents the number of cycles for a hit
   #  when a float, it represents the cache access time in ns
   #  when set to "auto", libruby will attempt to find a realistic latency by running CACTI
-  def initialize(obj_name, size_kb, latency, assoc, replacement_policy)
-    super(obj_name, size_kb, latency)
+  def initialize(obj_name, size, latency, assoc, replacement_policy)
+    super(obj_name, size, latency)
     @assoc = assoc
     @replacement_policy = replacement_policy
   end
@@ -431,7 +431,7 @@ class SetAssociativeCache < Cache
   def calculateLatency()
     if @latency == "auto"
       cacti_args = Array.new()
-      cacti_args << (@size_kb*1024) <<  RubySystem.block_size_bytes << @assoc
+      cacti_args << (@size) <<  RubySystem.block_size_bytes << @assoc
       cacti_args << 1 << 0 << 0 << 0 << 1
       cacti_args << RubySystem.tech_nm << RubySystem.block_size_bytes*8
       cacti_args << 0 << 0 << 0 << 1 << 0 << 0 << 0 << 0 << 1
index 04adbcf696bb4d2aa1a295e9381edcd37bed7ffc..a5c881a61866e8c17b9978bc8a6cc620cc1e024c 100644 (file)
@@ -52,12 +52,12 @@ CacheMemory::CacheMemory(const string & name)
 
 void CacheMemory::init(const vector<string> & argv)
 {
-  int cache_size = 0;
+  int cache_size = -1;
   string policy;
 
   m_controller = NULL;
   for (uint32 i=0; i<argv.size(); i+=2) {
-    if (argv[i] == "size_kb") {
+    if (argv[i] == "size") {
       cache_size = atoi(argv[i+1].c_str());
     } else if (argv[i] == "latency") {
       m_latency = atoi(argv[i+1].c_str());
@@ -72,8 +72,12 @@ void CacheMemory::init(const vector<string> & argv)
     }
   }
 
-  m_cache_num_sets = cache_size / m_cache_assoc;
+  assert(cache_size != -1);
+  
+  m_cache_num_sets = (cache_size / m_cache_assoc) / RubySystem::getBlockSizeBytes();
+  assert(m_cache_num_sets > 1);
   m_cache_num_set_bits = log_int(m_cache_num_sets);
+  assert(m_cache_num_set_bits > 0);
 
   if(policy == "PSEUDO_LRU")
     m_replacementPolicy_ptr = new PseudoLRUPolicy(m_cache_num_sets, m_cache_assoc);