gem5  v20.1.0.0
Classes | Public Types | Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Friends | List of all members
Minor::LSQ Class Reference

#include <lsq.hh>

Inheritance diagram for Minor::LSQ:
Named

Classes

class  BarrierDataRequest
 Request for doing barrier accounting in the store buffer. More...
 
class  DcachePort
 Exposable data port. More...
 
class  FailedDataRequest
 FailedDataRequest represents requests from instructions that failed their predicates but need to ride the requests/transfers queues to maintain trace ordering. More...
 
class  LSQRequest
 Derived SenderState to carry data access info. More...
 
class  SingleDataRequest
 SingleDataRequest is used for requests that don't fragment. More...
 
class  SpecialDataRequest
 Special request types that don't actually issue memory requests. More...
 
class  SplitDataRequest
 
class  StoreBuffer
 Store buffer. More...
 

Public Types

typedef LSQRequestLSQRequestPtr
 
typedef Queue< LSQRequestPtr, ReportTraitsPtrAdaptor< LSQRequestPtr >, NoBubbleTraits< LSQRequestPtr > > LSQQueue
 The LSQ consists of three queues: requests, transfers and the store buffer storeBuffer. More...
 

Public Member Functions

 LSQ (std::string name_, std::string dcache_port_name_, MinorCPU &cpu_, Execute &execute_, unsigned int max_accesses_in_memory_system, unsigned int line_width, unsigned int requests_queue_size, unsigned int transfers_queue_size, unsigned int store_buffer_size, unsigned int store_buffer_cycle_store_limit)
 
virtual ~LSQ ()
 
void step ()
 Step checks the queues to see if their are issuable transfers which were not otherwise picked up by tests at the end of other events. More...
 
bool canRequest ()
 Is their space in the request queue to be able to push a request by issuing an isMemRef instruction. More...
 
LSQRequestPtr findResponse (MinorDynInstPtr inst)
 Returns a response if it's at the head of the transfers queue and it's either complete or can be sent on to the store buffer. More...
 
void popResponse (LSQRequestPtr response)
 Sanity check and pop the head response. More...
 
bool canPushIntoStoreBuffer () const
 Must check this before trying to insert into the store buffer. More...
 
void sendStoreToStoreBuffer (LSQRequestPtr request)
 A store has been committed, please move it to the store buffer. More...
 
bool accessesInFlight () const
 Are there any accesses other than normal cached loads in the memory system or having received responses which need to be handled for their instruction's to be completed. More...
 
void issuedMemBarrierInst (MinorDynInstPtr inst)
 A memory barrier instruction has been issued, remember its execSeqNum that we can avoid issuing memory ops until it is committed. More...
 
InstSeqNum getLastMemBarrier (ThreadID thread_id) const
 Get the execSeqNum of the last issued memory barrier. More...
 
bool isDrained ()
 Is there nothing left in the LSQ. More...
 
bool needsToTick ()
 May need to be ticked next cycle as one of the queues contains an actionable transfers or address translation. More...
 
void completeMemBarrierInst (MinorDynInstPtr inst, bool committed)
 Complete a barrier instruction. More...
 
Fault pushRequest (MinorDynInstPtr inst, bool isLoad, uint8_t *data, unsigned int size, Addr addr, Request::Flags flags, uint64_t *res, AtomicOpFunctorPtr amo_op, const std::vector< bool > &byte_enable=std::vector< bool >())
 Single interface for readMem/writeMem/amoMem to issue requests into the LSQ. More...
 
void pushFailedRequest (MinorDynInstPtr inst)
 Push a predicate failed-representing request into the queues just to maintain commit order. More...
 
bool recvTimingResp (PacketPtr pkt)
 Memory interface. More...
 
void recvReqRetry ()
 
void recvTimingSnoopReq (PacketPtr pkt)
 
MinorCPU::MinorCPUPortgetDcachePort ()
 Return the raw-bindable port. More...
 
void minorTrace () const
 
- Public Member Functions inherited from Named
 Named (const std::string &name_)
 
const std::string & name () const
 

Public Attributes

