added discrete event simulator for instruction fetch

This commit is contained in:
karthikmurakonda 2022-10-21 01:17:45 +05:30
parent a1213b7e7f
commit 42f0925c13
13 changed files with 135 additions and 30 deletions

2
.vscode/launch.json vendored
View File

@ -9,7 +9,7 @@
"name": "Launch Current File", "name": "Launch Current File",
"request": "launch", "request": "launch",
"mainClass": "${file}", "mainClass": "${file}",
"args": ["assignment-1/src/descending.asm", "descending.out"] "args": ["assignment-5/src/configuration/config.xml", "assignment-5/src/hello.txt", "assignment-5/supporting_files/test_cases/descending.out"]
}, },
{ {
"type": "java", "type": "java",

View File

@ -1,4 +1,4 @@
Number of instructions executed = 5 Number of instructions executed = 6
Number of cycles taken = 14 Number of cycles taken = 16
Number of data hazards = 3 Number of data hazards = 6
Number of control hazards = 2 Number of control hazards = 0

View File

@ -17,7 +17,7 @@ public class OperandFetch {
OF_EX_LatchType OF_EX_Latch; OF_EX_LatchType OF_EX_Latch;
IF_EnableLatchType IF_EnableLatch; IF_EnableLatchType IF_EnableLatch;
static OperationType[] opTypes = OperationType.values(); static OperationType[] opTypes = OperationType.values();
boolean Proceed; public boolean Proceed;
Queue<Integer> queue; Queue<Integer> queue;
boolean isEnd; boolean isEnd;
@ -197,7 +197,7 @@ public class OperandFetch {
} }
} }
else if (!Proceed) { else if (!Proceed) {
Proceed = true; // Proceed = true;
System.out.println("\n\nControl Hazard - Interlock\n\n"); System.out.println("\n\nControl Hazard - Interlock\n\n");
} }
updateQueue(addtoqueue); updateQueue(addtoqueue);

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
Number of instructions executed = 421 Number of instructions executed = 7609
Number of cycles taken = 992 Number of cycles taken = 11172
Number of data hazards = 441 Number of data hazards = 0
Number of control hazards = 63 Number of control hazards = 176

View File

@ -69,6 +69,7 @@ public class Simulator {
processor.getRWUnit().performRW(); processor.getRWUnit().performRW();
processor.getMAUnit().performMA(); processor.getMAUnit().performMA();
processor.getEXUnit().performEX(); processor.getEXUnit().performEX();
eventQueue.processEvents();
processor.getOFUnit().performOF(); processor.getOFUnit().performOF();
processor.getIFUnit().performIF(); processor.getIFUnit().performIF();
Clock.incrementClock(); Clock.incrementClock();

View File

@ -1,4 +1,4 @@
Number of instructions executed = 5 Number of instructions executed = 926
Number of cycles taken = 14 Number of cycles taken = 1169
Number of data hazards = 3 Number of data hazards = 0
Number of control hazards = 2 Number of control hazards = 10

View File

@ -1,6 +1,15 @@
package processor.memorysystem; package processor.memorysystem;
public class MainMemory { import generic.Element;
import generic.Event;
import generic.ExecutionCompleteEvent;
import generic.MemoryReadEvent;
import generic.MemoryResponseEvent;
import generic.MemoryWriteEvent;
import generic.Simulator;
import processor.Clock;
public class MainMemory implements Element{
int[] memory; int[] memory;
public MainMemory() public MainMemory()
@ -32,4 +41,37 @@ public class MainMemory {
sb.append("\n"); sb.append("\n");
return sb.toString(); return sb.toString();
} }
@Override
public void handleEvent(Event e) {
if (e.getEventType() == Event.EventType.MemoryRead) {
System.out.println("Memory Read Event Happening");
MemoryReadEvent event = (MemoryReadEvent) e ;
System.out.println(getWord(event.getAddressToReadFrom()));
Simulator.getEventQueue().addEvent(
new MemoryResponseEvent(
Clock.getCurrentTime(),
this,
event.getRequestingElement(),
getWord(event.getAddressToReadFrom())
)
);
}
else if(e.getEventType() == Event.EventType.MemoryWrite) {
System.out.println("Memory Write Event Happening");
MemoryWriteEvent event = (MemoryWriteEvent) e ;
System.out.println(getWord(event.getAddressToWriteTo()));
this.setWord(event.getAddressToWriteTo(), event.getValue());
Simulator.getEventQueue().addEvent(
new ExecutionCompleteEvent(
Clock.getCurrentTime(),
this,
event.getRequestingElement())
);
}
}
} }

View File

