inorder: explicit fault check
Before graduating an instruction, explicitly check fault by making the fault check it's own separate command that can be put on an instruction schedule.
This commit is contained in:
parent
5f608dd2e9
commit
0bfdf342da
3 changed files with 22 additions and 11 deletions
|
@ -517,7 +517,7 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
W.needs(Grad, GraduationUnit::GraduateInst);
|
W.needs(Grad, GraduationUnit::CheckFault);
|
||||||
|
|
||||||
for (int idx=0; idx < inst->numDestRegs(); idx++) {
|
for (int idx=0; idx < inst->numDestRegs(); idx++) {
|
||||||
W.needs(RegManager, UseDefUnit::WriteDestReg, idx);
|
W.needs(RegManager, UseDefUnit::WriteDestReg, idx);
|
||||||
|
@ -526,6 +526,8 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
|
||||||
if (inst->isControl())
|
if (inst->isControl())
|
||||||
W.needs(BPred, BranchPredictor::UpdatePredictor);
|
W.needs(BPred, BranchPredictor::UpdatePredictor);
|
||||||
|
|
||||||
|
W.needs(Grad, GraduationUnit::GraduateInst);
|
||||||
|
|
||||||
// Insert Back Schedule into our cache of
|
// Insert Back Schedule into our cache of
|
||||||
// resource schedules
|
// resource schedules
|
||||||
addToSkedCache(inst, res_sked);
|
addToSkedCache(inst, res_sked);
|
||||||
|
|
|
@ -56,6 +56,24 @@ GraduationUnit::execute(int slot_num)
|
||||||
|
|
||||||
switch (grad_req->cmd)
|
switch (grad_req->cmd)
|
||||||
{
|
{
|
||||||
|
case CheckFault:
|
||||||
|
{
|
||||||
|
// Handle Any Faults Before Graduating Instruction
|
||||||
|
if (inst->fault != NoFault) {
|
||||||
|
DPRINTF(InOrderGraduation, "[tid:%i]: [sn:%i]: fault %s found for %s\n",
|
||||||
|
tid, inst->seqNum, inst->fault->name(),
|
||||||
|
inst->instName());
|
||||||
|
squashThenTrap(stage_num, inst);
|
||||||
|
grad_req->done(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINTF(InOrderGraduation, "[tid:%i] [sn:%i]: No fault found for %s\n",
|
||||||
|
tid, inst->seqNum, inst->instName());
|
||||||
|
grad_req->done();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case GraduateInst:
|
case GraduateInst:
|
||||||
{
|
{
|
||||||
if (lastNonSpecTick == curTick()) {
|
if (lastNonSpecTick == curTick()) {
|
||||||
|
@ -65,16 +83,6 @@ GraduationUnit::execute(int slot_num)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle Any Faults Before Graduating Instruction
|
|
||||||
if (inst->fault != NoFault) {
|
|
||||||
DPRINTF(Fault, "[sn:%i]: fault %s found for %s\n",
|
|
||||||
inst->seqNum, inst->fault->name(),
|
|
||||||
inst->instName());
|
|
||||||
squashThenTrap(stage_num, inst);
|
|
||||||
grad_req->done(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINTF(InOrderGraduation,
|
DPRINTF(InOrderGraduation,
|
||||||
"[tid:%i]:[sn:%i]: Graduating instruction %s.\n",
|
"[tid:%i]:[sn:%i]: Graduating instruction %s.\n",
|
||||||
tid, inst->seqNum, inst->staticInst->disassemble(inst->instAddr()));
|
tid, inst->seqNum, inst->staticInst->disassemble(inst->instAddr()));
|
||||||
|
|
|
@ -46,6 +46,7 @@ class GraduationUnit : public Resource {
|
||||||
typedef ThePipeline::DynInstPtr DynInstPtr;
|
typedef ThePipeline::DynInstPtr DynInstPtr;
|
||||||
|
|
||||||
enum Command {
|
enum Command {
|
||||||
|
CheckFault,
|
||||||
GraduateInst
|
GraduateInst
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue