41#include "debug/MinorScoreboard.hh"
42#include "debug/MinorTiming.hh"
55 switch (
reg.classValue()) {
57 scoreboard_index =
reg.index();
89 panic(
"Unknown register class: %d",
reg.classValue());
103 unsigned int num_dests = staticInst->
numDestRegs();
108 for (
unsigned int dest_index = 0; dest_index < num_dests;
115 if (mark_unpredictable)
118 inst->flatDestRegIdx[dest_index] =
reg;
129 DPRINTF(MinorScoreboard,
"Marking up inst: %s"
130 " regIndex: %d final numResults: %d returnCycle: %d\n",
134 inst->flatDestRegIdx[dest_index] =
RegId();
149 unsigned int num_srcs = staticInst->
numSrcRegs();
153 for (
unsigned int src_index = 0; src_index < num_srcs; src_index++) {
155 unsigned short int index;
163 DPRINTF(MinorScoreboard,
"Inst: %s depends on execSeqNum: %d\n",
176 unsigned int num_dests = staticInst->
numDestRegs();
179 for (
unsigned int dest_index = 0; dest_index < num_dests;
182 const RegId&
reg = inst->flatDestRegIdx[dest_index];
197 DPRINTF(MinorScoreboard,
"Clearing inst: %s"
198 " regIndex: %d final numResults: %d\n",
215 unsigned int num_srcs = staticInst->
numSrcRegs();
220 unsigned int num_relative_latencies = 0;
226 if (src_reg_relative_latencies &&
227 src_reg_relative_latencies->size() != 0)
229 num_relative_latencies = src_reg_relative_latencies->size();
230 default_relative_latency = (*src_reg_relative_latencies)
231 [num_relative_latencies-1];
237 unsigned int src_index = 0;
238 while (src_index < num_srcs &&
242 unsigned short int index;
247 cant_forward_from_fu_indices &&
248 src_reg_fu < cant_forward_from_fu_indices->size() &&
249 (*cant_forward_from_fu_indices)[src_reg_fu];
252 (src_index >= num_relative_latencies ?
253 default_relative_latency :
254 (*src_reg_relative_latencies)[src_index]));
265 if (debug::MinorTiming) {
266 if (ret && num_srcs > num_relative_latencies &&
267 num_relative_latencies != 0)
269 DPRINTF(MinorTiming,
"Warning, inst: %s timing extra decode has"
270 " more src. regs: %d than relative latencies: %d\n",
271 staticInst->
disassemble(0), num_srcs, num_relative_latencies);
281 std::ostringstream result_stream;
283 bool printed_element =
false;
288 unsigned short int num_unpredictable_results =
291 if (!(num_results == 0 && num_unpredictable_results ==
Cycles(0))) {
293 result_stream <<
',';
295 result_stream <<
'(' <<
i <<
','
296 << num_results <<
'/'
297 << num_unpredictable_results <<
'/'
301 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 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.
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
@ 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.