51#include "debug/SerialLink.hh"
52#include "params/SerialLink.hh"
61 Cycles _delay,
int _resp_limit,
66 ranges(_ranges.begin(), _ranges.end()),
76 _cpu_side_port,
Cycles _delay,
98 if (if_name ==
"mem_side_port")
100 else if (if_name ==
"cpu_side_port")
112 fatal(
"Both ports of a serial_link must be connected.\n");
183 if (expects_response) {
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 ...
A deferred packet stores a packet along with its scheduled transmission time.
Port on the side that forwards requests and receives responses.
bool reqQueueFull() const
Is this side blocked from accepting new request packets.
SerialLinkResponsePort & cpu_side_port
The response (CPU-side port) port on the other side of the serial_link.
const unsigned int reqQueueLimit
Max queue size for request packets.
SerialLink & serial_link
The serial_link to which this port belongs.
SerialLinkRequestPort(const std::string &_name, SerialLink &_serial_link, SerialLinkResponsePort &_cpu_side_port, Cycles _delay, int _req_limit)
Constructor for the SerialLinkRequestPort.
bool recvTimingResp(PacketPtr pkt)
When receiving a timing request from the peer port, pass it to the serial_link.
bool trySatisfyFunctional(PacketPtr pkt)
Check a functional request against the packets in our request queue.
void trySendTiming()
Handle send event, scheduled when the packet at the head of the outbound queue is ready to transmit (...
EventFunctionWrapper sendEvent
Send event for the request queue.
std::deque< DeferredPacket > transmitList
Request packet queue.
const Cycles delay
Minimum delay though this serial_link.
void schedTimingReq(PacketPtr pkt, Tick when)
Queue a request packet to be sent out later and also schedule a send if necessary.
void recvReqRetry()
When receiving a retry request from the peer port, pass it to the serial_link.
The port on the side that receives requests and sends responses.
SerialLinkRequestPort & mem_side_port
Request port on the other side of the serial_link.
unsigned int respQueueLimit
Max queue size for reserved responses.
EventFunctionWrapper sendEvent
Send event for the response queue.
bool retryReq
If we should send a retry when space becomes available.
void schedTimingResp(PacketPtr pkt, Tick when)
Queue a response packet to be sent out later and also schedule a send if necessary.
SerialLinkResponsePort(const std::string &_name, SerialLink &_serial_link, SerialLinkRequestPort &_mem_side_port, Cycles _delay, int _resp_limit, const std::vector< AddrRange > &_ranges)
Constructor for the SerialLinkResponsePort.
void recvFunctional(PacketPtr pkt)
When receiving a Functional request from the peer port, pass it to the serial_link.
std::deque< DeferredPacket > transmitList
Response packet queue.
Tick recvAtomic(PacketPtr pkt)
When receiving a Atomic requestfrom the peer port, pass it to the serial_link.
void recvRespRetry()
When receiving a retry request from the peer port, pass it to the serial_link.
bool recvTimingReq(PacketPtr pkt)
When receiving a timing request from the peer port, pass it to the serial_link.
void retryStalledReq()
Retry any stalled request that we have failed to accept at an earlier point in time.
SerialLink & serial_link
The serial_link to which this port belongs.
AddrRangeList getAddrRanges() const
When receiving a address range request the peer port, pass it to the serial_link.
bool respQueueFull() const
Is this side blocked from accepting new response packets.
const AddrRangeList ranges
Address ranges to pass through the serial_link.
unsigned int outstandingResponses
Counter to track the outstanding responses.
void trySendTiming()
Handle send event, scheduled when the packet at the head of the response queue is ready to transmit (...
const Cycles delay
Minimum request delay though this serial_link.
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
virtual void init()
init() is called after all C++ SimObjects have been created and all ports are connected.
uint64_t link_speed
Speed of each link (Gb/s) in this serial link.
SerialLinkRequestPort mem_side_port
Request port of the serial_link.
unsigned num_lanes
Number of parallel lanes in this serial link.
SerialLinkResponsePort cpu_side_port
Response port of the serial_link.
SerialLink(const SerialLinkParams &p)
std::list< AddrRange > AddrRangeList
Convenience typedef for a collection of address ranges.
static constexpr T divCeil(const T &a, const U &b)
#define fatal(...)
This implements a cprintf based fatal() function.
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.
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
uint64_t Tick
Tick count type.
Declaration of the SerialLink Class, modeling Hybrid-Memory-Cube's serial interface.