ruby: mesi two,three level: copy data only when dirty
authorNilay Vaish <nilay@cs.wisc.edu>
Tue, 4 Aug 2015 03:44:28 +0000 (22:44 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Tue, 4 Aug 2015 03:44:28 +0000 (22:44 -0500)
The level 2 controller has a bug. In one particular action, the data block was
copied from a message irrespective whether the block is dirty or not.  In cases
when L1 sends no data, the data value copied was incorrect.

src/mem/protocol/MESI_Two_Level-L2cache.sm

index ede4206261ef8f2cc70233a1a252dcdb7a52f811..6afd0fcea9dbf4a34b0ac658f08193b71e1199a3 100644 (file)
@@ -628,8 +628,8 @@ machine(L2Cache, "MESI Directory L2 Cache CMP")
   action(mr_writeDataToCacheFromRequest, "mr", desc="Write data from response queue to cache") {
     peek(L1RequestL2Network_in, RequestMsg) {
       assert(is_valid(cache_entry));
-      cache_entry.DataBlk := in_msg.DataBlk;
       if (in_msg.Dirty) {
+        cache_entry.DataBlk := in_msg.DataBlk;
         cache_entry.Dirty := in_msg.Dirty;
       }
     }