====== Write Back Cache internals ======
===== Cache line state =====
The finite state automaton below represent the possible states associated with the MESI protocol dealing
with cache coherency in CMP environment based on a snooping bus.
{{ cachewb:mesi.png }}
* [[Coherency Protocols]]
===== Cache request state =====
Read and Write requests are put in the cache queue. Those cache queue entry have a large amount of
different states: For instance a read request will become a read miss, then a read miss that has been
requested to the memory, then a read miss that has been answered by the memory, and the data will be
sent back to the cpu.
The Figure 6.3 present the different possible values of this cache queue state. The green and red boxes
represents the possible cache request states. The blue rounded boxes represents the different functions
where the transition occurs in the cache module. \\
The black filled boxes occurs when the request is removed from the queue.
==== Read requests ====
digraph deps
{ bgcolor=white
size="7,10"
node [shape=box,style=filled,fillcolor=lightgrey,color=black,fontsize=8,fontname="Helvetica",height=0.33]
READ [fillcolor=palegreen]
READ_HIT_READY [fillcolor=palegreen]
READ_MISS [fillcolor=palegreen]
READ_MISS_REQUESTED [fillcolor=palegreen]
READ_MISS_READY [fillcolor=palegreen]
READ_MISS_LINE_READY [fillcolor=palegreen]
READ_MISS_SERVICED [fillcolor=palegreen]
READ_MISS_EVICTION [fillcolor=palegreen]
READ_MISS_EVICTION_WRITE_DONE [fillcolor=palegreen]
READ_MISS_EVICTION_WRITE_DONE_REQUESTED [fillcolor=palegreen]
READ_MISS_EVICTION_WRITE_DONE_READY [fillcolor=palegreen]
READ_MISS_EVICTION_WRITE_DONE_SERVICED [fillcolor=palegreen]
node [shape=rect,style="rounded,filled",fillcolor=lightblue,color=black,fontsize=8]
SetCacheHeadReadState
CheckMemAcceptData
ReadMemData
ReadMemData2 [label="ReadMemData"]
ReadMemData5 [label="ReadMemData"]
CheckCPUAcceptedData
CheckCPUAcceptedData2 [label="CheckCPUAcceptedData"]
CheckCPUAcceptedData3 [label="CheckCPUAcceptedData"]
CheckCPUAcceptedData4 [label="CheckCPUAcceptedData"]
CheckMemAcceptedDatafromCache
CheckMemAcceptedDatafromCache2 [label="CheckMemAcceptedDatafromCache"]
UpdateCachePipelineWithWriteBuffer
UpdateCachePipelineWithWriteBuffer2 [label="UpdateCachePipelineWithWriteBuffer"]
node [shape=rect,color=black,style=filled,fillcolor=black,label="",width=0.25,height=0.125]
/* ----------------- */
READ -> SetCacheHeadReadState
SetCacheHeadReadState -> READ_MISS
SetCacheHeadReadState -> READ_MISS_EVICTION
SetCacheHeadReadState -> READ_HIT_READY
READ_MISS_EVICTION -> CheckMemAcceptedDatafromCache -> READ_MISS_EVICTION_WRITE_DONE
READ_MISS_EVICTION_WRITE_DONE -> CheckMemAcceptedDatafromCache2 -> READ_MISS_EVICTION_WRITE_DONE_REQUESTED
READ_MISS_EVICTION_WRITE_DONE_REQUESTED -> UpdateCachePipelineWithWriteBuffer2 -> READ_MISS_EVICTION_WRITE_DONE_READY
READ_MISS_EVICTION_WRITE_DONE_READY -> CheckCPUAcceptedData4 -> READ_MISS_EVICTION_WRITE_DONE_SERVICED
READ_MISS_EVICTION_WRITE_DONE_READY -> ReadMemData5 -> READ_MISS_LINE_READY
READ_MISS_EVICTION_WRITE_DONE_SERVICED -> T6
READ_HIT_READY -> CheckCPUAcceptedData2 -> T4
READ_MISS -> CheckMemAcceptData -> READ_MISS_REQUESTED
READ_MISS_REQUESTED -> UpdateCachePipelineWithWriteBuffer -> READ_MISS_READY
READ_MISS_READY -> CheckCPUAcceptedData -> READ_MISS_SERVICED
READ_MISS_READY -> ReadMemData2 -> READ_MISS_LINE_READY
READ_MISS_LINE_READY -> CheckCPUAcceptedData3 -> T5
READ_MISS_SERVICED -> ReadMemData -> T1
}
==== Write requests ====
digraph deps
{ bgcolor=white
size="7,10"
node [shape=box,style=filled,fillcolor=lightgrey,color=black,fontsize=8,fontname="Helvetica",height=0.33]
WRITE [fillcolor=lightsalmon]
WRITE_MISS [fillcolor=lightsalmon]
WRITE_MISS_REQUESTED [fillcolor=lightsalmon]
WRITE_MISS_EVICTION [fillcolor=lightsalmon]
WRITE_MISS_EVICTION_WRITE_DONE [fillcolor=lightsalmon]
WRITE_MISS_EVICTION_WRITE_DONE_REQUESTED [fillcolor=lightsalmon]
node [shape=rect,style="rounded,filled",fillcolor=lightblue,color=black,fontsize=8]
ReadMemData3 [label="ReadMemData"]
ReadMemData4 [label="ReadMemData"]
CheckMemAcceptedDatafromCache3 [label="CheckMemAcceptedDatafromCache"]
CheckMemAcceptedDatafromCache4 [label="CheckMemAcceptedDatafromCache"]
CheckMemAcceptedDatafromCache5 [label="CheckMemAcceptedDatafromCache"]
SetCacheHeadWriteState
node [shape=rect,color=black,style=filled,fillcolor=black,label="",width=0.25,height=0.125]
/* ----------------- */
WRITE -> SetCacheHeadWriteState
SetCacheHeadWriteState -> T2
SetCacheHeadWriteState -> WRITE_MISS
SetCacheHeadWriteState -> WRITE_MISS_EVICTION
WRITE_MISS -> CheckMemAcceptedDatafromCache3 -> WRITE_MISS_REQUESTED
WRITE_MISS_REQUESTED -> ReadMemData3 -> T3
WRITE_MISS_EVICTION -> CheckMemAcceptedDatafromCache4 -> WRITE_MISS_EVICTION_WRITE_DONE
WRITE_MISS_EVICTION_WRITE_DONE -> CheckMemAcceptedDatafromCache5 -> WRITE_MISS_EVICTION_WRITE_DONE_REQUESTED
WRITE_MISS_EVICTION_WRITE_DONE_REQUESTED -> ReadMemData4 -> T8
}