gem5
|
A layer is an internal crossbar arbitration point with its own flow control. More...
#include <xbar.hh>
Public Member Functions | |
Layer (DstType &_port, BaseXBar &_xbar, const std::string &_name) | |
Create a layer and give it a name. More... | |
DrainState | drain () override |
Drain according to the normal semantics, so that the crossbar can tell the layer to drain, and pass an event to signal back when drained. More... | |
const std::string | name () const |
Get the crossbar layer's name. More... | |
bool | tryTiming (SrcType *src_port) |
Determine if the layer accepts a packet from a specific port. More... | |
void | succeededTiming (Tick busy_time) |
Deal with a destination port accepting a packet by potentially removing the source port from the retry list (if retrying) and occupying the layer accordingly. More... | |
void | failedTiming (SrcType *src_port, Tick busy_time) |
Deal with a destination port not accepting a packet by potentially adding the source port to the retry list (if not already at the front) and occupying the layer accordingly. More... | |
void | occupyLayer (Tick until) |
Occupy the layer until until. More... | |
void | retryWaiting () |
Send a retry to the port at the head of waitingForLayer. More... | |
void | recvRetry () |
Handle a retry from a neighbouring module. More... | |
void | regStats () |
Register stats for the layer. More... | |
Public Member Functions inherited from Drainable | |
DrainState | drainState () const |
Return the current drain state of an object. More... | |
virtual void | notifyFork () |
Notify a child process of a fork. More... | |
Protected Member Functions | |
virtual void | sendRetry (SrcType *retry_port)=0 |
Sending the actual retry, in a manner specific to the individual layers. More... | |
Protected Member Functions inherited from Drainable | |
Drainable () | |
virtual | ~Drainable () |
virtual void | drainResume () |
Resume execution after a successful drain. More... | |
void | signalDrainDone () const |
Signal that an object is drained. More... | |
Private Types | |
enum | State { IDLE, BUSY, RETRY } |
We declare an enum to track the state of the layer. More... | |
Private Member Functions | |
void | releaseLayer () |
Release the layer after being occupied and return to an idle state where we proceed to send a retry to any potential waiting port, or drain if asked to do so. More... | |
Private Attributes | |
DstType & | port |
The destination port this layer converges at. More... | |
BaseXBar & | xbar |
The crossbar this layer is a part of. More... | |
std::string | _name |
A name for this layer. More... | |
State | state |
track the state of the layer More... | |
std::deque< SrcType * > | waitingForLayer |
A deque of ports that retry should be called on because the original send was delayed due to a busy layer. More... | |
SrcType * | waitingForPeer |
Track who is waiting for the retry when receiving it from a peer. More... | |
EventWrapper< Layer,&Layer::releaseLayer > | releaseEvent |
event used to schedule a release of the layer More... | |
Stats::Scalar | occupancy |
Stats for occupancy and utilization. More... | |
Stats::Formula | utilization |
A layer is an internal crossbar arbitration point with its own flow control.
Each layer is a converging multiplexer tree. By instantiating one layer per destination port (and per packet type, i.e. request, response, snoop request and snoop response), we model full crossbar structures like AXI, ACE, PCIe, etc.
The template parameter, PortClass, indicates the destination port type for the layer. The retry list holds either master ports or slave ports, depending on the direction of the layer. Thus, a request layer has a retry list containing slave ports, whereas a response layer holds master ports.
|
private |
We declare an enum to track the state of the layer.
The starting point is an idle state where the layer is waiting for a packet to arrive. Upon arrival, the layer transitions to the busy state, where it remains either until the packet transfer is done, or the header time is spent. Once the layer leaves the busy state, it can either go back to idle, if no packets have arrived while it was busy, or the layer goes on to retry the first port in waitingForLayer. A similar transition takes place from idle to retry if the layer receives a retry from one of its connected ports. The retry state lasts until the port in questions calls sendTiming and returns control to the layer, or goes to a busy state if the port does not immediately react to the retry by calling sendTiming.
Enumerator | |
---|---|
IDLE | |
BUSY | |
RETRY |
BaseXBar::Layer< SrcType, DstType >::Layer | ( | DstType & | _port, |
BaseXBar & | _xbar, | ||
const std::string & | _name | ||
) |
|
overridevirtual |
void BaseXBar::Layer< SrcType, DstType >::failedTiming | ( | SrcType * | src_port, |
Tick | busy_time | ||
) |
|
inline |
void BaseXBar::Layer< SrcType, DstType >::occupyLayer | ( | Tick | until | ) |
void BaseXBar::Layer< SrcType, DstType >::recvRetry | ( | ) |
void BaseXBar::Layer< SrcType, DstType >::regStats | ( | ) |
Register stats for the layer.
Definition at line 607 of file xbar.cc.
References SimObject::name(), Stats::nozero, and simTicks.
|
private |
Release the layer after being occupied and return to an idle state where we proceed to send a retry to any potential waiting port, or drain if asked to do so.
Definition at line 241 of file xbar.cc.
References DPRINTF, Draining, Drainable::drainState(), and Drainable::signalDrainDone().
void BaseXBar::Layer< SrcType, DstType >::retryWaiting | ( | ) |
|
protectedpure virtual |
Sending the actual retry, in a manner specific to the individual layers.
Note that for a MasterPort, there is both a RequestLayer and a SnoopResponseLayer using the same port, but using different functions for the flow control.
Implemented in BaseXBar::SnoopRespLayer, BaseXBar::RespLayer, and BaseXBar::ReqLayer.
void BaseXBar::Layer< SrcType, DstType >::succeededTiming | ( | Tick | busy_time | ) |
bool BaseXBar::Layer< SrcType, DstType >::tryTiming | ( | SrcType * | src_port | ) |
Determine if the layer accepts a packet from a specific port.
If not, the port in question is also added to the retry list. In either case the state of the layer is updated accordingly.
port | Source port presenting the packet |
|
private |
A name for this layer.
Definition at line 197 of file xbar.hh.
Referenced by BaseXBar::Layer< MasterPort, SlavePort >::name().
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
The crossbar this layer is a part of.
Definition at line 194 of file xbar.hh.
Referenced by BaseXBar::Layer< MasterPort, SlavePort >::name().