Dear All,
I was trying to understand the SLICC code for *MESI_Three_Level*
protocol. During the process, I have found an issue in the protocol. Please
correct me if I am wrong.
*Caches in three level protocol:* L0 (Private), L1 (Private) and L2
(shared).
*The issue:* The issue is between L1 and L0. When a forwarded GETS
request arrives at L1 (say L1-x) from any other L1 (say L1-y) via L2, the
block is evicted from the local L0 (L0-x) before forwarding it to the
requesting L1 (L1-y). In my understanding, a shared block should not get
evicted from L0-x before forwarding the block to L1-y under forwarded GETS
request.
The following code is from *MESI_Three_Level_L1.sm*. In this code, in
case of *in_msg.Type == **CoherenceRequestType:GETS,* if the block is in L0
then *trigger(Event:L0_Invalidate_Else, in_msg.addr,.....)* is called to
invalidate the block from L0.
in_port(requestNetwork_in, RequestMsg, requestFromL2, rank = 2) {
..................................
if (in_msg.Type == CoherenceRequestType:INV) {
if (is_valid(cache_entry) && inL0Cache(cache_entry.CacheState))
{
trigger(Event:L0_Invalidate_Else, in_msg.addr,
cache_entry, tbe);
} else {
trigger(Event:Inv, in_msg.addr, cache_entry, tbe);
}
} else if (in_msg.Type == CoherenceRequestType:GETX ||
in_msg.Type == CoherenceRequestType:UPGRADE) {
if (is_valid(cache_entry) && inL0Cache(cache_entry.CacheState))
{ // If the block is in L0 then remove it.
trigger(Event:L0_Invalidate_Else, in_msg.addr,
cache_entry, tbe);
} else {
trigger(Event:Fwd_GETX, in_msg.addr, cache_entry, tbe);
//This line is forwarding block directly from L1.
}
* } else if (in_msg.Type == CoherenceRequestType:GETS) {*
if (is_valid(cache_entry) && inL0Cache(cache_entry.CacheState))
{ *// If the block is in L0 then invalidate it.*
trigger(Event:L0_Invalidate_Else, in_msg.addr,
cache_entry, tbe);
} else {
trigger(Event:Fwd_GETS, in_msg.addr, cache_entry, tbe);
//This line is forwarding block directly from L1.
.............................................
The *MESI_Three_Level_L0.sm* has transitions for f*wd_GETS* and
*fwd_GETX,* but from my understanding, such transitions will never occur in
L0 as L1 is not sending appropriate CoherenceRequest to L0. The
*Actions *written
in *MESI_Three_Level_L1.sm *are not forwarding any
*CoherenceClass:GETS* message
to L0. The *Actions* written in L1 (*MESI_Three_Level_L1.sm*) are only
sending *CoherenceClass:INV* request to L0 (*MESI_Three_Level_L0.sm*).
Thanks and Regards,
Dr. Shirshendu Das
Assistant Professor,
Department of CSE,
Indian Institute of Technology Ropar, Punjab, India
http://cse.iitrpr.ac.in/shirshendu/shirshendu.html
Ph: 9435277250
_______________________________________________
gem5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users