41#include "debug/MinorScoreboard.hh"
42#include "debug/MinorTiming.hh"
55 switch (
reg.classValue()) {
57 scoreboard_index =
reg.index();
92 panic(
"Unknown register class: %d",
reg.classValue());
106 unsigned int num_dests = staticInst->
numDestRegs();
111 for (
unsigned int dest_index = 0; dest_index < num_dests;
118 if (mark_unpredictable)
121 inst->flatDestRegIdx[dest_index] =
reg;
132 DPRINTF(MinorScoreboard,
"Marking up inst: %s"
133 " regIndex: %d final numResults: %d returnCycle: %d\n",
137 inst->flatDestRegIdx[dest_index] =
RegId();
152 unsigned int num_srcs = staticInst->
numSrcRegs();
156 for (
unsigned int src_index = 0; src_index < num_srcs; src_index++) {
158 unsigned short int index;
166 DPRINTF(MinorScoreboard,
"Inst: %s depends on execSeqNum: %d\n",
179 unsigned int num_dests = staticInst->
numDestRegs();
182 for (
unsigned int dest_index = 0; dest_index < num_dests;
185 const RegId&
reg = inst->flatDestRegIdx[dest_index];
200 DPRINTF(MinorScoreboard,
"Clearing inst: %s"
201 " regIndex: %d final numResults: %d\n",
218 unsigned int num_srcs = staticInst->
numSrcRegs();
223 unsigned int num_relative_latencies = 0;
229 if (src_reg_relative_latencies &&
230 src_reg_relative_latencies->size() != 0)
232 num_relative_latencies = src_reg_relative_latencies->size();
233 default_relative_latency = (*src_reg_relative_latencies)
234 [num_relative_latencies-1];
240 unsigned int src_index = 0;
241 while (src_index < num_srcs &&
245 unsigned short int index;
250 cant_forward_from_fu_indices &&
251 src_reg_fu < cant_forward_from_fu_indices->size() &&
252 (*cant_forward_from_fu_indices)[src_reg_fu];
255 (src_index >= num_relative_latencies ?
256 default_relative_latency :
257 (*src_reg_relative_latencies)[src_index]));
268 if (debug::MinorTiming) {
269 if (ret && num_srcs > num_relative_latencies &&
270 num_relative_latencies != 0)
272 DPRINTF(MinorTiming,
"Warning, inst: %s timing extra decode has"
273 " more src. regs: %d than relative latencies: %d\n",
274 staticInst->
disassemble(0), num_srcs, num_relative_latencies);
284 std::ostringstream result_stream;
286 bool printed_element =
false;
291 unsigned short int num_unpredictable_results =
294 if (!(num_results == 0 && num_unpredictable_results ==
Cycles(0))) {
296 result_stream <<
',';
298 result_stream <<
'(' <<
i <<
','
299 << num_results <<
'/'
300 << num_unpredictable_results <<
'/'
304 printed_element =
true;
Cycles is a wrapper class for representing cycle counts, i.e.
Register ID: describe an architectural register with its class and index.
RegId flatten(const BaseISA &isa) const
virtual const std::string & disassemble(Addr pc, const loader::SymbolTable *symtab=nullptr) const
Return string representation of disassembled instruction.
uint8_t numSrcRegs() const
Number of source registers.
uint8_t numDestRegs() const
Number of destination registers.
const RegId & destRegIdx(int i) const
Return logical index (architectural reg num) of i'th destination reg.
const RegId & srcRegIdx(int i) const
Return logical index (architectural reg num) of i'th source reg.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual BaseISA * getIsaPtr() const =0
std::vector< Index > numUnpredictableResults
Count of the number of results which can't be predicted.
void clearInstDests(MinorDynInstPtr inst, bool clear_unpredictable)
Clear down the dependencies for this instruction.
std::vector< Cycles > returnCycle
The estimated cycle number that the result will be presented.
static constexpr int invalidFUIndex
const unsigned floatRegOffset
bool canInstIssue(MinorDynInstPtr inst, const std::vector< Cycles > *src_reg_relative_latencies, const std::vector< bool > *cant_forward_from_fu_indices, Cycles now, ThreadContext *thread_context)
Can this instruction be issued.
InstSeqNum execSeqNumToWaitFor(MinorDynInstPtr inst, ThreadContext *thread_context)
Returns the exec sequence number of the most recent inst on which the given inst depends.
const unsigned matRegOffset
const unsigned vecRegOffset
unsigned short int Index
Type to use when indexing numResults.
const unsigned ccRegOffset
std::vector< Index > numResults
Count of the number of in-flight instructions that have results for each register.
std::vector< int > fuIndices
Index of the FU generating this result.
const unsigned vecRegElemOffset
const unsigned vecPredRegOffset
bool findIndex(const RegId ®, Index &scoreboard_index)
Sets scoreboard_index to the index into numResults of the given register index.
void markupInstDests(MinorDynInstPtr inst, Cycles retire_time, ThreadContext *thread_context, bool mark_unpredictable)
Mark up an instruction's effects by incrementing numResults counts.
std::vector< InstSeqNum > writingInst
The execute sequence number of the most recent inst to generate this register value.
void minorTrace() const
MinorTraceIF interface.
const unsigned numRegs
The number of registers in the Scoreboard.
#define panic(...)
This implements a cprintf based panic() function.
A simple instruction scoreboard for tracking dependencies in Execute.
void minorTrace(const char *fmt, Args ...args)
DPRINTFN for MinorTrace reporting.
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
@ MatRegClass
Matrix Register.
@ FloatRegClass
Floating-point register.
@ CCRegClass
Condition-code register.
@ VecRegClass
Vector Register.
@ IntRegClass
Integer register.
@ MiscRegClass
Control (misc) register.
@ VecElemClass
Vector Register Native Elem lane.
Minor contains all the definitions within the MinorCPU apart from the CPU class itself.