DEVICE NAME := "SRAM BGA48"
PINS
ADDRESS := H1, D3,E4, F4, F3, G4, G3, H5, H4, H3, H2, D4, C4, C3, B4, B3, A5, A4, A3;
DATA := G1, F1, F2, E2, D2, C2, C1, B1, G6, F6, F5, E5, D5, C6, C5, B6;
nOE := A2;
nWE := G5;
nCE := B5;
nBHE := B2;
nBLE := A1;
END;
DISABLE DEVICE
nOE := 1;
nCE := 1;
END;
TEST COVERAGE
ADDRESS := SHORTS OPEN HI LO;
DATA := SHORTS OPEN HI LO;
nOE := OPEN HI LO;
nWE := OPEN HI LO;
nCE := OPEN HI LO;
nBHE := OPEN HI LO;
nBLE := OPEN HI LO;
END;
FILES
"memtestSRAM.xje";
END;
END;
CONST INT DATA_BUS_WIDTH := WIDTHOF(DATA);
CONST INT ADDR_BUS_WIDTH := WIDTHOF(ADDRESS);
CONST INT NCE_BUS_WIDTH := WIDTHOF(nCE);
CONST INT RESULT_FAIL := TRUE;
CONST INT RESULT_PASS := FALSE;
CONST INT DEBUG := FALSE;
Test()(INT result)
PRINT("\nTesting memory chip ", DEVICE_REF, "...\n");
result := RESULT_PASS;
PRINT("Calling MemTest...\n");
MemTest()(result);
IF (result = RESULT_FAIL) THEN
PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
RETURN;
END;
PRINT("Testing nOE...\n");
TestnOE()(result);
IF (result = RESULT_FAIL) THEN
PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
RETURN;
END;
PRINT("Testing nBLE...\n");
TestnBLE()(result);
IF (result = RESULT_FAIL) THEN
PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
RETURN;
END;
PRINT("Testing nBHE...\n");
TestnBHE()(result);
IF (result = RESULT_FAIL) THEN
PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
RETURN;
END;
PRINT("Memory chip ", DEVICE_REF, " PASSED...\n\n");
END;
TestnOE()(INT result WIDTH 1)
INT data WIDTH DATA_BUS_WIDTH;
result := RESULT_PASS;
WriteCycle(0, 0x55[(DATA_BUS_WIDTH-1)..0],0);
SET DATA := 0;
SET ADDRESS := 0, DATA := I, nOE :=1, nCE := 0;
SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nOE := 1, data := DATA;
IF DEBUG THEN PRINT("\tTrying to read from address 0x0 with nOE held high\n"); END;
IF data = 0x55[(DATA_BUS_WIDTH-1)..0] THEN
result := RESULT_FAIL;
PRINT("Error: nOE appears to be stuck low.\n");
END;
END;
TestnBLE()(INT result WIDTH 1)
INT data WIDTH DATA_BUS_WIDTH;
result := RESULT_PASS;
WriteCycle(0,0,0);
IF DEBUG THEN PRINT("\tTrying to write 0xFF to 0x0 with nBLE held high\n"); END;
SET ADDRESS := 0, DATA := 0xFF, nCE := 0, nBLE := 1, nBHE := 0;
SET nWE := 0;
SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1, nBLE := 1, nBHE := 1;
SET DATA := 0;
ReadCycle(0)(data);
IF (data = 0xFF) THEN
result := RESULT_FAIL;
PRINT("Error: nBLE appears to be stuck low.\n");
END;
END;
TestnBHE()(INT result WIDTH 1)
INT data WIDTH DATA_BUS_WIDTH;
result := RESULT_PASS;
WriteCycle(0,0,0);
IF DEBUG THEN PRINT("\tTrying to write 0xFF00 to 0x0 with nBHE held high\n"); END;
SET ADDRESS := 0, DATA := 0xFF00, nCE := 0, nBLE := 0, nBHE := 1;
SET nWE := 0;
SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1, nBLE := 1, nBHE := 1;
SET DATA := 0;
ReadCycle(0)(data);
IF (data = 0xFF00) THEN
result := RESULT_FAIL;
PRINT("Error: nBHE appears to be stuck low.\n");
END;
END;
PrintChipEnable(INT i)()
PRINT(PINNUM(nCE[i]));
END;
PrintAddr(INT i)()
PRINT(PINNUM(ADDRESS[i]));
END;
PrintData(INT i)()
PRINT(PINNUM(DATA[i]));
END;
ChipWritable()(INT result)
IF WRITEABLE(nCE) THEN
result := TRUE;
ELSE
result := FALSE;
END;
END;
WriteCycle(INT address, INT data, INT byte)()
SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := data[(DATA_BUS_WIDTH-1)..0],
nCE := byte[(NCE_BUS_WIDTH-1)..0], nBLE := 0, nBHE := 0;
SET nWE := 0;
SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1, nBLE := 1, nBHE := 1;
IF DEBUG THEN PRINT("\tWrite 0x", HEX(data), " to address 0x", HEX(address), "\n"); END;
END;
ReadCycle(INT address)(INT data)
SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := I, nOE :=0,
nCE := 0,nBHE := 0, nBLE := 0;
SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nOE := 1, data := DATA, nBLE := 1, nBHE := 1;
IF DEBUG THEN PRINT("\tRead 0x", HEX(data), " from address 0x", HEX(address), "\n"); END;
END;