50#include "debug/Bridge.hh"
51#include "params/Bridge.hh"
59 Cycles _delay,
int _resp_limit,
63 ranges(_ranges.begin(), _ranges.end()),
72 Cycles _delay,
int _req_limit)
92 if (if_name ==
"mem_side_port")
94 else if (if_name ==
"cpu_side_port")
106 fatal(
"Both ports of a bridge must be connected.\n");
171 if (expects_response) {
210 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");
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.
const Cycles delay
Minimum delay though this bridge.
void recvReqRetry() override
When receiving a retry request from the peer port, pass it to the bridge.
std::deque< DeferredPacket > transmitList
Request packet queue.
BridgeResponsePort & cpuSidePort
The response port on the other side of the bridge.
BridgeRequestPort(const std::string &_name, Bridge &_bridge, BridgeResponsePort &_cpuSidePort, Cycles _delay, int _req_limit)
Constructor for the BridgeRequestPort.
bool trySatisfyFunctional(PacketPtr pkt)
Check a functional request against the packets in our request queue.
bool reqQueueFull() const
Is this side blocked from accepting new request packets.
const unsigned int reqQueueLimit
Max queue size for request packets.
bool recvTimingResp(PacketPtr pkt) override
When receiving a timing request from the peer port, pass it to the bridge.
void schedTimingReq(PacketPtr pkt, Tick when)
Queue a request packet to be sent out later and also schedule a send if necessary.
EventFunctionWrapper sendEvent
Send event for the request queue.
void trySendTiming()
Handle send event, scheduled when the packet at the head of the outbound queue is ready to transmit (...
Bridge & bridge
The bridge to which this port belongs.
The port on the side that receives requests and sends responses.
void recvFunctional(PacketPtr pkt) override
When receiving a Functional request from the peer port, pass it to the bridge.
bool respQueueFull() const
Is this side blocked from accepting new response packets.
bool recvTimingReq(PacketPtr pkt) override
When receiving a timing request from the peer port, pass it to the bridge.
unsigned int respQueueLimit
Max queue size for reserved responses.
const AddrRangeList ranges
Address ranges to pass through the bridge.
unsigned int outstandingResponses
Counter to track the outstanding responses.
bool retryReq
If we should send a retry when space becomes available.
void recvMemBackdoorReq(const MemBackdoorReq &req, MemBackdoorPtr &backdoor) override
When receiving a Functional backdoor request from the peer port, pass it to the bridge.
BridgeResponsePort(const std::string &_name, Bridge &_bridge, BridgeRequestPort &_memSidePort, Cycles _delay, int _resp_limit, std::vector< AddrRange > _ranges)
Constructor for the BridgeResponsePort.
void recvRespRetry() override
When receiving a retry 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.
EventFunctionWrapper sendEvent
Send event for the response queue.
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.
std::deque< DeferredPacket > transmitList
Response packet queue.
Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
When receiving an Atomic backdoor 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.
BridgeRequestPort & memSidePort
Request port on the other side of the bridge.
Bridge & bridge
The bridge to which this port belongs.
void retryStalledReq()
Retry any stalled request that we have failed to accept at an earlier point in time.
void trySendTiming()
Handle send event, scheduled when the packet at the head of the response queue is ready to transmit (...
A deferred packet stores a packet along with its scheduled transmission time.
BridgeRequestPort memSidePort
Request port of the bridge.
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.
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
ClockedObject(const ClockedObjectParams &p)
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.