50#include "debug/Bridge.hh"
51#include "params/Bridge.hh"
93 if (if_name ==
"mem_side_port")
95 else if (if_name ==
"cpu_side_port")
107 fatal(
"Both ports of a bridge must be connected.\n");
172 if (expects_response) {
211 DPRINTF(
Bridge,
"Request waiting for retry, now retrying\n");
258 DPRINTF(
Bridge,
"trySend request addr 0x%x, queue size %d\n",
296 DPRINTF(
Bridge,
"trySend response addr 0x%x, outstanding %d\n",
319 DPRINTF(
Bridge,
"Request waiting for retry, now retrying\n");
415 return bridge.getAddrRanges();
Declaration of a memory-mapped bridge that connects a requestor and a responder through a request and...
Port on the side that forwards requests and receives responses.
BridgeRequestPort(const std::string &_name, BridgeBase &_bridge, BridgeResponsePort &_cpuSidePort, Cycles _delay, int _req_limit)
Constructor for the BridgeRequestPort.
void recvRangeChange() override
When receiving an address range change from the peer port, pass it to the bridge.
void recvReqRetry() override
When receiving a retry request from the peer port, pass it to the bridge.
bool trySatisfyFunctional(PacketPtr pkt)
Check a functional request against the packets in our request queue.
const unsigned int reqQueueLimit
Max queue size for request packets.
EventFunctionWrapper sendEvent
Send event for the request queue.
bool reqQueueFull() const
Is this side blocked from accepting new request packets.
bool recvTimingResp(PacketPtr pkt) override
When receiving a timing request from the peer port, pass it to the bridge.
BridgeResponsePort & cpuSidePort
The response port on the other side of the bridge.
void trySendTiming()
Handle send event, scheduled when the packet at the head of the outbound queue is ready to transmit (...
std::deque< DeferredPacket > transmitList
Request packet queue.
BridgeBase & bridge
The bridge to which this port belongs.
const Cycles delay
Minimum delay though this bridge.
void schedTimingReq(PacketPtr pkt, Tick when)
Queue a request packet to be sent out later and also schedule a send if necessary.
The port on the side that receives requests and sends responses.
void trySendTiming()
Handle send event, scheduled when the packet at the head of the response queue is ready to transmit (...
void recvFunctional(PacketPtr pkt) override
When receiving a Functional request from the peer port, pass it to the bridge.
void recvRespRetry() override
When receiving a retry request from the peer port, pass it to the bridge.
Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
When receiving an Atomic backdoor request from the peer port, pass it to the bridge.
BridgeResponsePort(const std::string &_name, BridgeBase &_bridge, BridgeRequestPort &_memSidePort, Cycles _delay, int _resp_limit)
Constructor for the BridgeResponsePort.
void retryStalledReq()
Retry any stalled request that we have failed to accept at an earlier point in time.
BridgeBase & bridge
The bridge to which this port belongs.
void recvMemBackdoorReq(const MemBackdoorReq &req, MemBackdoorPtr &backdoor) override
When receiving a Functional backdoor request from the peer port, pass it to the bridge.
bool recvTimingReq(PacketPtr pkt) override
When receiving a timing request from the peer port, pass it to the bridge.
Tick recvAtomic(PacketPtr pkt) override
When receiving an Atomic request from the peer port, pass it to the bridge.
void schedTimingResp(PacketPtr pkt, Tick when)
Queue a response packet to be sent out later and also schedule a send if necessary.
bool respQueueFull() const
Is this side blocked from accepting new response packets.
bool retryReq
If we should send a retry when space becomes available.
unsigned int outstandingResponses
Counter to track the outstanding responses.
const Cycles delay
Minimum request delay though this bridge.
AddrRangeList getAddrRanges() const override
When receiving a address range request the peer port, pass it to the bridge.
EventFunctionWrapper sendEvent
Send event for the response queue.
std::deque< DeferredPacket > transmitList
Response packet queue.
BridgeRequestPort & memSidePort
Request port on the other side of the bridge.
unsigned int respQueueLimit
Max queue size for reserved responses.
A deferred packet stores a packet along with its scheduled transmission time.
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
BridgeResponsePort cpuSidePort
Response port of the bridge.
BridgeBase(const Params &p)
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
BridgeRequestPort memSidePort
Request port of the bridge.
Implementation for a simple bridge with static and configurable set of address ranges.
AddrRangeList getAddrRanges() const override
Get a list of the non-overlapping address ranges the bridge is responsible for.
const AddrRangeList ranges
Address ranges to pass through the bridge.
ClockedObject(const ClockedObjectParams &p)
ClockedObjectParams Params
Parameters of ClockedObject.
Cycles ticksToCycles(Tick t) const
Cycles is a wrapper class for representing cycle counts, i.e.
virtual std::string name() const
void pushLabel(const std::string &lbl)
Push label for PrintReq (safe to call unconditionally).
const std::string & cmdString() const
Return the string name of the cmd field (for debugging and tracing).
bool needsResponse() const
uint32_t payloadDelay
The extra pipelining delay from seeing the packet until the end of payload is transmitted by the comp...
void makeResponse()
Take a request packet and modify it in place to be suitable for returning as a response to that reque...
uint32_t headerDelay
The extra delay from seeing the packet until the header is transmitted.
bool trySatisfyFunctional(PacketPtr other)
Check a functional request against a memory value stored in another packet (i.e.
void popLabel()
Pop label for PrintReq (safe to call unconditionally).
bool cacheResponding() const
Ports are used to interface objects to each other.
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the responder port by calling its corresponding receive function.
RequestPort(const std::string &name, SimObject *_owner, PortID id=InvalidPortID)
Request port.
bool sendTimingResp(PacketPtr pkt)
Attempt to send a timing response to the request port by calling its corresponding receive function.
ResponsePort(const std::string &name, SimObject *_owner, PortID id=InvalidPortID)
Response port.
void sendRetryReq()
Send a retry to the request port that previously attempted a sendTimingReq to this response port and ...
std::list< AddrRange > AddrRangeList
Convenience typedef for a collection of address ranges.
#define fatal(...)
This implements a cprintf based fatal() function.
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
Copyright (c) 2024 Arm Limited All rights reserved.
Tick curTick()
The universal simulation clock.
MemBackdoor * MemBackdoorPtr
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
uint64_t Tick
Tick count type.