implemented discrete event simulation in execute stage

This commit is contained in:
karthikmurakonda 2022-10-21 02:21:45 +05:30
parent 42f0925c13
commit e8e0b9ab4a
6 changed files with 203 additions and 154 deletions

View File

@ -1,4 +1,4 @@
Number of instructions executed = 7609 Number of instructions executed = 29
Number of cycles taken = 11172 Number of cycles taken = 1169
Number of data hazards = 0 Number of data hazards = 0
Number of control hazards = 176 Number of control hazards = 10

View File

@ -1,4 +1,4 @@
Number of instructions executed = 926 Number of instructions executed = 277
Number of cycles taken = 1169 Number of cycles taken = 11172
Number of data hazards = 0 Number of data hazards = 0
Number of control hazards = 10 Number of control hazards = 176

View File

@ -1,12 +1,16 @@
package processor.pipeline; package processor.pipeline;
import processor.Processor; import processor.Processor;
import configuration.Configuration;
import generic.Element;
import generic.Event;
import generic.ExecutionCompleteEvent;
import generic.Instruction; import generic.Instruction;
import generic.Simulator;
import generic.Statistics; import generic.Statistics;
import generic.Instruction.OperationType; import generic.Instruction.OperationType;
import generic.Operand.OperandType; import generic.Operand.OperandType;
public class Execute { public class Execute implements Element{
Processor containingProcessor; Processor containingProcessor;
OF_EX_LatchType OF_EX_Latch; OF_EX_LatchType OF_EX_Latch;
EX_MA_LatchType EX_MA_Latch; EX_MA_LatchType EX_MA_Latch;
@ -24,8 +28,34 @@ public class Execute {
{ {
// storing x31 here itself to not to complicate. // storing x31 here itself to not to complicate.
// TODO:remove this later in pipeline // TODO:remove this later in pipeline
if(OF_EX_Latch.isEX_enable()) if(OF_EX_Latch.isEX_enable()&& !OF_EX_Latch.isEX_busy())
{ {
OperationType alu_op = OF_EX_Latch.getInstruction().getOperationType();
long latency = 0;
switch (alu_op) {
case mul:
case muli:
latency = Configuration.multiplier_latency;
break;
case div:
case divi:
latency = Configuration.divider_latency;
break;
default:
latency = Configuration.ALU_latency;
break;
}
Simulator.getEventQueue().addEvent(new ExecutionCompleteEvent(latency, this, this));
OF_EX_Latch.setEX_busy(true);
EX_MA_Latch.setMA_enable(false);
}
}
@Override
public void handleEvent(Event e) {
int op1 = OF_EX_Latch.getOp1(); int op1 = OF_EX_Latch.getOp1();
int op2 = OF_EX_Latch.getOp2(); int op2 = OF_EX_Latch.getOp2();
int imm = OF_EX_Latch.getImm(); int imm = OF_EX_Latch.getImm();
@ -166,7 +196,6 @@ public class Execute {
} }
default: default:
break; break;
} }
System.out.println("ALU RESULT: " + alu_result+"\n\n"); System.out.println("ALU RESULT: " + alu_result+"\n\n");
@ -179,6 +208,6 @@ public class Execute {
}else{ }else{
Statistics.setControlhazards(Statistics.getControlhazards()+2); // stall 2 cycles Statistics.setControlhazards(Statistics.getControlhazards()+2); // stall 2 cycles
} }
} OF_EX_Latch.setEX_busy(false);
} }
} }

View File

@ -1,10 +1,12 @@
package processor.pipeline; package processor.pipeline;
import generic.Element;
import generic.Event;
import generic.Instruction; import generic.Instruction;
import processor.Processor; import processor.Processor;
import generic.Instruction.OperationType; import generic.Instruction.OperationType;
public class MemoryAccess { public class MemoryAccess implements Element {
Processor containingProcessor; Processor containingProcessor;
EX_MA_LatchType EX_MA_Latch; EX_MA_LatchType EX_MA_Latch;
MA_RW_LatchType MA_RW_Latch; MA_RW_LatchType MA_RW_Latch;
@ -41,4 +43,10 @@ public class MemoryAccess {
} }
} }
@Override
public void handleEvent(Event e) {
// TODO Auto-generated method stub
}
} }

View File

@ -7,6 +7,7 @@ public class OF_EX_LatchType {
boolean EX_enable; boolean EX_enable;
Instruction instruction; Instruction instruction;
int op1, op2, imm; int op1, op2, imm;
boolean EX_busy=false;
public OF_EX_LatchType() public OF_EX_LatchType()
{ {
@ -53,5 +54,12 @@ public class OF_EX_LatchType {
EX_enable = eX_enable; EX_enable = eX_enable;
} }
public boolean isEX_busy() {
return EX_busy;
}
public void setEX_busy(boolean isEX_busy) {
this.EX_busy = isEX_busy;
}
} }

View File

@ -195,10 +195,14 @@ public class OperandFetch {
System.out.println("\n\nData Hazard - Interlock\n\n"); System.out.println("\n\nData Hazard - Interlock\n\n");
Statistics.setDatahazards(Statistics.getDatahazards() + 1); Statistics.setDatahazards(Statistics.getDatahazards() + 1);
} }
OF_EX_Latch.setEX_enable(true);
} }
else if (!Proceed) { else if (!Proceed) {
// Proceed = true; // Proceed = true;
System.out.println("\n\nControl Hazard - Interlock\n\n"); OF_EX_Latch.setEX_enable(false);
// System.out.println("\n\nControl Hazard - Interlock\n\n");
}else{
OF_EX_Latch.setEX_enable(false);
} }
updateQueue(addtoqueue); updateQueue(addtoqueue);
} }