changeset 13312d6e1caf in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=13312d6e1caf
description:
        ruby: coherence protocols: remove data block from dirctory entry
        This patch removes the data block present in the directory entry 
structure
        of each protocol in gem5's mainline.  Firstly, this is required for 
moving
        towards common set of memory controllers for classic and ruby memory 
systems.
        Secondly, the data block was being misused in several places.  It was 
being
        used for having free access to the physical memory instead of calling 
on the
        memory controller.

        From now on, the directory controller will not have a direct visibility 
into
        the physical memory.  The Memory Vector object now resides in the
        Memory Controller class.  This also means that some significant changes 
are
        being made to the functional accesses in ruby.

diffstat:

 src/mem/protocol/MESI_Three_Level-L0cache.sm       |   21 ++-
 src/mem/protocol/MESI_Three_Level-L1cache.sm       |   21 ++-
 src/mem/protocol/MESI_Two_Level-L1cache.sm         |   21 ++-
 src/mem/protocol/MESI_Two_Level-L2cache.sm         |   21 ++-
 src/mem/protocol/MESI_Two_Level-dir.sm             |   52 ++------
 src/mem/protocol/MESI_Two_Level-dma.sm             |   11 +-
 src/mem/protocol/MI_example-cache.sm               |   21 ++-
 src/mem/protocol/MI_example-dir.sm                 |   65 +++-------
 src/mem/protocol/MI_example-dma.sm                 |    8 +-
 src/mem/protocol/MOESI_CMP_directory-L1cache.sm    |   30 +++-
 src/mem/protocol/MOESI_CMP_directory-L2cache.sm    |   23 +++-
 src/mem/protocol/MOESI_CMP_directory-dir.sm        |   97 ++++----------
 src/mem/protocol/MOESI_CMP_directory-dma.sm        |    8 +-
 src/mem/protocol/MOESI_CMP_token-L1cache.sm        |   11 +-
 src/mem/protocol/MOESI_CMP_token-L2cache.sm        |   11 +-
 src/mem/protocol/MOESI_CMP_token-dir.sm            |   96 ++++++---------
 src/mem/protocol/MOESI_CMP_token-dma.sm            |    8 +-
 src/mem/protocol/MOESI_hammer-cache.sm             |   30 +++-
 src/mem/protocol/MOESI_hammer-dir.sm               |  128 ++++++++------------
 src/mem/protocol/MOESI_hammer-dma.sm               |    8 +-
 src/mem/protocol/Network_test-cache.sm             |    8 +-
 src/mem/protocol/Network_test-dir.sm               |    8 +-
 src/mem/protocol/RubySlicc_Types.sm                |    2 +
 src/mem/ruby/slicc_interface/AbstractCacheEntry.hh |    7 +
 src/mem/ruby/slicc_interface/AbstractController.hh |    3 +-
 src/mem/ruby/slicc_interface/AbstractEntry.hh      |    6 -
 src/mem/ruby/structures/DirectoryMemory.cc         |    2 -
 src/mem/ruby/structures/DirectoryMemory.hh         |    3 -
 src/mem/ruby/structures/MemoryControl.hh           |    4 +-
 src/mem/ruby/structures/RubyMemoryControl.cc       |   27 +++-
 src/mem/ruby/structures/RubyMemoryControl.hh       |   12 +-
 src/mem/ruby/system/System.cc                      |   45 +------
 32 files changed, 417 insertions(+), 401 deletions(-)

diffs (truncated from 1979 to 300 lines):

diff -r ca248520649f -r 13312d6e1caf 
src/mem/protocol/MESI_Three_Level-L0cache.sm
--- a/src/mem/protocol/MESI_Three_Level-L0cache.sm      Thu Nov 06 05:42:20 
2014 -0600
+++ b/src/mem/protocol/MESI_Three_Level-L0cache.sm      Thu Nov 06 05:42:20 
2014 -0600
@@ -205,13 +205,28 @@
     return AccessPermission:NotPresent;
   }
 
