49#include "debug/LLSC.hh"
50#include "debug/MemoryAccess.hh"
51#include "debug/ProtocolTrace.hh"
52#include "debug/RubyHitMiss.hh"
53#include "debug/RubySequencer.hh"
54#include "debug/RubyStats.hh"
57#include "mem/ruby/protocol/PrefetchBit.hh"
58#include "mem/ruby/protocol/RubyAccessMode.hh"
74 m_outstanding_count = 0;
76 m_ruby_system =
p.ruby_system;
78 m_dataCache_ptr =
p.dcache;
79 m_max_outstanding_requests =
p.max_outstanding_requests;
80 m_deadlock_threshold =
p.deadlock_threshold;
83 assert(m_max_outstanding_requests > 0);
84 assert(m_deadlock_threshold > 0);
86 m_unaddressedTransactionCnt = 0;
88 m_runningGarnetStandalone =
p.garnet_standalone;
90 m_num_pending_invs = 0;
91 m_cache_inv_pkt =
nullptr;
96 m_outstandReqHist.init(10);
97 m_latencyHist.init(10);
98 m_hitLatencyHist.init(10);
99 m_missLatencyHist.init(10);
101 for (
int i = 0;
i < RubyRequestType_NUM;
i++) {
103 m_typeLatencyHist[
i]->init(10);
106 m_hitTypeLatencyHist[
i]->init(10);
109 m_missTypeLatencyHist[
i]->init(10);
112 for (
int i = 0;
i < MachineType_NUM;
i++) {
114 m_hitMachLatencyHist[
i]->init(10);
117 m_missMachLatencyHist[
i]->init(10);
120 m_IssueToInitialDelayHist[
i]->init(10);
123 m_InitialToForwardDelayHist[
i]->init(10);
125 m_ForwardToFirstResponseDelayHist.push_back(
127 m_ForwardToFirstResponseDelayHist[
i]->init(10);
129 m_FirstResponseToCompletionDelayHist.push_back(
131 m_FirstResponseToCompletionDelayHist[
i]->init(10);
134 for (
int i = 0;
i < RubyRequestType_NUM;
i++) {
135 m_hitTypeMachLatencyHist.push_back(
137 m_missTypeMachLatencyHist.push_back(
140 for (
int j = 0; j < MachineType_NUM; j++) {
141 m_hitTypeMachLatencyHist[
i].push_back(
new statistics::Histogram());
142 m_hitTypeMachLatencyHist[
i][j]->init(10);
144 m_missTypeMachLatencyHist[
i].push_back(
145 new statistics::Histogram());
146 m_missTypeMachLatencyHist[
i][j]->init(10);
160 "%s must have a dcache object to support LLSC requests.",
name());
164 DPRINTF(LLSC,
"LLSC Monitor - inserting load linked - "
165 "addr=0x%lx - cpu=%u\n", claddr,
m_version);
178 DPRINTF(LLSC,
"LLSC Monitor - clearing due to store - "
179 "addr=0x%lx - cpu=%u\n", claddr,
m_version);
187 "%s must have a dcache object to support LLSC requests.",
name());
192 DPRINTF(LLSC,
"LLSC Monitor - clearing due to "
193 "store conditional - "
194 "addr=0x%lx - cpu=%u\n",
237 [[maybe_unused]]
int total_outstanding = 0;
240 for (
const auto &seq_req : table_entry.second) {
244 panic(
"Possible Deadlock detected. Aborting!\n version: %d "
245 "request.paddr: 0x%x m_readRequestTable: %d current time: "
246 "%u issue_time: %d difference: %d\n",
m_version,
247 seq_req.pkt->getAddr(), table_entry.second.size(),
252 total_outstanding += table_entry.second.size();
269 for (
const auto& seq_req : table_entry.second) {
270 if (seq_req.functionalWrite(func_pkt))
287 for (
int i = 0;
i < RubyRequestType_NUM;
i++) {
291 for (
int j = 0; j < MachineType_NUM; j++) {
297 for (
int i = 0;
i < MachineType_NUM;
i++) {
314 RubyRequestType secondary_type)
323 assert(primary_type == secondary_type);
325 switch (primary_type) {
326 case RubyRequestType_TLBI_EXT_SYNC_COMP:
329 case RubyRequestType_TLBI:
330 case RubyRequestType_TLBI_SYNC:
335 [[maybe_unused]]
auto insert_data = \
339 pkt, primary_type, secondary_type,
curCycle()));
342 assert(insert_data.second &&
343 "Another TLBI request with the same ID exists");
345 DPRINTF(RubySequencer,
"Inserting TLBI request %016x\n",
352 panic(
"Unexpected TLBI RubyRequestType");
355 return RequestStatus_Ready;
364 return RequestStatus_Aliased;
375 return RequestStatus_Aliased;
379 seq_req_list.emplace_back(pkt, primary_type,
383 if (seq_req_list.size() > 1) {
384 return RequestStatus_Aliased;
389 return RequestStatus_Ready;
400 const MachineType respondingMach,
401 bool isExternalHit,
Cycles initialRequestTime,
402 Cycles forwardRequestTime,
405 RubyRequestType type = srequest->
m_type;
410 Cycles total_lat = completion_time - issued_time;
412 if ((initialRequestTime != 0) && (initialRequestTime < issued_time)) {
421 DPRINTFR(ProtocolTrace,
"%15s %3s %10s%20s %6s>%-6s %s %d cycles\n",
432 if (respondingMach != MachineType_NUM) {
436 if ((issued_time <= initialRequestTime) &&
437 (initialRequestTime <= forwardRequestTime) &&
438 (forwardRequestTime <= firstResponseTime) &&
439 (firstResponseTime <= completion_time)) {
442 initialRequestTime - issued_time);
444 forwardRequestTime - initialRequestTime);
446 firstResponseTime - forwardRequestTime);
448 completion_time - firstResponseTime);
457 if (respondingMach != MachineType_NUM) {
473 const bool externalHit,
const MachineType mach,
474 const Cycles initialRequestTime,
475 const Cycles forwardRequestTime,
476 const Cycles firstResponseTime,
490 bool ruby_request =
true;
491 while (!seq_req_list.empty()) {
495 ((seq_req.
m_type == RubyRequestType_ATOMIC_RETURN) ||
496 (seq_req.
m_type == RubyRequestType_ATOMIC_NO_RETURN));
498 if ((noCoales || atomic_req) && !ruby_request) {
507 assert(seq_req.
m_type != RubyRequestType_LD);
508 assert(seq_req.
m_type != RubyRequestType_Load_Linked);
509 assert(seq_req.
m_type != RubyRequestType_IFETCH);
510 assert(seq_req.
m_type != RubyRequestType_ATOMIC_RETURN);
511 assert(seq_req.
m_type != RubyRequestType_ATOMIC_NO_RETURN);
515 if ((seq_req.
m_type != RubyRequestType_LD) &&
516 (seq_req.
m_type != RubyRequestType_Load_Linked) &&
517 (seq_req.
m_type != RubyRequestType_IFETCH)) {
521 if (seq_req.
m_type != RubyRequestType_Store_Conditional) {
529 seq_req.
pkt->
req->setExtraData(success ? 1 : 0);
535 if (seq_req.
m_type == RubyRequestType_Locked_RMW_Read) {
543 }
else if (seq_req.
m_type == RubyRequestType_Locked_RMW_Write) {
549 initialRequestTime, forwardRequestTime,
555 initialRequestTime, forwardRequestTime,
556 firstResponseTime, !ruby_request);
557 ruby_request =
false;
560 assert(!ruby_request);
563 initialRequestTime, forwardRequestTime,
564 firstResponseTime, !ruby_request);
566 seq_req_list.pop_front();
570 if (seq_req_list.empty()) {
578 const bool ruby_request,
580 const MachineType mach,
581 Cycles initialRequestTime,
582 Cycles forwardRequestTime,
586 assert((seq_req.
m_type == RubyRequestType_LD) ||
587 (seq_req.
m_type == RubyRequestType_Load_Linked) ||
588 (seq_req.
m_type == RubyRequestType_IFETCH));
590 if ((seq_req.
m_type != RubyRequestType_LD) &&
591 (seq_req.
m_type != RubyRequestType_Load_Linked) &&
592 (seq_req.
m_type != RubyRequestType_IFETCH) &&
593 (seq_req.
m_type != RubyRequestType_REPLACEMENT)) {
604 bool externalHit,
const MachineType mach,
605 Cycles initialRequestTime,
606 Cycles forwardRequestTime,
620 bool ruby_request =
true;
621 while (!seq_req_list.empty()) {
624 initialRequestTime, forwardRequestTime,
625 firstResponseTime)) {
630 initialRequestTime, forwardRequestTime,
635 initialRequestTime, forwardRequestTime,
636 firstResponseTime, !ruby_request);
637 ruby_request =
false;
638 seq_req_list.pop_front();
642 if (seq_req_list.empty()) {
649 const bool externalHit,
const MachineType mach,
650 const Cycles initialRequestTime,
651 const Cycles forwardRequestTime,
652 const Cycles firstResponseTime)
666 bool ruby_request =
true;
667 while (!seq_req_list.empty()) {
673 assert((seq_req.
m_type == RubyRequestType_ATOMIC_RETURN) ||
674 (seq_req.
m_type == RubyRequestType_ATOMIC_NO_RETURN));
676 initialRequestTime, forwardRequestTime,
690 ruby_request =
false;
692 initialRequestTime, forwardRequestTime,
693 firstResponseTime,
false);
694 seq_req_list.pop_front();
698 if (seq_req_list.empty()) {
706 const MachineType mach,
const bool externalHit,
707 const Cycles initialRequestTime,
708 const Cycles forwardRequestTime,
709 const Cycles firstResponseTime,
710 const bool was_coalesced)
712 warn_once(
"Replacement policy updates recently became the responsibility "
713 "of SLICC state machines. Make sure to setMRU() near callbacks "
718 RubyRequestType type = srequest->
m_type;
729 if (type == RubyRequestType_Load_Linked) {
734 DPRINTF(RubyHitMiss,
"Cache %s at %#x\n",
735 externalHit ?
"miss" :
"hit",
742 if ((type == RubyRequestType_LD) ||
743 (type == RubyRequestType_IFETCH) ||
744 (type == RubyRequestType_RMW_Read) ||
745 (type == RubyRequestType_Locked_RMW_Read) ||
746 (type == RubyRequestType_Load_Linked) ||
747 (type == RubyRequestType_ATOMIC_RETURN)) {
759 if (type == RubyRequestType_ATOMIC_RETURN) {
760 DPRINTF(RubySequencer,
"ATOMIC RETURN data %s\n",
data);
764 }
else if (pkt->
req->isSwap()) {
770 data.setData(&overwrite_val[0],
777 DPRINTF(RubySequencer,
"AMO original data %s\n",
data);
782 }
else if (type != RubyRequestType_Store_Conditional || llscSuccess) {
794 DPRINTF(RubySequencer,
"hitCallback %s 0x%x using RubyTester\n",
798 assert(testerSenderState);
806 rs->m_cache_recorder->enqueueNextFetchRequest();
809 rs->m_cache_recorder->enqueueNextFlushRequest();
818 RubyRequestType reqType,
819 const MachineType mach,
820 const Cycles initialRequestTime,
821 const Cycles forwardRequestTime,
822 const Cycles firstResponseTime)
824 DPRINTF(RubySequencer,
"unaddressedCallback ID:%08x type:%d\n",
825 unaddressedReqId, reqType);
828 case RubyRequestType_TLBI_EXT_SYNC:
838 case RubyRequestType_TLBI:
839 case RubyRequestType_TLBI_SYNC:
850 assert(seq_req.
m_type == reqType);
862 panic(
"Unexpected TLBI RubyRequestType");
869 for (
auto& pkt : mylist) {
878 assert(port != NULL);
880 pkt->senderState =
ss->predecessor;
895 rs->m_cache_recorder->enqueueNextFetchRequest();
897 rs->m_cache_recorder->enqueueNextFlushRequest();
923 "There are %d Invalidations outstanding before Cache Walk\n",
926 for (
int i = 0;
i < size;
i++) {
929 RubyRequestType request_type = RubyRequestType_REPLACEMENT;
930 std::shared_ptr<RubyRequest> msg = std::make_shared<RubyRequest>(
932 addr, 0, 0, request_type, RubyAccessMode_Supervisor,
934 DPRINTF(RubySequencer,
"Evicting addr 0x%x\n",
addr);
944 "There are %d Invalidations outstanding after Cache Walk\n",
961 !pkt->
req->isHTMAbort()) {
962 return RequestStatus_BufferFull;
965 RubyRequestType primary_type = RubyRequestType_NULL;
966 RubyRequestType secondary_type = RubyRequestType_NULL;
981 DPRINTF(RubySequencer,
"Issuing SC\n");
982 primary_type = RubyRequestType_Store_Conditional;
984 secondary_type = RubyRequestType_Store_Conditional;
986 secondary_type = RubyRequestType_ST;
989 DPRINTF(RubySequencer,
"Issuing LL\n");
991 primary_type = RubyRequestType_Load_Linked;
993 secondary_type = RubyRequestType_Load_Linked;
995 secondary_type = RubyRequestType_LD;
998 }
else if (pkt->
req->isLockedRMW()) {
1006 DPRINTF(RubySequencer,
"Issuing Locked RMW Write\n");
1007 primary_type = RubyRequestType_Locked_RMW_Write;
1009 DPRINTF(RubySequencer,
"Issuing Locked RMW Read\n");
1011 primary_type = RubyRequestType_Locked_RMW_Read;
1013 secondary_type = RubyRequestType_ST;
1014 }
else if (pkt->
req->isTlbiCmd()) {
1016 DPRINTF(RubySequencer,
"Issuing TLBI\n");
1017#if defined (PROTOCOL_CHI)
1019 if (pkt->
req->isAtomicReturn()){
1020 DPRINTF(RubySequencer,
"Issuing ATOMIC RETURN \n");
1021 primary_type = secondary_type =
1022 RubyRequestType_ATOMIC_RETURN;
1024 DPRINTF(RubySequencer,
"Issuing ATOMIC NO RETURN\n");
1025 primary_type = secondary_type =
1026 RubyRequestType_ATOMIC_NO_RETURN;
1030 }
else if (pkt->
req->hasNoAddr()) {
1031 primary_type = secondary_type = RubyRequestType_hasNoAddr;
1042 primary_type = secondary_type = RubyRequestType_ST;
1043 }
else if (pkt->
isRead()) {
1045 if (pkt->
req->isHTMCmd()) {
1047 }
else if (pkt->
req->isInstFetch()) {
1048 primary_type = secondary_type = RubyRequestType_IFETCH;
1050 if (pkt->
req->isReadModifyWrite()) {
1051 primary_type = RubyRequestType_RMW_Read;
1052 secondary_type = RubyRequestType_ST;
1054 primary_type = secondary_type = RubyRequestType_LD;
1058 primary_type = secondary_type = RubyRequestType_FLUSH;
1060 primary_type = secondary_type = RubyRequestType_REPLACEMENT;
1065 panic(
"Cannot convert packet [%s] to ruby request\n",
1071 if (!pkt->
req->isMemMgmt() &&
1073 (primary_type != RubyRequestType_Locked_RMW_Write)) {
1077 return RequestStatus_Aliased;
1083 if (
status != RequestStatus_Ready &&
status != RequestStatus_Aliased)
1087 if (
status != RequestStatus_Aliased)
1091 return RequestStatus_Issued;
1097 assert(pkt != NULL);
1105 if (pkt->
req->hasPC()) {
1106 pc = pkt->
req->getPC();
1113 std::shared_ptr<RubyRequest> msg;
1114 if (pkt->
req->isMemMgmt()) {
1115 msg = std::make_shared<RubyRequest>(
clockEdge(), blk_size,
1118 RubyAccessMode_Supervisor, pkt,
1121 DPRINTFR(ProtocolTrace,
"%15s %3s %10s%20s %6s>%-6s %s\n",
1123 RubyRequestType_to_string(secondary_type));
1125 if (pkt->
req->isTlbiCmd()) {
1126 msg->m_isTlbi =
true;
1127 switch (secondary_type) {
1128 case RubyRequestType_TLBI_EXT_SYNC_COMP:
1129 msg->m_tlbiTransactionUid = pkt->
req->getExtraData();
1131 case RubyRequestType_TLBI:
1132 case RubyRequestType_TLBI_SYNC:
1133 msg->m_tlbiTransactionUid = \
1134 getCurrentUnaddressedTransactionID();
1137 panic(
"Unexpected TLBI RubyRequestType");
1139 DPRINTF(RubySequencer,
"Issuing TLBI %016x\n",
1140 msg->m_tlbiTransactionUid);
1143 msg = std::make_shared<RubyRequest>(
clockEdge(), blk_size,
1147 RubyAccessMode_Supervisor, pkt,
1148 PrefetchBit_No, proc_id, core_id);
1151 ((secondary_type == RubyRequestType_ATOMIC_RETURN) ||
1152 (secondary_type == RubyRequestType_ATOMIC_NO_RETURN))){
1156 atomicOps.push_back(std::make_pair<int,AtomicOpFunctor*>
1162 DPRINTFR(ProtocolTrace,
"%15s %3s %10s%20s %6s>%-6s %#x %s\n",
1165 RubyRequestType_to_string(secondary_type));
1172 msg->m_htmFromTransaction =
true;
1178 assert(latency > 0);
1186template <
class KEY,
class VALUE>
1188operator<<(std::ostream &out,
const std::unordered_map<KEY, VALUE> &map)
1190 for (
const auto &[key, values] : map) {
1191 out <<
"[ " << key <<
" =";
1192 for (
const auto &seq_req : values) {
1193 out <<
" " << RubyRequestType_to_string(seq_req.m_second_type);
1211 DPRINTF(RubyStats,
"Recorded statistic: %s\n",
1212 SequencerRequestType_to_string(requestType));
1228 uint64_t aligned_txid = \
1231 if (aligned_txid > 0xFFFFFFFFull) {
1240 uint64_t(
m_version & 0xFFFFFFFF) << 32) |
Cycles curCycle() const
Determine the current cycle, corresponding to a tick aligned to a clock edge.
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
Tick cyclesToTicks(Cycles c) const
Cycles is a wrapper class for representing cycle counts, i.e.
bool isSWPrefetch() const
virtual std::string name() const
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
const std::string & cmdString() const
Return the string name of the cmd field (for debugging and tracing).
void print(std::ostream &o, int verbosity=0, const std::string &prefix="") const
T * findNextSenderState() const
Go through the sender state stack and return the first instance that is of type T (as determined by a...
bool isHtmTransactional() const
Returns whether or not this packet/request originates in the CPU executing in transactional mode,...
void setData(const uint8_t *p)
Copy data into the packet from the provided pointer.
uint64_t getHtmTransactionUid() const
If a packet/request originates in a CPU executing in transactional mode, i.e.
RequestPtr req
A pointer to the original request.
AtomicOpFunctor * getAtomicOp() const
Accessor function to atomic op.
MemCmd cmd
The command field of the packet.
bool isMaskedWrite() const
void writeData(uint8_t *p) const
Copy data from the packet to the memory at the provided pointer.
bool isLocked(int context) const
void setLocked(int context)
bool getUseSecondaryStoreConditional() const
bool getUseSecondaryLoadLinked() const
void hitCallback(PacketPtr pkt)
void ruby_hit_callback(PacketPtr pkt)
Addr makeLineAddress(Addr addr) const
void ruby_unaddressed_callback(PacketPtr pkt)
void ruby_stale_translation_callback(Addr txnId)
std::string printAddress(Addr addr) const
RubyPort(const Params &p)
virtual int functionalWrite(Packet *func_pkt)
AbstractController * m_controller
void ruby_eviction_callback(Addr address)
MessageBuffer * m_mandatory_q_ptr
Addr getOffset(Addr addr) const
statistics::Histogram m_outstandReqHist
Histogram for number of outstanding requests per cycle.
void resetStats() override
Callback to reset stats.
Cycles m_deadlock_threshold
std::unordered_map< Addr, std::list< SequencerRequest > > m_RequestTable
virtual bool empty() const
void writeCallback(Addr address, DataBlock &data, const bool externalHit=false, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0), const bool noCoales=false)
std::vector< statistics::Counter > m_IncompleteTimes
bool llscCheckMonitor(const Addr)
Searches for cache line address in the global monitor tagged with this Sequencer object's version id.
virtual int functionalWrite(Packet *func_pkt) override
std::vector< statistics::Histogram * > m_InitialToForwardDelayHist
RubySystem * m_ruby_system
std::vector< statistics::Histogram * > m_hitMachLatencyHist
Histograms for profiling the latencies for requests that did not required external messages.
void recordMissLatency(SequencerRequest *srequest, bool llscSuccess, const MachineType respondingMach, bool isExternalHit, Cycles initialRequestTime, Cycles forwardRequestTime, Cycles firstResponseTime)
void completeHitCallback(std::vector< PacketPtr > &list)
std::vector< statistics::Histogram * > m_typeLatencyHist
PacketPtr m_cache_inv_pkt
void atomicCallback(Addr address, DataBlock &data, const bool externalHit=false, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0))
void writeCallbackScFail(Addr address, DataBlock &data)
Proxy function to writeCallback that first invalidates the line address in the local monitor.
CacheMemory * m_dataCache_ptr
std::vector< statistics::Histogram * > m_FirstResponseToCompletionDelayHist
void incrementUnaddressedTransactionCnt()
Increment the unaddressed transaction counter.
virtual void hitCallback(SequencerRequest *srequest, DataBlock &data, bool llscSuccess, const MachineType mach, const bool externalHit, const Cycles initialRequestTime, const Cycles forwardRequestTime, const Cycles firstResponseTime, const bool was_coalesced)
void llscLoadLinked(const Addr)
Places the cache line address into the global monitor tagged with this Sequencer object's version id.
uint64_t getCurrentUnaddressedTransactionID() const
Generate the current unaddressed transaction ID based on the counter and the Sequencer object's versi...
Sequencer(const Params &)
statistics::Histogram m_latencyHist
Histogram for holding latency profile of all requests.
void issueRequest(PacketPtr pkt, RubyRequestType type)
bool llscStoreConditional(const Addr)
Searches for cache line address in the global monitor tagged with this Sequencer object's version id.
void unaddressedCallback(Addr unaddressedReqId, RubyRequestType requestType, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0))
virtual RequestStatus insertRequest(PacketPtr pkt, RubyRequestType primary_type, RubyRequestType secondary_type)
EventFunctionWrapper deadlockCheckEvent
std::unordered_map< uint64_t, SequencerRequest > m_UnaddressedRequestTable
uint64_t m_unaddressedTransactionCnt
std::vector< statistics::Histogram * > m_hitTypeLatencyHist
statistics::Histogram m_hitLatencyHist
Histogram for holding latency profile of all requests that hit in the controller connected to this se...
RequestStatus makeRequest(PacketPtr pkt) override
int m_max_outstanding_requests
void llscClearLocalMonitor()
Removes all addresses from the local monitor.
void recordRequestType(SequencerRequestType requestType)
std::vector< statistics::Histogram * > m_IssueToInitialDelayHist
Histograms for recording the breakdown of miss latency.
virtual void print(std::ostream &out) const
virtual bool processReadCallback(SequencerRequest &seq_req, DataBlock &data, const bool rubyRequest, bool externalHit, const MachineType mach, Cycles initialRequestTime, Cycles forwardRequestTime, Cycles firstResponseTime)
RubySequencerParams Params
std::vector< std::vector< statistics::Histogram * > > m_hitTypeMachLatencyHist
void llscClearMonitor(const Addr)
Removes the cache line address from the global monitor.
void evictionCallback(Addr address)
std::vector< statistics::Histogram * > m_ForwardToFirstResponseDelayHist
void readCallback(Addr address, DataBlock &data, const bool externalHit=false, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0))
std::vector< statistics::Histogram * > m_missMachLatencyHist
Histograms for profiling the latencies for requests that required external messages.
std::vector< statistics::Histogram * > m_missTypeLatencyHist
statistics::Histogram m_missLatencyHist
Histogram for holding latency profile of all requests that miss in the controller connected to this s...
std::vector< std::vector< statistics::Histogram * > > m_missTypeMachLatencyHist
void mergeFrom(const DataBlock &data)
DrainState drainState() const
Return the current drain state of an object.
@ Draining
Draining buffers pending serialization/handover.
void schedule(Event &event, Tick when)
#define panic(...)
This implements a cprintf based panic() function.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
RubyRequestType tlbiCmdToRubyRequestType(const Packet *pkt)
bool isTlbiCmdRequest(RubyRequestType type)
RubyRequestType htmCmdToRubyRequestType(const Packet *pkt)
std::ostream & operator<<(std::ostream &os, const BoolVec &myvector)
Copyright (c) 2024 Arm Limited All rights reserved.
T safe_cast(U &&ref_or_ptr)
Tick curTick()
The universal simulation clock.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
uint64_t Tick
Tick count type.
int ContextID
Globally unique thread context ID.
const ContextID InvalidContextID
Declaration of the Packet class.
RubyRequestType m_second_type