diff options
Diffstat (limited to 'src/cpu/inorder/resources/execution_unit.cc')
-rw-r--r-- | src/cpu/inorder/resources/execution_unit.cc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/cpu/inorder/resources/execution_unit.cc b/src/cpu/inorder/resources/execution_unit.cc index 9ba7a64c7..cae007deb 100644 --- a/src/cpu/inorder/resources/execution_unit.cc +++ b/src/cpu/inorder/resources/execution_unit.cc @@ -41,7 +41,8 @@ using namespace ThePipeline; ExecutionUnit::ExecutionUnit(string res_name, int res_id, int res_width, int res_latency, InOrderCPU *_cpu, ThePipeline::Params *params) - : Resource(res_name, res_id, res_width, res_latency, _cpu) + : Resource(res_name, res_id, res_width, res_latency, _cpu), + lastExecuteTick(0), lastControlTick(0) { } void @@ -55,8 +56,6 @@ ExecutionUnit::regStats() .name(name() + ".predictedNotTakenIncorrect") .desc("Number of Branches Incorrectly Predicted As Not Taken)."); - lastExecuteCycle = curTick(); - executions .name(name() + ".executions") .desc("Number of Instructions Executed."); @@ -98,14 +97,22 @@ ExecutionUnit::execute(int slot_num) { case ExecuteInst: { - if (curTick() != lastExecuteCycle) { - lastExecuteCycle = curTick(); + if (curTick() != lastExecuteTick) { + lastExecuteTick = curTick(); } if (inst->isMemRef()) { panic("%s not configured to handle memory ops.\n", resName); } else if (inst->isControl()) { + if (lastControlTick == curTick()) { + DPRINTF(InOrderExecute, "Can not Execute More than One Control " + "Inst Per Cycle. Blocking Request.\n"); + exec_req->done(false); + return; + } + lastControlTick = curTick(); + // Evaluate Branch fault = inst->execute(); executions++; |