-  DataBlock getDataBlock(Address addr), return_by_ref="yes" {
+  void functionalRead(Address addr, Packet *pkt) {
     TBE tbe := TBEs[addr];
     if(is_valid(tbe)) {
-        return tbe.DataBlk;
+      testAndRead(addr, tbe.DataBlk, pkt);
+    } else {
+      testAndRead(addr, getCacheEntry(addr).DataBlk, pkt);
+    }
+  }
+
+  int functionalWrite(Address addr, Packet *pkt) {
+    int num_functional_writes := 0;
+
+    TBE tbe := TBEs[addr];
+    if(is_valid(tbe)) {
+      num_functional_writes := num_functional_writes +
+        testAndWrite(addr, tbe.DataBlk, pkt);
+      return num_functional_writes;
     }
 
-    return getCacheEntry(addr).DataBlk;
+    num_functional_writes := num_functional_writes +
+        testAndWrite(addr, getCacheEntry(addr).DataBlk, pkt);
+    return num_functional_writes;
   }
 
   void setAccessPermission(Entry cache_entry, Address addr, State state) {
diff -r ca248520649f -r 13312d6e1caf 
src/mem/protocol/MESI_Three_Level-L1cache.sm
--- a/src/mem/protocol/MESI_Three_Level-L1cache.sm      Thu Nov 06 05:42:20 
2014 -0600
+++ b/src/mem/protocol/MESI_Three_Level-L1cache.sm      Thu Nov 06 05:42:20 
2014 -0600
@@ -205,13 +205,28 @@
     return AccessPermission:NotPresent;
   }
 
-  DataBlock getDataBlock(Address addr), return_by_ref="yes" {
+  void functionalRead(Address addr, Packet *pkt) {
     TBE tbe := TBEs[addr];
     if(is_valid(tbe)) {
-        return tbe.DataBlk;
+      testAndRead(addr, tbe.DataBlk, pkt);
+    } else {
+      testAndRead(addr, getCacheEntry(addr).DataBlk, pkt);
+    }
+  }
+
+  int functionalWrite(Address addr, Packet *pkt) {
+    int num_functional_writes := 0;
+
+    TBE tbe := TBEs[addr];
+    if(is_valid(tbe)) {
+      num_functional_writes := num_functional_writes +
+        testAndWrite(addr, tbe.DataBlk, pkt);
+      return num_functional_writes;
     }
 
-    return getCacheEntry(addr).DataBlk;
+    num_functional_writes := num_functional_writes +
+        testAndWrite(addr, getCacheEntry(addr).DataBlk, pkt);
+    return num_functional_writes;
   }
 
   void setAccessPermission(Entry cache_entry, Address addr, State state) {
diff -r ca248520649f -r 13312d6e1caf src/mem/protocol/MESI_Two_Level-L1cache.sm
--- a/src/mem/protocol/MESI_Two_Level-L1cache.sm        Thu Nov 06 05:42:20 
2014 -0600
+++ b/src/mem/protocol/MESI_Two_Level-L1cache.sm        Thu Nov 06 05:42:20 
2014 -0600
@@ -224,13 +224,28 @@
     return AccessPermission:NotPresent;
   }
 
-  DataBlock getDataBlock(Address addr), return_by_ref="yes" {
+  void functionalRead(Address addr, Packet *pkt) {
     TBE tbe := TBEs[addr];
     if(is_valid(tbe)) {
-        return tbe.DataBlk;
+      testAndRead(addr, tbe.DataBlk, pkt);
+    } else {
+      testAndRead(addr, getCacheEntry(addr).DataBlk, pkt);
+    }
+  }
+
+  int functionalWrite(Address addr, Packet *pkt) {
+    int num_functional_writes := 0;
+
+    TBE tbe := TBEs[addr];
+    if(is_valid(tbe)) {
+      num_functional_writes := num_functional_writes +
+        testAndWrite(addr, tbe.DataBlk, pkt);
+      return num_functional_writes;
     }
 
-    return getCacheEntry(addr).DataBlk;
+    num_functional_writes := num_functional_writes +
+        testAndWrite(addr, getCacheEntry(addr).DataBlk, pkt);
+    return num_functional_writes;
   }
 
   void setAccessPermission(Entry cache_entry, Address addr, State state) {
diff -r ca248520649f -r 13312d6e1caf src/mem/protocol/MESI_Two_Level-L2cache.sm
--- a/src/mem/protocol/MESI_Two_Level-L2cache.sm        Thu Nov 06 05:42:20 
2014 -0600
+++ b/src/mem/protocol/MESI_Two_Level-L2cache.sm        Thu Nov 06 05:42:20 
2014 -0600
@@ -212,13 +212,28 @@
     return AccessPermission:NotPresent;
   }
 
-  DataBlock getDataBlock(Address addr), return_by_ref="yes" {
+  void functionalRead(Address addr, Packet *pkt) {
     TBE tbe := TBEs[addr];
     if(is_valid(tbe)) {
-        return tbe.DataBlk;
+      testAndRead(addr, tbe.DataBlk, pkt);
+    } else {
+      testAndRead(addr, getCacheEntry(addr).DataBlk, pkt);
+    }
+  }
+
+  int functionalWrite(Address addr, Packet *pkt) {
+    int num_functional_writes := 0;
+
+    TBE tbe := TBEs[addr];
+    if(is_valid(tbe)) {
+      num_functional_writes := num_functional_writes +
+        testAndWrite(addr, tbe.DataBlk, pkt);
+      return num_functional_writes;
     }
 
-    return getCacheEntry(addr).DataBlk;
+    num_functional_writes := num_functional_writes +
+        testAndWrite(addr, getCacheEntry(addr).DataBlk, pkt);
+    return num_functional_writes;
   }
 
   void setAccessPermission(Entry cache_entry, Address addr, State state) {
diff -r ca248520649f -r 13312d6e1caf src/mem/protocol/MESI_Two_Level-dir.sm
--- a/src/mem/protocol/MESI_Two_Level-dir.sm    Thu Nov 06 05:42:20 2014 -0600
+++ b/src/mem/protocol/MESI_Two_Level-dir.sm    Thu Nov 06 05:42:20 2014 -0600
@@ -73,7 +73,6 @@
   // DirectoryEntry
   structure(Entry, desc="...", interface="AbstractEntry") {
     State DirectoryState,          desc="Directory state";
-    DataBlock DataBlk,             desc="data for the block";
     MachineID Owner;
   }
 
@@ -90,6 +89,8 @@
     void allocate(Address);
     void deallocate(Address);
     bool isPresent(Address);
+    bool functionalRead(Packet *pkt);
+    int functionalWrite(Packet *pkt);
   }
 
 
@@ -148,13 +149,22 @@
     return AccessPermission:NotPresent;
   }
 
-  DataBlock getDataBlock(Address addr), return_by_ref="yes" {
+  void functionalRead(Address addr, Packet *pkt) {
     TBE tbe := TBEs[addr];
     if(is_valid(tbe)) {
-        return tbe.DataBlk;
+      testAndRead(addr, tbe.DataBlk, pkt);
+    } else {
+      memBuffer.functionalRead(pkt);
+    }
+  }
+
+  int functionalWrite(Address addr, Packet *pkt) {
+    TBE tbe := TBEs[addr];
+    if(is_valid(tbe)) {
+      testAndWrite(addr, tbe.DataBlk, pkt);
     }
 
-    return getDirectoryEntry(addr).DataBlk;
+    return memBuffer.functionalWrite(pkt);
   }
 
   void setAccessPermission(Address addr, State state) {
@@ -297,7 +307,6 @@
         out_msg.OriginalRequestorMachId := in_msg.Requestor;
         out_msg.MessageSize := in_msg.MessageSize;
         out_msg.Prefetch := in_msg.Prefetch;
-        out_msg.DataBlk := getDirectoryEntry(in_msg.Addr).DataBlk;
 
         DPRINTF(RubySlicc, "%s\n", out_msg);
       }
@@ -320,13 +329,6 @@
     }
   }
 
-  action(m_writeDataToMemory, "m", desc="Write dirty writeback to memory") {
-    peek(responseNetwork_in, ResponseMsg) {
-      getDirectoryEntry(in_msg.Addr).DataBlk := in_msg.DataBlk;
-      DPRINTF(RubySlicc, "Address: %s, Data Block: %s\n",
-              in_msg.Addr, in_msg.DataBlk);
-    }
-  }
 //added by SS for dma
   action(qf_queueMemoryFetchRequestDMA, "qfd", desc="Queue off-chip fetch 
request") {
     peek(requestNetwork_in, RequestMsg) {
@@ -336,7 +338,6 @@
         out_msg.Sender := machineID;
         out_msg.OriginalRequestorMachId := machineID;
         out_msg.MessageSize := in_msg.MessageSize;
-        out_msg.DataBlk := getDirectoryEntry(address).DataBlk;
         DPRINTF(RubySlicc, "%s\n", out_msg);
       }
     }
@@ -358,25 +359,14 @@
     }
   }
 