MemoryState state
 Retry state of last issued memory transfer. More...
 
const unsigned int inMemorySystemLimit
 Maximum number of in-flight accesses issued to the memory system. More...
 
const unsigned int lineWidth
 Memory system access width (and snap) in bytes. More...
 
LSQQueue requests
 requests contains LSQRequests which have been issued to the TLB by calling ExecContext::readMem/writeMem (which in turn calls LSQ::pushRequest and LSQRequest::startAddrTranslation). More...
 
LSQQueue transfers
 Once issued to memory (or, for stores, just had their state changed to StoreToStoreBuffer) LSQRequests pass through transfers waiting for memory responses. More...
 
StoreBuffer storeBuffer
 

Protected Types

enum  MemoryState { MemoryRunning, MemoryNeedsRetry }
 State of memory access for head access. More...
 
enum  AddrRangeCoverage { PartialAddrRangeCoverage, FullAddrRangeCoverage, NoAddrRangeCoverage }
 Coverage of one address range with another. More...
 

Protected Member Functions

void tryToSendToTransfers (LSQRequestPtr request)
 Try and issue a memory access for a translated request at the head of the requests queue. More...
 
bool tryToSend (LSQRequestPtr request)
 Try to send (or resend) a memory request's next/only packet to the memory system. More...
 
