114184Sgabeblack@google.com/* 214184Sgabeblack@google.com * Copyright (c) 2009-2012 Mark D. Hill and David A. Wood 314184Sgabeblack@google.com * Copyright (c) 2010-2012 Advanced Micro Devices, Inc. 414184Sgabeblack@google.com * All rights reserved. 514184Sgabeblack@google.com * 614184Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 714184Sgabeblack@google.com * modification, are permitted provided that the following conditions are 814184Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 914184Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 1014184Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1114184Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1214184Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1314184Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1414184Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1514184Sgabeblack@google.com * this software without specific prior written permission. 1614184Sgabeblack@google.com * 1714184Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1814184Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1914184Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2014184Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2114184Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2214184Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2314184Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2414184Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2514184Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2614184Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2714184Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2814184Sgabeblack@google.com */ 2914184Sgabeblack@google.com 3014184Sgabeblack@google.commachine(MachineType:Directory, "Directory protocol") 3114184Sgabeblack@google.com : DirectoryMemory * directory; 3214184Sgabeblack@google.com Cycles directory_latency := 12; 3314184Sgabeblack@google.com Cycles to_memory_controller_latency := 1; 3414184Sgabeblack@google.com 3514184Sgabeblack@google.com MessageBuffer * forwardFromDir, network="To", virtual_network="3", 3614184Sgabeblack@google.com vnet_type="forward"; 3714184Sgabeblack@google.com MessageBuffer * responseFromDir, network="To", virtual_network="4", 3814184Sgabeblack@google.com vnet_type="response"; 3914184Sgabeblack@google.com MessageBuffer * dmaResponseFromDir, network="To", virtual_network="1", 4014184Sgabeblack@google.com vnet_type="response"; 4114184Sgabeblack@google.com 4214184Sgabeblack@google.com MessageBuffer * requestToDir, network="From", virtual_network="2", 4314184Sgabeblack@google.com vnet_type="request"; 4414184Sgabeblack@google.com MessageBuffer * dmaRequestToDir, network="From", virtual_network="0", 4514184Sgabeblack@google.com vnet_type="request"; 4614184Sgabeblack@google.com MessageBuffer * responseFromMemory; 4714184Sgabeblack@google.com{ 4814184Sgabeblack@google.com // STATES 4914184Sgabeblack@google.com state_declaration(State, desc="Directory states", default="Directory_State_I") { 5014184Sgabeblack@google.com // Base states 5114184Sgabeblack@google.com I, AccessPermission:Read_Write, desc="Invalid"; 5214184Sgabeblack@google.com M, AccessPermission:Invalid, desc="Modified"; 5314184Sgabeblack@google.com 5414184Sgabeblack@google.com M_DRD, AccessPermission:Busy, desc="Blocked on an invalidation for a DMA read"; 5514184Sgabeblack@google.com M_DWR, AccessPermission:Busy, desc="Blocked on an invalidation for a DMA write"; 5614184Sgabeblack@google.com 5714184Sgabeblack@google.com M_DWRI, AccessPermission:Busy, desc="Intermediate state M_DWR-->I"; 5814184Sgabeblack@google.com M_DRDI, AccessPermission:Busy, desc="Intermediate state M_DRD-->I"; 5914184Sgabeblack@google.com 6014184Sgabeblack@google.com IM, AccessPermission:Busy, desc="Intermediate state I-->M"; 6114184Sgabeblack@google.com MI, AccessPermission:Busy, desc="Intermediate state M-->I"; 6214184Sgabeblack@google.com ID, AccessPermission:Busy, desc="Intermediate state for DMA_READ when in I"; 6314184Sgabeblack@google.com ID_W, AccessPermission:Busy, desc="Intermediate state for DMA_WRITE when in I"; 6414184Sgabeblack@google.com } 6514184Sgabeblack@google.com 6614184Sgabeblack@google.com // Events 6714184Sgabeblack@google.com enumeration(Event, desc="Directory events") { 6814184Sgabeblack@google.com // processor requests 6914184Sgabeblack@google.com GETX, desc="A GETX arrives"; 7014184Sgabeblack@google.com GETS, desc="A GETS arrives"; 7114184Sgabeblack@google.com PUTX, desc="A PUTX arrives"; 7214184Sgabeblack@google.com PUTX_NotOwner, desc="A PUTX arrives"; 7314184Sgabeblack@google.com 7414184Sgabeblack@google.com // DMA requests 7514184Sgabeblack@google.com DMA_READ, desc="A DMA Read memory request"; 7614184Sgabeblack@google.com DMA_WRITE, desc="A DMA Write memory request"; 7714184Sgabeblack@google.com 7814184Sgabeblack@google.com // Memory Controller 7914184Sgabeblack@google.com Memory_Data, desc="Fetched data from memory arrives"; 8014184Sgabeblack@google.com Memory_Ack, desc="Writeback Ack from memory arrives"; 8114184Sgabeblack@google.com } 8214184Sgabeblack@google.com 8314184Sgabeblack@google.com // TYPES 8414184Sgabeblack@google.com 8514184Sgabeblack@google.com // DirectoryEntry 8614184Sgabeblack@google.com structure(Entry, desc="...", interface="AbstractEntry") { 8714184Sgabeblack@google.com State DirectoryState, desc="Directory state"; 8814184Sgabeblack@google.com NetDest Sharers, desc="Sharers for this block"; 8914184Sgabeblack@google.com NetDest Owner, desc="Owner of this block"; 9014184Sgabeblack@google.com } 9114184Sgabeblack@google.com 9214184Sgabeblack@google.com // TBE entries for DMA requests 9314184Sgabeblack@google.com structure(TBE, desc="TBE entries for outstanding DMA requests") { 9414184Sgabeblack@google.com Addr PhysicalAddress, desc="physical address"; 9514184Sgabeblack@google.com State TBEState, desc="Transient State"; 9614184Sgabeblack@google.com DataBlock DataBlk, desc="Data to be written (DMA write only)"; 9714184Sgabeblack@google.com int Len, desc="..."; 9814184Sgabeblack@google.com MachineID DmaRequestor, desc="DMA requestor"; 9914184Sgabeblack@google.com } 10014184Sgabeblack@google.com 10114184Sgabeblack@google.com structure(TBETable, external="yes") { 10214184Sgabeblack@google.com TBE lookup(Addr); 10314184Sgabeblack@google.com void allocate(Addr); 10414184Sgabeblack@google.com void deallocate(Addr); 10514184Sgabeblack@google.com bool isPresent(Addr); 10614184Sgabeblack@google.com } 10714184Sgabeblack@google.com 10814184Sgabeblack@google.com // ** OBJECTS ** 10914184Sgabeblack@google.com TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs"; 11014184Sgabeblack@google.com 11114184Sgabeblack@google.com Tick clockEdge(); 11214184Sgabeblack@google.com Cycles ticksToCycles(Tick t); 11314184Sgabeblack@google.com Tick cyclesToTicks(Cycles c); 11414184Sgabeblack@google.com void set_tbe(TBE b); 11514184Sgabeblack@google.com void unset_tbe(); 11614184Sgabeblack@google.com 11714184Sgabeblack@google.com Entry getDirectoryEntry(Addr addr), return_by_pointer="yes" { 11814184Sgabeblack@google.com Entry dir_entry := static_cast(Entry, "pointer", directory[addr]); 11914184Sgabeblack@google.com 12014184Sgabeblack@google.com if (is_valid(dir_entry)) { 12114184Sgabeblack@google.com return dir_entry; 12214184Sgabeblack@google.com } 12314184Sgabeblack@google.com 12414184Sgabeblack@google.com dir_entry := static_cast(Entry, "pointer", 12514184Sgabeblack@google.com directory.allocate(addr, new Entry)); 12614184Sgabeblack@google.com return dir_entry; 12714184Sgabeblack@google.com } 12814184Sgabeblack@google.com 12914184Sgabeblack@google.com State getState(TBE tbe, Addr addr) { 13014184Sgabeblack@google.com if (is_valid(tbe)) { 13114184Sgabeblack@google.com return tbe.TBEState; 13214184Sgabeblack@google.com } else if (directory.isPresent(addr)) { 13314184Sgabeblack@google.com return getDirectoryEntry(addr).DirectoryState; 13414184Sgabeblack@google.com } else { 13514184Sgabeblack@google.com return State:I; 13614184Sgabeblack@google.com } 13714184Sgabeblack@google.com } 13814184Sgabeblack@google.com 13914184Sgabeblack@google.com void setState(TBE tbe, Addr addr, State state) { 14014184Sgabeblack@google.com 14114184Sgabeblack@google.com if (is_valid(tbe)) { 14214184Sgabeblack@google.com tbe.TBEState := state; 14314184Sgabeblack@google.com } 14414184Sgabeblack@google.com 14514184Sgabeblack@google.com if (directory.isPresent(addr)) { 14614184Sgabeblack@google.com 14714184Sgabeblack@google.com if (state == State:M) { 14814184Sgabeblack@google.com assert(getDirectoryEntry(addr).Owner.count() == 1); 14914184Sgabeblack@google.com assert(getDirectoryEntry(addr).Sharers.count() == 0); 15014184Sgabeblack@google.com } 15114184Sgabeblack@google.com 15214184Sgabeblack@google.com getDirectoryEntry(addr).DirectoryState := state; 15314184Sgabeblack@google.com 15414184Sgabeblack@google.com if (state == State:I) { 15514184Sgabeblack@google.com assert(getDirectoryEntry(addr).Owner.count() == 0); 15614184Sgabeblack@google.com assert(getDirectoryEntry(addr).Sharers.count() == 0); 15714184Sgabeblack@google.com } 15814184Sgabeblack@google.com } 15914184Sgabeblack@google.com } 16014184Sgabeblack@google.com 16114184Sgabeblack@google.com AccessPermission getAccessPermission(Addr addr) { 16214184Sgabeblack@google.com TBE tbe := TBEs[addr]; 16314184Sgabeblack@google.com if(is_valid(tbe)) { 16414184Sgabeblack@google.com return Directory_State_to_permission(tbe.TBEState); 16514184Sgabeblack@google.com } 16614184Sgabeblack@google.com 16714184Sgabeblack@google.com if(directory.isPresent(addr)) { 16814184Sgabeblack@google.com return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState); 16914184Sgabeblack@google.com } 17014184Sgabeblack@google.com 17114184Sgabeblack@google.com return AccessPermission:NotPresent; 17214184Sgabeblack@google.com } 17314184Sgabeblack@google.com 17414184Sgabeblack@google.com void setAccessPermission(Addr addr, State state) { 17514184Sgabeblack@google.com if (directory.isPresent(addr)) { 17614184Sgabeblack@google.com getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state)); 17714184Sgabeblack@google.com } 17814184Sgabeblack@google.com } 17914184Sgabeblack@google.com 18014184Sgabeblack@google.com void functionalRead(Addr addr, Packet *pkt) { 18114184Sgabeblack@google.com TBE tbe := TBEs[addr]; 18214184Sgabeblack@google.com if(is_valid(tbe)) { 18314184Sgabeblack@google.com testAndRead(addr, tbe.DataBlk, pkt); 18414184Sgabeblack@google.com } else { 18514184Sgabeblack@google.com functionalMemoryRead(pkt); 18614184Sgabeblack@google.com } 18714184Sgabeblack@google.com } 18814184Sgabeblack@google.com 18914184Sgabeblack@google.com int functionalWrite(Addr addr, Packet *pkt) { 19014184Sgabeblack@google.com int num_functional_writes := 0; 19114184Sgabeblack@google.com 19214184Sgabeblack@google.com TBE tbe := TBEs[addr]; 19314184Sgabeblack@google.com if(is_valid(tbe)) { 19414184Sgabeblack@google.com num_functional_writes := num_functional_writes + 19514184Sgabeblack@google.com testAndWrite(addr, tbe.DataBlk, pkt); 19614184Sgabeblack@google.com } 19714184Sgabeblack@google.com 19814184Sgabeblack@google.com num_functional_writes := num_functional_writes + functionalMemoryWrite(pkt); 19914184Sgabeblack@google.com return num_functional_writes; 20014184Sgabeblack@google.com } 20114184Sgabeblack@google.com 20214184Sgabeblack@google.com // ** OUT_PORTS ** 20314184Sgabeblack@google.com out_port(forwardNetwork_out, RequestMsg, forwardFromDir); 20414184Sgabeblack@google.com out_port(responseNetwork_out, ResponseMsg, responseFromDir); 20514184Sgabeblack@google.com out_port(requestQueue_out, ResponseMsg, requestToDir); // For recycling requests 20614184Sgabeblack@google.com out_port(dmaResponseNetwork_out, DMAResponseMsg, dmaResponseFromDir); 20714184Sgabeblack@google.com 20814184Sgabeblack@google.com // ** IN_PORTS ** 20914184Sgabeblack@google.com in_port(dmaRequestQueue_in, DMARequestMsg, dmaRequestToDir) { 21014184Sgabeblack@google.com if (dmaRequestQueue_in.isReady(clockEdge())) { 21114184Sgabeblack@google.com peek(dmaRequestQueue_in, DMARequestMsg) { 21214184Sgabeblack@google.com TBE tbe := TBEs[in_msg.LineAddress]; 21314184Sgabeblack@google.com if (in_msg.Type == DMARequestType:READ) { 21414184Sgabeblack@google.com trigger(Event:DMA_READ, in_msg.LineAddress, tbe); 21514184Sgabeblack@google.com } else if (in_msg.Type == DMARequestType:WRITE) { 21614184Sgabeblack@google.com trigger(Event:DMA_WRITE, in_msg.LineAddress, tbe); 21714184Sgabeblack@google.com } else { 21814184Sgabeblack@google.com error("Invalid message"); 21914184Sgabeblack@google.com } 22014184Sgabeblack@google.com } 22114184Sgabeblack@google.com } 22214184Sgabeblack@google.com } 22314184Sgabeblack@google.com 22414184Sgabeblack@google.com in_port(requestQueue_in, RequestMsg, requestToDir) { 22514184Sgabeblack@google.com if (requestQueue_in.isReady(clockEdge())) { 22614184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 22714184Sgabeblack@google.com TBE tbe := TBEs[in_msg.addr]; 22814184Sgabeblack@google.com if (in_msg.Type == CoherenceRequestType:GETS) { 22914184Sgabeblack@google.com trigger(Event:GETS, in_msg.addr, tbe); 23014184Sgabeblack@google.com } else if (in_msg.Type == CoherenceRequestType:GETX) { 23114184Sgabeblack@google.com trigger(Event:GETX, in_msg.addr, tbe); 23214184Sgabeblack@google.com } else if (in_msg.Type == CoherenceRequestType:PUTX) { 23314184Sgabeblack@google.com if (getDirectoryEntry(in_msg.addr).Owner.isElement(in_msg.Requestor)) { 23414184Sgabeblack@google.com trigger(Event:PUTX, in_msg.addr, tbe); 23514184Sgabeblack@google.com } else { 23614184Sgabeblack@google.com trigger(Event:PUTX_NotOwner, in_msg.addr, tbe); 23714184Sgabeblack@google.com } 23814184Sgabeblack@google.com } else { 23914184Sgabeblack@google.com error("Invalid message"); 24014184Sgabeblack@google.com } 24114184Sgabeblack@google.com } 24214184Sgabeblack@google.com } 24314184Sgabeblack@google.com } 24414184Sgabeblack@google.com 24514184Sgabeblack@google.com//added by SS 24614184Sgabeblack@google.com // off-chip memory request/response is done 24714184Sgabeblack@google.com in_port(memQueue_in, MemoryMsg, responseFromMemory) { 24814184Sgabeblack@google.com if (memQueue_in.isReady(clockEdge())) { 24914184Sgabeblack@google.com peek(memQueue_in, MemoryMsg) { 25014184Sgabeblack@google.com TBE tbe := TBEs[in_msg.addr]; 25114184Sgabeblack@google.com if (in_msg.Type == MemoryRequestType:MEMORY_READ) { 25214184Sgabeblack@google.com trigger(Event:Memory_Data, in_msg.addr, tbe); 25314184Sgabeblack@google.com } else if (in_msg.Type == MemoryRequestType:MEMORY_WB) { 25414184Sgabeblack@google.com trigger(Event:Memory_Ack, in_msg.addr, tbe); 25514184Sgabeblack@google.com } else { 25614184Sgabeblack@google.com DPRINTF(RubySlicc,"%s\n", in_msg.Type); 25714184Sgabeblack@google.com error("Invalid message"); 25814184Sgabeblack@google.com } 25914184Sgabeblack@google.com } 26014184Sgabeblack@google.com } 26114184Sgabeblack@google.com } 26214184Sgabeblack@google.com 26314184Sgabeblack@google.com // Actions 26414184Sgabeblack@google.com 26514184Sgabeblack@google.com action(a_sendWriteBackAck, "a", desc="Send writeback ack to requestor") { 26614184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 26714184Sgabeblack@google.com enqueue(forwardNetwork_out, RequestMsg, directory_latency) { 26814184Sgabeblack@google.com out_msg.addr := address; 26914184Sgabeblack@google.com out_msg.Type := CoherenceRequestType:WB_ACK; 27014184Sgabeblack@google.com out_msg.Requestor := in_msg.Requestor; 27114184Sgabeblack@google.com out_msg.Destination.add(in_msg.Requestor); 27214184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Writeback_Control; 27314184Sgabeblack@google.com } 27414184Sgabeblack@google.com } 27514184Sgabeblack@google.com } 27614184Sgabeblack@google.com 27714184Sgabeblack@google.com action(l_sendWriteBackAck, "la", desc="Send writeback ack to requestor") { 27814184Sgabeblack@google.com peek(memQueue_in, MemoryMsg) { 27914184Sgabeblack@google.com enqueue(forwardNetwork_out, RequestMsg, 1) { 28014184Sgabeblack@google.com out_msg.addr := address; 28114184Sgabeblack@google.com out_msg.Type := CoherenceRequestType:WB_ACK; 28214184Sgabeblack@google.com out_msg.Requestor := in_msg.OriginalRequestorMachId; 28314184Sgabeblack@google.com out_msg.Destination.add(in_msg.OriginalRequestorMachId); 28414184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Writeback_Control; 28514184Sgabeblack@google.com } 28614184Sgabeblack@google.com } 28714184Sgabeblack@google.com } 28814184Sgabeblack@google.com 28914184Sgabeblack@google.com action(b_sendWriteBackNack, "b", desc="Send writeback nack to requestor") { 29014184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 29114184Sgabeblack@google.com enqueue(forwardNetwork_out, RequestMsg, directory_latency) { 29214184Sgabeblack@google.com out_msg.addr := address; 29314184Sgabeblack@google.com out_msg.Type := CoherenceRequestType:WB_NACK; 29414184Sgabeblack@google.com out_msg.Requestor := in_msg.Requestor; 29514184Sgabeblack@google.com out_msg.Destination.add(in_msg.Requestor); 29614184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Writeback_Control; 29714184Sgabeblack@google.com } 29814184Sgabeblack@google.com } 29914184Sgabeblack@google.com } 30014184Sgabeblack@google.com 30114184Sgabeblack@google.com action(c_clearOwner, "c", desc="Clear the owner field") { 30214184Sgabeblack@google.com getDirectoryEntry(address).Owner.clear(); 30314184Sgabeblack@google.com } 30414184Sgabeblack@google.com 30514184Sgabeblack@google.com action(d_sendData, "d", desc="Send data to requestor") { 30614184Sgabeblack@google.com peek(memQueue_in, MemoryMsg) { 30714184Sgabeblack@google.com enqueue(responseNetwork_out, ResponseMsg, 1) { 30814184Sgabeblack@google.com out_msg.addr := address; 30914184Sgabeblack@google.com out_msg.Type := CoherenceResponseType:DATA; 31014184Sgabeblack@google.com out_msg.Sender := machineID; 31114184Sgabeblack@google.com out_msg.Destination.add(in_msg.OriginalRequestorMachId); 31214184Sgabeblack@google.com out_msg.DataBlk := in_msg.DataBlk; 31314184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Response_Data; 31414184Sgabeblack@google.com } 31514184Sgabeblack@google.com } 31614184Sgabeblack@google.com } 31714184Sgabeblack@google.com 31814184Sgabeblack@google.com action(dr_sendDMAData, "dr", desc="Send Data to DMA controller from directory") { 31914184Sgabeblack@google.com peek(memQueue_in, MemoryMsg) { 32014184Sgabeblack@google.com enqueue(dmaResponseNetwork_out, DMAResponseMsg, 1) { 32114184Sgabeblack@google.com assert(is_valid(tbe)); 32214184Sgabeblack@google.com out_msg.PhysicalAddress := address; 32314184Sgabeblack@google.com out_msg.LineAddress := address; 32414184Sgabeblack@google.com out_msg.Type := DMAResponseType:DATA; 32514184Sgabeblack@google.com out_msg.DataBlk := in_msg.DataBlk; // we send the entire data block and rely on the dma controller to split it up if need be 32614184Sgabeblack@google.com out_msg.Destination.add(tbe.DmaRequestor); 32714184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Response_Data; 32814184Sgabeblack@google.com } 32914184Sgabeblack@google.com } 33014184Sgabeblack@google.com } 33114184Sgabeblack@google.com 33214184Sgabeblack@google.com 33314184Sgabeblack@google.com 33414184Sgabeblack@google.com action(drp_sendDMAData, "drp", desc="Send Data to DMA controller from incoming PUTX") { 33514184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 33614184Sgabeblack@google.com enqueue(dmaResponseNetwork_out, DMAResponseMsg, 1) { 33714184Sgabeblack@google.com assert(is_valid(tbe)); 33814184Sgabeblack@google.com out_msg.PhysicalAddress := address; 33914184Sgabeblack@google.com out_msg.LineAddress := address; 34014184Sgabeblack@google.com out_msg.Type := DMAResponseType:DATA; 34114184Sgabeblack@google.com 34214184Sgabeblack@google.com // we send the entire data block and rely on the dma controller 34314184Sgabeblack@google.com // to split it up if need be 34414184Sgabeblack@google.com out_msg.DataBlk := in_msg.DataBlk; 34514184Sgabeblack@google.com out_msg.Destination.add(tbe.DmaRequestor); 34614184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Response_Data; 34714184Sgabeblack@google.com } 34814184Sgabeblack@google.com } 34914184Sgabeblack@google.com } 35014184Sgabeblack@google.com 35114184Sgabeblack@google.com action(da_sendDMAAck, "da", desc="Send Ack to DMA controller") { 35214184Sgabeblack@google.com enqueue(dmaResponseNetwork_out, DMAResponseMsg, 1) { 35314184Sgabeblack@google.com assert(is_valid(tbe)); 35414184Sgabeblack@google.com out_msg.PhysicalAddress := address; 35514184Sgabeblack@google.com out_msg.LineAddress := address; 35614184Sgabeblack@google.com out_msg.Type := DMAResponseType:ACK; 35714184Sgabeblack@google.com out_msg.Destination.add(tbe.DmaRequestor); 35814184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Writeback_Control; 35914184Sgabeblack@google.com } 36014184Sgabeblack@google.com } 36114184Sgabeblack@google.com 36214184Sgabeblack@google.com action(e_ownerIsRequestor, "e", desc="The owner is now the requestor") { 36314184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 36414184Sgabeblack@google.com getDirectoryEntry(address).Owner.clear(); 36514184Sgabeblack@google.com getDirectoryEntry(address).Owner.add(in_msg.Requestor); 36614184Sgabeblack@google.com } 36714184Sgabeblack@google.com } 36814184Sgabeblack@google.com 36914184Sgabeblack@google.com action(f_forwardRequest, "f", desc="Forward request to owner") { 37014184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 37114184Sgabeblack@google.com APPEND_TRANSITION_COMMENT("Own: "); 37214184Sgabeblack@google.com APPEND_TRANSITION_COMMENT(getDirectoryEntry(in_msg.addr).Owner); 37314184Sgabeblack@google.com APPEND_TRANSITION_COMMENT("Req: "); 37414184Sgabeblack@google.com APPEND_TRANSITION_COMMENT(in_msg.Requestor); 37514184Sgabeblack@google.com enqueue(forwardNetwork_out, RequestMsg, directory_latency) { 37614184Sgabeblack@google.com out_msg.addr := address; 37714184Sgabeblack@google.com out_msg.Type := in_msg.Type; 37814184Sgabeblack@google.com out_msg.Requestor := in_msg.Requestor; 37914184Sgabeblack@google.com out_msg.Destination := getDirectoryEntry(in_msg.addr).Owner; 38014184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Writeback_Control; 38114184Sgabeblack@google.com } 38214184Sgabeblack@google.com } 38314184Sgabeblack@google.com } 38414184Sgabeblack@google.com 38514184Sgabeblack@google.com action(inv_sendCacheInvalidate, "inv", desc="Invalidate a cache block") { 38614184Sgabeblack@google.com peek(dmaRequestQueue_in, DMARequestMsg) { 38714184Sgabeblack@google.com enqueue(forwardNetwork_out, RequestMsg, directory_latency) { 38814184Sgabeblack@google.com out_msg.addr := address; 38914184Sgabeblack@google.com out_msg.Type := CoherenceRequestType:INV; 39014184Sgabeblack@google.com out_msg.Requestor := machineID; 39114184Sgabeblack@google.com out_msg.Destination := getDirectoryEntry(in_msg.PhysicalAddress).Owner; 39214184Sgabeblack@google.com out_msg.MessageSize := MessageSizeType:Writeback_Control; 39314184Sgabeblack@google.com } 39414184Sgabeblack@google.com } 39514184Sgabeblack@google.com } 39614184Sgabeblack@google.com 39714184Sgabeblack@google.com action(i_popIncomingRequestQueue, "i", desc="Pop incoming request queue") { 39814184Sgabeblack@google.com requestQueue_in.dequeue(clockEdge()); 39914184Sgabeblack@google.com } 40014184Sgabeblack@google.com 40114184Sgabeblack@google.com action(p_popIncomingDMARequestQueue, "p", desc="Pop incoming DMA queue") { 40214184Sgabeblack@google.com dmaRequestQueue_in.dequeue(clockEdge()); 40314184Sgabeblack@google.com } 40414184Sgabeblack@google.com 40514184Sgabeblack@google.com action(v_allocateTBE, "v", desc="Allocate TBE") { 40614184Sgabeblack@google.com peek(dmaRequestQueue_in, DMARequestMsg) { 40714184Sgabeblack@google.com TBEs.allocate(address); 40814184Sgabeblack@google.com set_tbe(TBEs[address]); 40914184Sgabeblack@google.com tbe.DataBlk := in_msg.DataBlk; 41014184Sgabeblack@google.com tbe.PhysicalAddress := in_msg.PhysicalAddress; 41114184Sgabeblack@google.com tbe.Len := in_msg.Len; 41214184Sgabeblack@google.com tbe.DmaRequestor := in_msg.Requestor; 41314184Sgabeblack@google.com } 41414184Sgabeblack@google.com } 41514184Sgabeblack@google.com 41614184Sgabeblack@google.com action(r_allocateTbeForDmaRead, "\r", desc="Allocate TBE for DMA Read") { 41714184Sgabeblack@google.com peek(dmaRequestQueue_in, DMARequestMsg) { 41814184Sgabeblack@google.com TBEs.allocate(address); 41914184Sgabeblack@google.com set_tbe(TBEs[address]); 42014184Sgabeblack@google.com tbe.DmaRequestor := in_msg.Requestor; 42114184Sgabeblack@google.com } 42214184Sgabeblack@google.com } 42314184Sgabeblack@google.com 42414184Sgabeblack@google.com action(v_allocateTBEFromRequestNet, "\v", desc="Allocate TBE") { 42514184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 42614184Sgabeblack@google.com TBEs.allocate(address); 42714184Sgabeblack@google.com set_tbe(TBEs[address]); 42814184Sgabeblack@google.com tbe.DataBlk := in_msg.DataBlk; 42914184Sgabeblack@google.com } 43014184Sgabeblack@google.com } 43114184Sgabeblack@google.com 43214184Sgabeblack@google.com action(w_deallocateTBE, "w", desc="Deallocate TBE") { 43314184Sgabeblack@google.com TBEs.deallocate(address); 43414184Sgabeblack@google.com unset_tbe(); 43514184Sgabeblack@google.com } 43614184Sgabeblack@google.com 43714184Sgabeblack@google.com action(z_recycleRequestQueue, "z", desc="recycle request queue") { 43814184Sgabeblack@google.com requestQueue_in.recycle(clockEdge(), cyclesToTicks(recycle_latency)); 43914184Sgabeblack@google.com } 44014184Sgabeblack@google.com 44114184Sgabeblack@google.com action(y_recycleDMARequestQueue, "y", desc="recycle dma request queue") { 44214184Sgabeblack@google.com dmaRequestQueue_in.recycle(clockEdge(), cyclesToTicks(recycle_latency)); 44314184Sgabeblack@google.com } 44414184Sgabeblack@google.com 44514184Sgabeblack@google.com 44614184Sgabeblack@google.com action(qf_queueMemoryFetchRequest, "qf", desc="Queue off-chip fetch request") { 44714184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 44814184Sgabeblack@google.com queueMemoryRead(in_msg.Requestor, address, to_memory_controller_latency); 44914184Sgabeblack@google.com } 45014184Sgabeblack@google.com } 45114184Sgabeblack@google.com 45214184Sgabeblack@google.com action(qf_queueMemoryFetchRequestDMA, "qfd", desc="Queue off-chip fetch request") { 45314184Sgabeblack@google.com peek(dmaRequestQueue_in, DMARequestMsg) { 45414184Sgabeblack@google.com queueMemoryRead(in_msg.Requestor, address, to_memory_controller_latency); 45514184Sgabeblack@google.com } 45614184Sgabeblack@google.com } 45714184Sgabeblack@google.com 45814184Sgabeblack@google.com action(qw_queueMemoryWBRequest_partial, "qwp", desc="Queue off-chip writeback request") { 45914184Sgabeblack@google.com peek(dmaRequestQueue_in, DMARequestMsg) { 46014184Sgabeblack@google.com queueMemoryWritePartial(in_msg.Requestor, address, 46114184Sgabeblack@google.com to_memory_controller_latency, in_msg.DataBlk, 46214184Sgabeblack@google.com in_msg.Len); 46314184Sgabeblack@google.com } 46414184Sgabeblack@google.com } 46514184Sgabeblack@google.com 46614184Sgabeblack@google.com action(qw_queueMemoryWBRequest_partialTBE, "qwt", desc="Queue off-chip writeback request") { 46714184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 46814184Sgabeblack@google.com queueMemoryWritePartial(in_msg.Requestor, address, 46914184Sgabeblack@google.com to_memory_controller_latency, tbe.DataBlk, 47014184Sgabeblack@google.com tbe.Len); 47114184Sgabeblack@google.com } 47214184Sgabeblack@google.com } 47314184Sgabeblack@google.com 47414184Sgabeblack@google.com action(l_queueMemoryWBRequest, "lq", desc="Write PUTX data to memory") { 47514184Sgabeblack@google.com peek(requestQueue_in, RequestMsg) { 47614184Sgabeblack@google.com queueMemoryWrite(in_msg.Requestor, address, to_memory_controller_latency, 47714184Sgabeblack@google.com in_msg.DataBlk); 47814184Sgabeblack@google.com } 47914184Sgabeblack@google.com } 48014184Sgabeblack@google.com 48114184Sgabeblack@google.com action(l_popMemQueue, "q", desc="Pop off-chip request queue") { 48214184Sgabeblack@google.com memQueue_in.dequeue(clockEdge()); 48314184Sgabeblack@google.com } 48414184Sgabeblack@google.com 48514184Sgabeblack@google.com // TRANSITIONS 48614184Sgabeblack@google.com transition({M_DRD, M_DWR, M_DWRI, M_DRDI}, GETX) { 48714184Sgabeblack@google.com z_recycleRequestQueue; 48814184Sgabeblack@google.com } 48914184Sgabeblack@google.com 49014184Sgabeblack@google.com transition({IM, MI, ID, ID_W}, {GETX, GETS, PUTX, PUTX_NotOwner} ) { 49114184Sgabeblack@google.com z_recycleRequestQueue; 49214184Sgabeblack@google.com } 49314184Sgabeblack@google.com 49414184Sgabeblack@google.com transition({IM, MI, ID, ID_W}, {DMA_READ, DMA_WRITE} ) { 49514184Sgabeblack@google.com y_recycleDMARequestQueue; 49614184Sgabeblack@google.com } 49714184Sgabeblack@google.com 49814184Sgabeblack@google.com 49914184Sgabeblack@google.com transition(I, GETX, IM) { 50014184Sgabeblack@google.com //d_sendData; 50114184Sgabeblack@google.com v_allocateTBEFromRequestNet; 50214184Sgabeblack@google.com qf_queueMemoryFetchRequest; 50314184Sgabeblack@google.com e_ownerIsRequestor; 50414184Sgabeblack@google.com i_popIncomingRequestQueue; 50514184Sgabeblack@google.com } 50614184Sgabeblack@google.com 50714184Sgabeblack@google.com transition(IM, Memory_Data, M) { 50814184Sgabeblack@google.com d_sendData; 50914184Sgabeblack@google.com //e_ownerIsRequestor; 51014184Sgabeblack@google.com w_deallocateTBE; 51114184Sgabeblack@google.com l_popMemQueue; 51214184Sgabeblack@google.com } 51314184Sgabeblack@google.com 51414184Sgabeblack@google.com 51514184Sgabeblack@google.com transition(I, DMA_READ, ID) { 51614184Sgabeblack@google.com //dr_sendDMAData; 51714184Sgabeblack@google.com r_allocateTbeForDmaRead; 51814184Sgabeblack@google.com qf_queueMemoryFetchRequestDMA; 51914184Sgabeblack@google.com p_popIncomingDMARequestQueue; 52014184Sgabeblack@google.com } 52114184Sgabeblack@google.com 52214184Sgabeblack@google.com transition(ID, Memory_Data, I) { 52314184Sgabeblack@google.com dr_sendDMAData; 52414184Sgabeblack@google.com //p_popIncomingDMARequestQueue; 52514184Sgabeblack@google.com w_deallocateTBE; 52614184Sgabeblack@google.com l_popMemQueue; 52714184Sgabeblack@google.com } 52814184Sgabeblack@google.com 52914184Sgabeblack@google.com 53014184Sgabeblack@google.com 53114184Sgabeblack@google.com transition(I, DMA_WRITE, ID_W) { 53214184Sgabeblack@google.com v_allocateTBE; 53314184Sgabeblack@google.com qw_queueMemoryWBRequest_partial; 53414184Sgabeblack@google.com p_popIncomingDMARequestQueue; 53514184Sgabeblack@google.com } 53614184Sgabeblack@google.com 53714184Sgabeblack@google.com transition(ID_W, Memory_Ack, I) { 53814184Sgabeblack@google.com da_sendDMAAck; 53914184Sgabeblack@google.com w_deallocateTBE; 54014184Sgabeblack@google.com l_popMemQueue; 54114184Sgabeblack@google.com } 54214184Sgabeblack@google.com 54314184Sgabeblack@google.com transition(M, DMA_READ, M_DRD) { 54414184Sgabeblack@google.com v_allocateTBE; 54514184Sgabeblack@google.com inv_sendCacheInvalidate; 54614184Sgabeblack@google.com p_popIncomingDMARequestQueue; 54714184Sgabeblack@google.com } 54814184Sgabeblack@google.com 54914184Sgabeblack@google.com transition(M_DRD, PUTX, M_DRDI) { 55014184Sgabeblack@google.com drp_sendDMAData; 55114184Sgabeblack@google.com c_clearOwner; 55214184Sgabeblack@google.com l_queueMemoryWBRequest; 55314184Sgabeblack@google.com i_popIncomingRequestQueue; 55414184Sgabeblack@google.com } 55514184Sgabeblack@google.com 55614184Sgabeblack@google.com transition(M_DRDI, Memory_Ack, I) { 55714184Sgabeblack@google.com l_sendWriteBackAck; 55814184Sgabeblack@google.com w_deallocateTBE; 55914184Sgabeblack@google.com l_popMemQueue; 56014184Sgabeblack@google.com } 56114184Sgabeblack@google.com 56214184Sgabeblack@google.com 56314184Sgabeblack@google.com transition(M, DMA_WRITE, M_DWR) { 56414184Sgabeblack@google.com v_allocateTBE; 56514184Sgabeblack@google.com inv_sendCacheInvalidate; 56614184Sgabeblack@google.com p_popIncomingDMARequestQueue; 56714184Sgabeblack@google.com } 56814184Sgabeblack@google.com 56914184Sgabeblack@google.com transition(M_DWR, PUTX, M_DWRI) { 57014184Sgabeblack@google.com qw_queueMemoryWBRequest_partialTBE; 57114184Sgabeblack@google.com c_clearOwner; 57214184Sgabeblack@google.com i_popIncomingRequestQueue; 57314184Sgabeblack@google.com } 57414184Sgabeblack@google.com 57514184Sgabeblack@google.com transition(M_DWRI, Memory_Ack, I) { 57614184Sgabeblack@google.com l_sendWriteBackAck; 57714184Sgabeblack@google.com da_sendDMAAck; 57814184Sgabeblack@google.com w_deallocateTBE; 57914184Sgabeblack@google.com l_popMemQueue; 58014184Sgabeblack@google.com } 58114184Sgabeblack@google.com 58214184Sgabeblack@google.com transition(M, GETX, M) { 58314184Sgabeblack@google.com f_forwardRequest; 58414184Sgabeblack@google.com e_ownerIsRequestor; 58514184Sgabeblack@google.com i_popIncomingRequestQueue; 58614184Sgabeblack@google.com } 58714184Sgabeblack@google.com 58814184Sgabeblack@google.com transition(M, PUTX, MI) { 58914184Sgabeblack@google.com c_clearOwner; 59014184Sgabeblack@google.com v_allocateTBEFromRequestNet; 59114184Sgabeblack@google.com l_queueMemoryWBRequest; 59214184Sgabeblack@google.com i_popIncomingRequestQueue; 59314184Sgabeblack@google.com } 59414184Sgabeblack@google.com 59514184Sgabeblack@google.com transition(MI, Memory_Ack, I) { 59614184Sgabeblack@google.com l_sendWriteBackAck; 59714184Sgabeblack@google.com w_deallocateTBE; 59814184Sgabeblack@google.com l_popMemQueue; 59914184Sgabeblack@google.com } 60014184Sgabeblack@google.com 60114184Sgabeblack@google.com transition(M, PUTX_NotOwner, M) { 60214184Sgabeblack@google.com b_sendWriteBackNack; 60314184Sgabeblack@google.com i_popIncomingRequestQueue; 60414184Sgabeblack@google.com } 60514184Sgabeblack@google.com 60614184Sgabeblack@google.com transition(I, PUTX_NotOwner, I) { 60714184Sgabeblack@google.com b_sendWriteBackNack; 60814184Sgabeblack@google.com i_popIncomingRequestQueue; 60914184Sgabeblack@google.com } 61014184Sgabeblack@google.com} 611