import org.junit.Assert; import org.junit.Test; import java.util.function.BiFunction; import static edu.gvsu.dlunit.DLUnit.*; /** * Test cases for a signed 16-bit ALU. *
* IMPORTANT: These test cases do *not* thoroughly test the circuit. You need to * re-name this class and add more tests! *
*
* Created by kurmasz on 8/8/16.
*/
public class Sample16BitALUTest {
public static class OpCodes {
public static final int ADDU = 0;
public static final int SUBU = 1;
public static final int AND = 2;
public static final int OR = 3;
public static final int NOT = 4;
public static final int XOR = 5;
public static final int LUI = 6;
public static final int SLTU = 7;
public static final int ADD = 8;
public static final int SUB = 9;
public static final int SLT = 15;
}
@Test
public void testAddu() {
setPinUnsigned("InputA", 53400);
setPinUnsigned("InputB", 53500);
setPinUnsigned("Op", OpCodes.ADDU);
run();
Assert.assertEquals("Addition Output", (53400 + 53500) % 65536, readPinUnsigned("Output"));
// Overflow for unsigned addition is false by definition
Assert.assertEquals("Addition Overflow", false, readPin("Overflow"));
}
@Test
public void testAddition() {
setPinSigned("InputA", 23);
setPinSigned("InputB", 44);
setPinUnsigned("Op", OpCodes.ADD);
run();
Assert.assertEquals("Addition Output", 23 + 44, readPinSigned("Output"));
Assert.assertEquals("Addition Overflow", false, readPin("Overflow"));
}
@Test
public void testSubtraction() {
setPinSigned("InputA", 24);
setPinSigned("InputB", 45);
setPinUnsigned("Op", OpCodes.SUB);
run();
Assert.assertEquals("Subtraction Output", 24 - 45, readPinSigned("Output"));
Assert.assertEquals("Subtraction Overflow", false, readPin("Overflow"));
}
@Test
public void ltSigned() {
setPinSigned("InputA", 5);
setPinSigned("InputB", 6);
setPinUnsigned("Op", OpCodes.SLT);
run();
Assert.assertEquals("Signed Less Than Output", 1, readPinSigned("Output"));
Assert.assertEquals("Signed Less Than Overflow", false, readPin("Overflow"));
}
@Test
public void ltSigned2() {
setPinSigned("InputA", 32767);
setPinSigned("InputB", -1);
setPinUnsigned("Op", OpCodes.SLT);
run();
Assert.assertEquals("Signed Less Than Output", 0, readPinSigned("Output"));
Assert.assertEquals("Signed Less Than Overflow", false, readPin("Overflow"));
}
public static void verifySigned(long a, long b, boolean checkOverflow) {
long expected = (a < b) ? 1 : 0;
setPinSigned("InputA", a);
setPinSigned("InputB", b);
setPinUnsigned("Op", OpCodes.SLT);
run();
String message = String.format(" of %d < %d (signed) ", a, b);
Assert.assertEquals("Output" + message, expected, readPinUnsigned("Output"));
if (checkOverflow) {
Assert.assertEquals("Overflow" + message, false, readPin("Overflow"));
}
}
@Test
public void ltSigned_allPairs() {
long[] values = {-32768, -32767, -1, 0, 1, 32766, 32767};
for (long a : values) {
for (long b : values) {
verifySigned(a, b, true);
}
}
}
public static void verifyUnsigned(long a, long b, boolean checkOverflow) {
long expected = (a < b) ? 1 : 0;
setPinUnsigned("InputA", a);
setPinUnsigned("InputB", b);
setPinUnsigned("Op", OpCodes.SLTU);
run();
String message = String.format(" of %d < %d (unsigned) ", a, b);
Assert.assertEquals("Output" + message, expected, readPinUnsigned("Output"));
if (checkOverflow) {
Assert.assertEquals("Overflow" + message, false, readPin("Overflow"));
}
}
@Test
public void ltUnsigned_allPairs() {
long[] values = {0, 1, 2, 65534, 65535};
for (long a : values) {
for (long b : values) {
verifyUnsigned(a, b, true);
}
}
}
private void verifyLogic(String name, int op, long a, long b, BiFunction