-  action(dw_writeDMAData, "dw", desc="DMA Write data to memory") {
-    peek(requestNetwork_in, RequestMsg) {
-      getDirectoryEntry(address).DataBlk.copyPartial(in_msg.DataBlk, 
addressOffset(in_msg.Addr), in_msg.Len);
-    }
-  }
-
   action(qw_queueMemoryWBRequest_partial, "qwp", desc="Queue off-chip 
writeback request") {
      peek(requestNetwork_in, RequestMsg) {
       enqueue(memQueue_out, MemoryMsg, to_mem_ctrl_latency) {
         out_msg.Addr := address;
         out_msg.Type := MemoryRequestType:MEMORY_WB;
         out_msg.OriginalRequestorMachId := machineID;
-        //out_msg.DataBlk := in_msg.DataBlk;
         out_msg.DataBlk.copyPartial(in_msg.DataBlk, addressOffset(address), 
in_msg.Len);
-
-
         out_msg.MessageSize := in_msg.MessageSize;
-        //out_msg.Prefetch := in_msg.Prefetch;
-
         DPRINTF(RubySlicc, "%s\n", out_msg);
       }
     }
@@ -434,15 +424,6 @@
     }
   }
 
-  action(dwt_writeDMADataFromTBE, "dwt", desc="DMA Write data to memory from 
TBE") {
-    assert(is_valid(tbe));
-    //getDirectoryEntry(address).DataBlk.copyPartial(tbe.DataBlk, tbe.Offset, 
tbe.Len);
-    getDirectoryEntry(address).DataBlk.copyPartial(tbe.DataBlk, 
addressOffset(tbe.PhysicalAddress), tbe.Len);
-
-
-  }
-
-
   action(qw_queueMemoryWBRequest_partialTBE, "qwt", desc="Queue off-chip 
writeback request") {
     peek(responseNetwork_in, ResponseMsg) {
       enqueue(memQueue_out, MemoryMsg, to_mem_ctrl_latency) {
@@ -493,7 +474,6 @@
   }
 
   transition(M, Data, MI) {
-    m_writeDataToMemory;
     qw_queueMemoryWBRequest;
     k_popIncomingResponseQueue;
   }
@@ -518,7 +498,6 @@
   }
 
   transition(I, DMA_WRITE, ID_W) {
-    dw_writeDMAData;
     qw_queueMemoryWBRequest_partial;
     j_popIncomingRequestQueue;
   }
@@ -545,7 +524,6 @@
 
   transition(M_DRD, Data, M_DRDI) {
     drp_sendDMAData;
-    m_writeDataToMemory;
     qw_queueMemoryWBRequest;
     k_popIncomingResponseQueue;
   }
@@ -563,13 +541,11 @@
   }
 
   transition(M_DWR, Data, M_DWRI) {
-    m_writeDataToMemory;
     qw_queueMemoryWBRequest_partialTBE;
     k_popIncomingResponseQueue;
   }
 
   transition(M_DWRI, Memory_Ack, I) {
-    dwt_writeDMADataFromTBE;
     aa_sendAck;
     da_sendDMAAck;
     w_deallocateTBE;
diff -r ca248520649f -r 13312d6e1caf src/mem/protocol/MESI_Two_Level-dma.sm
--- a/src/mem/protocol/MESI_Two_Level-dma.sm    Thu Nov 06 05:42:20 2014 -0600
+++ b/src/mem/protocol/MESI_Two_Level-dma.sm    Thu Nov 06 05:42:20 2014 -0600
@@ -55,8 +55,9 @@
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to