@ -160,7 +160,7 @@ public class Execute {
break; break;
case end: case end:
{ {
containingProcessor.getRegisterFile().setProgramCounter(containingProcessor.getRegisterFile().getProgramCounter()-1); // containingProcessor.getRegisterFile().setProgramCounter(containingProcessor.getRegisterFile().getProgramCounter()-1);
containingProcessor.getOFUnit().setisEnd(true); containingProcessor.getOFUnit().setisEnd(true);
break; break;
} }

View File

@ -4,6 +4,8 @@ public class IF_OF_LatchType {
boolean OF_enable; boolean OF_enable;
int instruction; int instruction;
boolean IF_busy=false;
boolean IF_branching_busy=false;
public IF_OF_LatchType() public IF_OF_LatchType()
{ {
@ -26,4 +28,19 @@ public class IF_OF_LatchType {
this.instruction = instruction; this.instruction = instruction;
} }
public boolean isIF_busy() {
return IF_busy;
}
public void setIF_busy(boolean iF_busy) {
IF_busy = iF_busy;
}
public boolean isIF_branching_busy() {
return IF_branching_busy;
}
public void setIF_branching_busy(boolean iF_branching_busy) {
IF_branching_busy = iF_branching_busy;
}
} }

View File

@ -1,8 +1,15 @@
package processor.pipeline; package processor.pipeline;
import configuration.Configuration;
import generic.Element;
import generic.Event;
import generic.MemoryReadEvent;
import generic.MemoryResponseEvent;
import generic.Simulator;
import processor.Clock;
import processor.Processor; import processor.Processor;
public class InstructionFetch { public class InstructionFetch implements Element{
Processor containingProcessor; Processor containingProcessor;
IF_EnableLatchType IF_EnableLatch; IF_EnableLatchType IF_EnableLatch;
@ -18,27 +25,65 @@ public class InstructionFetch {
} }
public void performIF() public void performIF()
{ if(!IF_EnableLatch.isFreeze()){ {
if(EX_IF_Latch.isIF_enable()){ if(EX_IF_Latch.isIF_enable() && !IF_OF_Latch.isIF_branching_busy()){
containingProcessor.getRegisterFile().setProgramCounter(EX_IF_Latch.getPC()-1); containingProcessor.getRegisterFile().setProgramCounter(EX_IF_Latch.getPC());
int currentPC = containingProcessor.getRegisterFile().getProgramCounter();
Simulator.getEventQueue().addEvent(
new MemoryReadEvent(
Clock.getCurrentTime()+Configuration.mainMemoryLatency,
this,
containingProcessor.getMainMemory(),
currentPC
)
);
IF_OF_Latch.setIF_branching_busy(true);
EX_IF_Latch.setIF_enable(false); EX_IF_Latch.setIF_enable(false);
IF_OF_Latch.setOF_enable(false); IF_OF_Latch.setOF_enable(false);
System.out.println("IF: PC set to " + EX_IF_Latch.getPC()); System.out.println("IF: PC set to " + EX_IF_Latch.getPC());
} // if EX_IF_Latch is enabled, set PC to EX_IF_Latch's PC and wait for next cycle (1 nop) } // if EX_IF_Latch is enabled, set PC to EX_IF_Latch's PC and wait for next cycle (1 nop)
else if(IF_EnableLatch.isIF_enable() || EX_IF_Latch.isIF_enable()) else if(IF_EnableLatch.isIF_enable())
{ {
if(IF_OF_Latch.isIF_busy()){
return;
}
int currentPC = containingProcessor.getRegisterFile().getProgramCounter(); int currentPC = containingProcessor.getRegisterFile().getProgramCounter();
int newInstruction = containingProcessor.getMainMemory().getWord(currentPC); // int newInstruction = containingProcessor.getMainMemory().getWord(currentPC);
IF_OF_Latch.setInstruction(newInstruction); // IF_OF_Latch.setInstruction(newInstruction);
containingProcessor.getRegisterFile().setProgramCounter(currentPC + 1); // containingProcessor.getRegisterFile().setProgramCounter(currentPC + 1);
IF_EnableLatch.setIF_enable(true); Simulator.getEventQueue().addEvent(
IF_OF_Latch.setOF_enable(true); new MemoryReadEvent(
Clock.getCurrentTime()+ Configuration.mainMemoryLatency,
this,
containingProcessor.getMainMemory(),
currentPC
)
);
IF_OF_Latch.setIF_busy(true);
IF_OF_Latch.setOF_enable(false);
} }
}else{ }
@Override
public void handleEvent(Event e) {
if(IF_OF_Latch.isIF_branching_busy()){
IF_EnableLatch.setFreeze(false); IF_EnableLatch.setFreeze(false);
IF_OF_Latch.setIF_branching_busy(false);
containingProcessor.getOFUnit().Proceed = true;
System.out.println("IF: Unfreezing");
return;
} }
MemoryResponseEvent event = (MemoryResponseEvent) e;
IF_OF_Latch.setInstruction(event.getValue());
containingProcessor.getRegisterFile().setProgramCounter(containingProcessor.getRegisterFile().getProgramCounter() + 1);
IF_OF_Latch.setOF_enable(true);
IF_OF_Latch.setIF_busy(false);
} }
} }

View File

@ -17,7 +17,7 @@ public class OperandFetch {
OF_EX_LatchType OF_EX_Latch; OF_EX_LatchType OF_EX_Latch;
IF_EnableLatchType IF_EnableLatch; IF_EnableLatchType IF_EnableLatch;
static OperationType[] opTypes = OperationType.values(); static OperationType[] opTypes = OperationType.values();
boolean Proceed; public boolean Proceed;
Queue<Integer> queue; Queue<Integer> queue;
boolean isEnd; boolean isEnd;
@ -197,7 +197,7 @@ public class OperandFetch {
} }
} }
else if (!Proceed) { else if (!Proceed) {
Proceed = true; // Proceed = true;
System.out.println("\n\nControl Hazard - Interlock\n\n"); System.out.println("\n\nControl Hazard - Interlock\n\n");
} }
updateQueue(addtoqueue); updateQueue(addtoqueue);