added discrete event simulator for instruction fetch
This commit is contained in:
parent
a1213b7e7f
commit
42f0925c13
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue