@Test public void shouldExecuteAddiOperation() throws UnreachableLabelException, InvalidInstructionException { Instruction first = new InstructionIType("addi $s0, $zero, 23"); Datapath datapath = new Datapath(Arrays.asList(first), new HashMap<String, Integer>()); datapath.moveForward(); assertEquals("addi", datapath.getIfId().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation()); datapath.moveForward(); assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation()); assertEquals("addi", datapath.getIdEx().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation()); datapath.moveForward(); assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation()); assertEquals("addi", datapath.getExMem().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation()); assertEquals(23, datapath.getExMem().getALUOut()); datapath.moveForward(); assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation()); assertEquals("addi", datapath.getMemWb().getInstructionFetched().getOperation()); assertEquals(0, rBank.getValue("s0")); datapath.moveForward(); assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation()); assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation()); assertEquals( 23, rBank.getValue("s0")); // S� modificou o valor no banco de registradores no quinto est�gio }
@Test public void shoudSimulateLoadWordWithoutHazard() throws UnreachableLabelException, InvalidInstructionException { Instruction first = new InstructionIType("lw $t0, 20($s1)"); Datapath datapath = new Datapath(Arrays.asList(first), new HashMap<String, Integer>()); memory.write(20, 15); // na posi��o 20 vou colocar o inteiro 15 // First stage datapath.moveForward(); // Second Stage datapath.moveForward(); // Load Word soma o valor do imeadiato com o valor do registrador // Third Stage datapath.moveForward(); assertEquals( 20, datapath .getExMem() .getALUOut()); // $s0 estava como zero, por isso a soma � 20 que � a constante assertTrue(datapath.getExMem().isMemToReg()); assertTrue(datapath.getExMem().isMemRead()); assertFalse(datapath.getExMem().isMemWrite()); assertEquals(0, rBank.getValue("t0")); // o t0 n�o foi inicializado // Fourth Stage datapath.moveForward(); assertEquals(15, datapath.getMemWb().getMemoryData()); // Fifth Stage datapath.moveForward(); assertEquals(15, rBank.getValue("t0")); }