//---------------------------------------------------------
// SRAM - SIMM: XJEase device file
// SRAM_SIMM.xje Revision: 1.17
// (c)2001-2007 XJTAG Limited
//
// Disclaimer: XJTAG makes no guarantees whatsoever
// about this code.  You use it at your own risk.
// This code requires XJTAG version 1.4 or later.
//
// This file tests Non-JTAG SRAM using Test()(INT result)
//---------------------------------------------------------


DEVICE NAME := "SRAM SIMM MODULE"

  PINS
    ADDRESS := 71, 70, 69, 39, 40, 33, 34, 58, 56, 54, 52, 22, 20, 18, 59, 55, 53, 51, 21, 19, 17;
    DATA    := 67, 65, 63, 61, 49, 47, 45, 43, 66, 64, 62, 60, 50, 48, 46, 44,
               29, 27, 25, 23, 15, 13, 11, 9,  30, 28, 26, 24, 14, 12, 10, 8;
    NOE     := 41;
    NWE     := 32;
    NCS     := 37, 38, 35, 36;
    PD      := 4, 3, 7, 6;
  END;

  DISABLE DEVICE
    NCS := 1;
    PD  := Z;
  END;

  TEST COVERAGE
    ADDRESS := SHORTS OPEN HI LO;
    DATA    := SHORTS OPEN HI LO;
    NOE     := OPEN HI LO;
    NWE     := OPEN HI LO;
    NCS     := SHORTS OPEN HI LO;
  END;
        
  FILES
    "memtestSRAM.xje";
  END;
        
END;



//------------------------------------------------------
// CONSTANTS
//------------------------------------------------------

CONST INT DATA_BUS_WIDTH := WIDTHOF(DATA);
CONST INT ADDR_BUS_WIDTH := WIDTHOF(ADDRESS);
CONST INT NCE_BUS_WIDTH := WIDTHOF(NCS);

CONST INT RESULT_PASS := FALSE;
CONST INT RESULT_FAIL := TRUE;
CONST INT DEBUG := FALSE;



//------------------------------------------------------
// Memory Test. Returns 1 for a failure, 0 for a pass.
// Calls MemTest (memtestSRAM.xje) and tests nOE pin.
//------------------------------------------------------
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("Memory chip ", DEVICE_REF, " PASSED...\n\n");
  
END;


//----------------------------------------------------------------------------------
TestnOE()(INT result WIDTH 1)
//----------------------------------------------------------------------------------

  INT data WIDTH DATA_BUS_WIDTH;
  
  result := RESULT_PASS;

  // Write a known value to the first address.
  WriteCycle(0, 0x55[(DATA_BUS_WIDTH-1)..0],0);

  SET DATA := 0; // Clear data bus

  // Test to see if we can read the first address with nOE high.
  SET ADDRESS := 0, DATA := I, NOE :=1, NCS := 0;
  SET NCS := 1, NOE := 1, data := DATA;
  IF DEBUG THEN PRINT("\tTrying to read from address 0x0 with nOE held high\n"); END;

  // If we can, nOE must be stuck low.
  IF data = 0x55[(DATA_BUS_WIDTH-1)..0] THEN
    result := RESULT_FAIL;
    PRINT("Error: nOE appears to be stuck low.\n");
  END;

END;



//----------------------------------------------------------------------------------
// Functions required for use of device file with memtestSRAM.xje
//----------------------------------------------------------------------------------

PrintChipEnable(INT i)()
  PRINT(PINNUM(NCS[i]));
END;

PrintAddr(INT i)()
  PRINT(PINNUM(ADDRESS[i]));
END;
 
PrintData(INT i)()
  PRINT(PINNUM(DATA[i]));
END;

ChipWritable()(INT result)

  IF WRITEABLE(NCS) THEN
    result := TRUE;
  ELSE
    result := FALSE;
  END;

END;




//------------------------------------------------------
WriteCycle(INT address WIDTH ADDR_BUS_WIDTH, INT data WIDTH DATA_BUS_WIDTH, INT byte WIDTH NCE_BUS_WIDTH)()
//------------------------------------------------------
  SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := data[(DATA_BUS_WIDTH-1)..0], NCS := byte[(NCE_BUS_WIDTH-1)..0], NOE := 1;
  SET NWE := 0;
  SET NCS := ~0[(NCE_BUS_WIDTH-1)..0], NWE := 1;
  IF DEBUG THEN PRINT("\tWrite 0x", HEX(data), " to address 0x", HEX(address), "\n"); END;
END;

//------------------------------------------------------
ReadCycle(INT address WIDTH ADDR_BUS_WIDTH)(INT data WIDTH DATA_BUS_WIDTH)
//------------------------------------------------------
  SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := I, NOE :=0, NCS := 0;
  SET NCS := ~0[(NCE_BUS_WIDTH-1)..0], NOE := 1, data := DATA;
  IF DEBUG THEN PRINT("\tRead 0x", HEX(data), " from address 0x", HEX(address), "\n"); END;
END;