void clearMemBarrier (MinorDynInstPtr inst)
 Clear a barrier (if it's the last one marked up in lastMemBarrier) More...
 
void moveFromRequestsToTransfers (LSQRequestPtr request)
 Move a request between queues. More...
 
bool canSendToMemorySystem ()
 Can a request be sent to the memory system. More...
 
void threadSnoop (LSQRequestPtr request)
 Snoop other threads monitors on memory system accesses. More...
 

Protected Attributes

MinorCPUcpu
 My owner(s) More...
 
Executeexecute
 
DcachePort dcachePort
 
std::vector< InstSeqNumlastMemBarrier
 Most recent execSeqNum of a memory barrier instruction or 0 if there are no in-flight barriers. More...
 
unsigned int numAccessesInMemorySystem
 Count of the number of mem. More...
 
unsigned int numAccessesInDTLB
 Number of requests in the DTLB in the requests queue. More...
 
unsigned int numStoresInTransfers
 The number of stores in the transfers queue. More...
 
unsigned int numAccessesIssuedToMemory
 The number of accesses which have been issued to the memory system but have not been committed/discarded excluding cacheable normal loads which don't need to be tracked. More...
 
LSQRequestPtr retryRequest
 The request (from either requests or the store buffer) which is currently waiting have its memory access retried. More...
 
Addr cacheBlockMask
 Address Mask for a cache block (e.g. More...
 
- Protected Attributes inherited from Named
const std::string _name
 

Friends

std::ostream & operator<< (std::ostream &os, MemoryState state)
 Print MemoryState values as shown in the enum definition. More...
 
std::ostream & operator<< (std::ostream &os, AddrRangeCoverage state)
 
std::ostream & operator<< (std::ostream &os, LSQRequest::LSQRequestState state)
 

Detailed Description

Definition at line 59 of file lsq.hh.

Member Typedef Documentation

◆ LSQQueue

The LSQ consists of three queues: requests, transfers and the store buffer storeBuffer.

Definition at line 552 of file lsq.hh.

◆ LSQRequestPtr

Definition at line 266 of file lsq.hh.

Member Enumeration Documentation

◆ AddrRangeCoverage

Coverage of one address range with another.

Enumerator
PartialAddrRangeCoverage 
FullAddrRangeCoverage 
NoAddrRangeCoverage 

Definition at line 79 of file lsq.hh.

◆ MemoryState

enum Minor::LSQ::MemoryState
protected

State of memory access for head access.

Enumerator
MemoryRunning 
MemoryNeedsRetry 

Definition at line 68 of file lsq.hh.

Constructor & Destructor Documentation

◆ LSQ()

LSQ< Impl >::LSQ ( std::string  name_,
std::string  dcache_port_name_,
MinorCPU cpu_,
Execute execute_,
unsigned int  max_accesses_in_memory_system,
unsigned int  line_width,
unsigned int  requests_queue_size,
unsigned int  transfers_queue_size,
unsigned int  store_buffer_size,
unsigned int  store_buffer_cycle_store_limit 
)

Definition at line 1405 of file lsq.cc.

References fatal, lineWidth, and Named::name().

◆ ~LSQ()

LSQ< Impl >::~LSQ ( )
virtual

Definition at line 1460 of file lsq.cc.

Member Function Documentation

◆ accessesInFlight()

bool Minor::LSQ::accessesInFlight ( ) const
inline

Are there any accesses other than normal cached loads in the memory system or having received responses which need to be handled for their instruction's to be completed.

Definition at line 681 of file lsq.hh.

References numAccessesIssuedToMemory.

Referenced by Minor::Execute::isInbetweenInsts(), and Minor::Execute::takeInterrupt().

◆ canPushIntoStoreBuffer()

bool Minor::LSQ::canPushIntoStoreBuffer ( ) const
inline

Must check this before trying to insert into the store buffer.

Definition at line 673 of file lsq.hh.

References Minor::LSQ::StoreBuffer::canInsert(), and storeBuffer.

Referenced by Minor::Execute::commitInst().

◆ canRequest()

bool Minor::LSQ::canRequest ( )
inline

Is their space in the request queue to be able to push a request by issuing an isMemRef instruction.

Definition at line 661 of file lsq.hh.

References requests, and Minor::Queue< ElemType, ReportTraits, BubbleTraits >::unreservedRemainingSpace().

Referenced by Minor::Execute::commit(), Minor::Execute::executeMemRefInst(), and Minor::Execute::getCommittingThread().

◆ canSendToMemorySystem()

bool LSQ< Impl >::canSendToMemorySystem ( )
protected

Can a request be sent to the memory system.

Definition at line 1292 of file lsq.cc.

References inMemorySystemLimit, MemoryRunning, numAccessesInMemorySystem, and state.

Referenced by needsToTick(), tryToSend(), and tryToSendToTransfers().

◆ clearMemBarrier()

void LSQ< Impl >::clearMemBarrier ( MinorDynInstPtr  inst)
protected

Clear a barrier (if it's the last one marked up in lastMemBarrier)

Definition at line 255 of file lsq.cc.

References DPRINTF, and lastMemBarrier.

Referenced by completeMemBarrierInst().

◆ completeMemBarrierInst()

void LSQ< Impl >::completeMemBarrierInst ( MinorDynInstPtr  inst,
bool  committed 
)

Complete a barrier instruction.

Where committed, makes a BarrierDataRequest and pushed it into the store buffer

Definition at line 916 of file lsq.cc.

References clearMemBarrier(), Minor::LSQ::StoreBuffer::insert(), and storeBuffer.

Referenced by Minor::Execute::commit().

◆ findResponse()

LSQ::LSQRequestPtr LSQ< Impl >::findResponse ( MinorDynInstPtr  inst)

Returns a response if it's at the head of the transfers queue and it's either complete or can be sent on to the store buffer.

After calling, the request still remains on the transfer queue until popResponse is called

Definition at line 1489 of file lsq.cc.

References Minor::LSQ::StoreBuffer::canInsert(), DPRINTF, Minor::Queue< ElemType, ReportTraits, BubbleTraits >::empty(), Minor::Queue< ElemType, ReportTraits, BubbleTraits >::front(), Minor::LSQ::LSQRequest::inst, Minor::LSQ::LSQRequest::isBarrier(), Minor::LSQ::LSQRequest::isComplete(), Minor::LSQ::LSQRequest::state, storeBuffer, Minor::LSQ::LSQRequest::StoreToStoreBuffer, and transfers.

Referenced by Minor::Execute::commit(), Minor::Execute::evaluate(), and Minor::Execute::getCommittingThread().

◆ getDcachePort()

MinorCPU::MinorCPUPort& Minor::LSQ::getDcachePort ( )
inline

Return the raw-bindable port.

Definition at line 723 of file lsq.hh.

References dcachePort.

Referenced by Minor::Execute::getDcachePort().

◆ getLastMemBarrier()

InstSeqNum Minor::LSQ::getLastMemBarrier ( ThreadID  thread_id) const
inline

Get the execSeqNum of the last issued memory barrier.

Definition at line 690 of file lsq.hh.

References lastMemBarrier.

Referenced by Minor::Execute::commit(), and Minor::Execute::issue().

◆ isDrained()

bool LSQ< Impl >::isDrained ( )

◆ issuedMemBarrierInst()

void LSQ< Impl >::issuedMemBarrierInst ( MinorDynInstPtr  inst)

A memory barrier instruction has been issued, remember its execSeqNum that we can avoid issuing memory ops until it is committed.

Definition at line 1712 of file lsq.cc.

References lastMemBarrier.

Referenced by Minor::Execute::issue().

◆ minorTrace()

void LSQ< Impl >::minorTrace ( ) const

◆ moveFromRequestsToTransfers()

void LSQ< Impl >::moveFromRequestsToTransfers ( LSQRequestPtr  request)
protected

◆ needsToTick()

bool LSQ< Impl >::needsToTick ( )

◆ popResponse()

void LSQ< Impl >::popResponse ( LSQ::LSQRequestPtr  response)

◆ pushFailedRequest()

void LSQ< Impl >::pushFailedRequest ( MinorDynInstPtr  inst)

Push a predicate failed-representing request into the queues just to maintain commit order.

Definition at line 1661 of file lsq.cc.

References Minor::Queue< ElemType, ReportTraits, BubbleTraits >::push(), and requests.

Referenced by Minor::Execute::executeMemRefInst().

◆ pushRequest()

Fault LSQ< Impl >::pushRequest ( MinorDynInstPtr  inst,
bool  isLoad,
uint8_t *  data,
unsigned int  size,
Addr  addr,
Request::Flags  flags,
uint64_t *  res,
AtomicOpFunctorPtr  amo_op,
const std::vector< bool > &  byte_enable = std::vector<bool>() 
)

◆ recvReqRetry()

void LSQ< Impl >::recvReqRetry ( )

◆ recvTimingResp()

bool LSQ< Impl >::recvTimingResp ( PacketPtr  pkt)

◆ recvTimingSnoopReq()

void LSQ< Impl >::recvTimingSnoopReq ( PacketPtr  pkt)

◆ sendStoreToStoreBuffer()

void LSQ< Impl >::sendStoreToStoreBuffer ( LSQRequestPtr  request)

A store has been committed, please move it to the store buffer.

Definition at line 1546 of file lsq.cc.

References DPRINTF, Minor::LSQ::StoreBuffer::insert(), Minor::LSQ::LSQRequest::inst, Minor::LSQ::LSQRequest::state, storeBuffer, and Minor::LSQ::LSQRequest::StoreToStoreBuffer.

Referenced by Minor::Execute::handleMemResponse().

◆ step()

void LSQ< Impl >::step ( )

Step checks the queues to see if their are issuable transfers which were not otherwise picked up by tests at the end of other events.

Step the memory access mechanism on to its next state.

Steppable actions include deferred actions which couldn't be cascaded on the end of a memory response/TLB response event because of resource congestion.

In reality, most of the stepping is done by the callbacks on the LSQ but this function is responsible for issuing memory requests lodged in the requests queue.

Definition at line 1478 of file lsq.cc.

References Minor::Queue< ElemType, ReportTraits, BubbleTraits >::empty(), Minor::Queue< ElemType, ReportTraits, BubbleTraits >::front(), requests, Minor::LSQ::StoreBuffer::step(), storeBuffer, and tryToSendToTransfers().

Referenced by Minor::Execute::evaluate().

◆ threadSnoop()

void LSQ< Impl >::threadSnoop ( LSQRequestPtr  request)
protected

◆ tryToSend()

bool LSQ< Impl >::tryToSend ( LSQRequestPtr  request)
protected

◆ tryToSendToTransfers()

void LSQ< Impl >::tryToSendToTransfers ( LSQRequestPtr  request)
protected

Try and issue a memory access for a translated request at the head of the requests queue.

Also tries to move the request between queues

Definition at line 962 of file lsq.cc.

References cacheBlockMask, Minor::LSQ::StoreBuffer::canForwardDataToLoad(), canSendToMemorySystem(), Minor::LSQ::LSQRequest::Complete, cpu, DPRINTF, Minor::Queue< ElemType, ReportTraits, BubbleTraits >::empty(), execute, Minor::LSQ::LSQRequest::Failed, Minor::LSQ::StoreBuffer::forwardStoreData(), Minor::Queue< ElemType, ReportTraits, BubbleTraits >::front(), FullAddrRangeCoverage, ArmISA::handleLockedRead(), ArmISA::handleLockedWrite(), Minor::LSQ::LSQRequest::hasPacketsInMemSystem(), Minor::LSQ::LSQRequest::inst, Minor::Execute::instIsHeadInst(), Minor::Execute::instIsRightStream(), Minor::LSQ::LSQRequest::InTranslation, Minor::LSQ::LSQRequest::isComplete(), Minor::LSQ::StoreBuffer::isDrained(), Minor::LSQ::LSQRequest::isLoad, Minor::LSQ::LSQRequest::issuedToMemory, Packet::makeResponse(), MemoryNeedsRetry, moveFromRequestsToTransfers(), NoAddrRangeCoverage, NoFault, numAccessesIssuedToMemory, numStoresInTransfers, Minor::LSQ::LSQRequest::packet, PartialAddrRangeCoverage, SimpleThread::pcState(), Minor::LSQ::LSQRequest::request, Minor::LSQ::LSQRequest::RequestIssuing, requests, Minor::LSQ::LSQRequest::setSkipped(), Minor::LSQ::LSQRequest::setState(), Minor::LSQ::LSQRequest::state, state, storeBuffer, Minor::LSQ::LSQRequest::StoreToStoreBuffer, MinorCPU::threads, transfers, Minor::LSQ::LSQRequest::Translated, tryToSend(), and Minor::Queue< ElemType, ReportTraits, BubbleTraits >::unreservedRemainingSpace().

Referenced by step().

Friends And Related Function Documentation

◆ operator<< [1/3]

std::ostream& operator<< ( std::ostream &  os,
LSQ::AddrRangeCoverage  coverage 
)
friend

Definition at line 191 of file lsq.cc.

◆ operator<< [2/3]

std::ostream& operator<< ( std::ostream &  os,
LSQRequest::LSQRequestState  state 
)
friend

Definition at line 211 of file lsq.cc.

◆ operator<< [3/3]

std::ostream& operator<< ( std::ostream &  os,
LSQ::MemoryState  state 
)
friend

Print MemoryState values as shown in the enum definition.

Definition at line 1740 of file lsq.cc.

Member Data Documentation

◆ cacheBlockMask

Addr Minor::LSQ::cacheBlockMask
protected

Address Mask for a cache block (e.g.

~(cache_block_size-1))

Definition at line 614 of file lsq.hh.

Referenced by recvTimingSnoopReq(), threadSnoop(), and tryToSendToTransfers().

◆ cpu

MinorCPU& Minor::LSQ::cpu
protected

My owner(s)

Definition at line 63 of file lsq.hh.

Referenced by pushRequest(), recvTimingResp(), recvTimingSnoopReq(), threadSnoop(), tryToSend(), and tryToSendToTransfers().

◆ dcachePort

DcachePort Minor::LSQ::dcachePort
protected

Definition at line 112 of file lsq.hh.

Referenced by getDcachePort(), and tryToSend().

◆ execute

Execute& Minor::LSQ::execute
protected

Definition at line 64 of file lsq.hh.

Referenced by tryToSendToTransfers().

◆ inMemorySystemLimit

const unsigned int Minor::LSQ::inMemorySystemLimit

Maximum number of in-flight accesses issued to the memory system.

Definition at line 540 of file lsq.hh.

Referenced by canSendToMemorySystem().

◆ lastMemBarrier

std::vector<InstSeqNum> Minor::LSQ::lastMemBarrier
protected

Most recent execSeqNum of a memory barrier instruction or 0 if there are no in-flight barriers.

Useful as a dependency for early-issued memory operations

Definition at line 533 of file lsq.hh.

Referenced by clearMemBarrier(), getLastMemBarrier(), issuedMemBarrierInst(), and minorTrace().

◆ lineWidth

const unsigned int Minor::LSQ::lineWidth

Memory system access width (and snap) in bytes.

Definition at line 543 of file lsq.hh.

Referenced by LSQ(), and pushRequest().

◆ numAccessesInDTLB

unsigned int Minor::LSQ::numAccessesInDTLB
protected

Number of requests in the DTLB in the requests queue.

Definition at line 598 of file lsq.hh.

Referenced by minorTrace().

◆ numAccessesInMemorySystem

unsigned int Minor::LSQ::numAccessesInMemorySystem
protected

Count of the number of mem.

accesses which have left the requests queue and are in the 'wild' in the memory system and who must not be interrupted as they are not normal cacheable accesses. This is a count of the number of in-flight requests with issuedToMemory set who have visited tryToSendRequest at least once

Definition at line 595 of file lsq.hh.

Referenced by canSendToMemorySystem(), minorTrace(), recvTimingResp(), and tryToSend().

◆ numAccessesIssuedToMemory

unsigned int Minor::LSQ::numAccessesIssuedToMemory
protected

The number of accesses which have been issued to the memory system but have not been committed/discarded excluding cacheable normal loads which don't need to be tracked.

Definition at line 607 of file lsq.hh.

Referenced by accessesInFlight(), popResponse(), and tryToSendToTransfers().

◆ numStoresInTransfers

unsigned int Minor::LSQ::numStoresInTransfers
protected

The number of stores in the transfers queue.

Useful when testing if the store buffer contains all the forwardable stores

Definition at line 602 of file lsq.hh.

Referenced by minorTrace(), moveFromRequestsToTransfers(), popResponse(), and tryToSendToTransfers().

◆ requests

LSQQueue Minor::LSQ::requests

requests contains LSQRequests which have been issued to the TLB by calling ExecContext::readMem/writeMem (which in turn calls LSQ::pushRequest and LSQRequest::startAddrTranslation).

Once they have a physical address, requests at the head of requests can be issued to the memory system. At this stage, it cannot be clear that memory accesses must happen (that there are no preceding faults or changes of flow of control) and so only cacheable reads are issued to memory. Cacheable stores are not issued at all (and just pass through 'transfers' in order) and all other transfers are stalled in requests until their corresponding instructions are at the head of the inMemInsts instruction queue and have the right streamSeqNum.

Definition at line 566 of file lsq.hh.

Referenced by canRequest(), isDrained(), minorTrace(), moveFromRequestsToTransfers(), needsToTick(), pushFailedRequest(), pushRequest(), step(), and tryToSendToTransfers().

◆ retryRequest

LSQRequestPtr Minor::LSQ::retryRequest
protected

The request (from either requests or the store buffer) which is currently waiting have its memory access retried.

Definition at line 611 of file lsq.hh.

Referenced by recvReqRetry(), and tryToSend().

◆ state

MemoryState Minor::LSQ::state

◆ storeBuffer

StoreBuffer Minor::LSQ::storeBuffer

◆ transfers

LSQQueue Minor::LSQ::transfers

Once issued to memory (or, for stores, just had their state changed to StoreToStoreBuffer) LSQRequests pass through transfers waiting for memory responses.

At the head of transfers, Execute::commitInst can pick up the memory response for a request using LSQ::findResponse. Responses to be committed can then have ExecContext::completeAcc on them. Stores can then be pushed into the store buffer. All other transfers will then be complete.

Definition at line 575 of file lsq.hh.

Referenced by findResponse(), isDrained(), minorTrace(), moveFromRequestsToTransfers(), needsToTick(), popResponse(), and tryToSendToTransfers().


The documentation for this class was generated from the following files:

Generated on Wed Sep 30 2020 14:03:06 for gem5 by doxygen 1.8.17