/// <summary> /// A simple SRAM test. /// </summary> /// <param name="shouter">Public shouter instance.</param> /// <param name="sram">The SRAM type.</param> /// <param name="progressBar">The progress bar.</param> /// <param name="passName">The name of the pass.</param> /// <param name="totalNumberOfAdresses">The total number of adresses.</param> /// <param name="dataGenerator">A device the generates values for addresses.</param> /// <returns>Tuples of non-working addresses: (address, read_byte, expected_byte).</returns> public List <Tuple <int, string, string> > SRamTestPass(IShouter shouter, SRam sram, ProgressBar progressBar, string passName, int totalNumberOfAdresses, IDataGenerator dataGenerator) { progressBar.Shout(passName); var translator = sram.GetPinTranslator(ZIFType); SetVccLevel(sram.VccLevel); ApplyGnd(translator.ToZIF, sram.GndPins); ApplyVcc(translator.ToZIF, sram.VccPins); PullUpsEnable(true); var badCells = new List <Tuple <int, string, string> >(); var writerZif = new ZIFSocket(40); for (var address = 0; address < totalNumberOfAdresses; address++) { writerZif.SetAll(true); writerZif.Disable(sram.GndPins, translator.ToZIF); writerZif.Enable(sram.Constants, translator.ToZIF); writerZif.Enable(sram.ChipEnable, translator.ToZIF); sram.SetAddress(writerZif, address); sram.SetData(writerZif, dataGenerator.GetData(address)); WriteZIF(writerZif, ""); writerZif.Enable(sram.WriteEnable, translator.ToZIF); WriteZIF(writerZif, ""); writerZif.Disable(sram.WriteEnable, translator.ToZIF); WriteZIF(writerZif, ""); progressBar.Progress(); } for (var address = 0; address < totalNumberOfAdresses; address++) { writerZif.SetAll(true); writerZif.Disable(sram.GndPins, translator.ToZIF); writerZif.Enable(sram.Constants, translator.ToZIF); writerZif.Enable(sram.ChipEnable, translator.ToZIF); writerZif.Enable(sram.OutputEnable, translator.ToZIF); writerZif.Disable(sram.WriteEnable, translator.ToZIF); sram.SetAddress(writerZif, address); WriteZIF(writerZif, "Writing SRam address."); var readerZif = ReadZIF("Reading SRam data.")[0]; var dataOutPins = sram.DataOutPins.Length != 0 ? sram.DataOutPins : sram.DataPins; var expectedData = dataGenerator.GetData(address); var addressBitCounter = 0; foreach (var i in dataOutPins.Select(translator.ToZIF)) { if (readerZif[i] != expectedData[addressBitCounter++]) { addressBitCounter = 0; var expected = ""; var read = ""; foreach (var j in dataOutPins.Select(translator.ToZIF)) { expected = expected + (expectedData[addressBitCounter++] ? "1" : "0"); read = read + (readerZif[j] ? "1" : "0"); } badCells.Add(Tuple.Create(address, read, expected)); progressBar.Shout("{0}: Bad cell at address {1}", passName, address.ToString("X4")); break; } } progressBar.Progress(); } return(badCells); }
/// <summary> /// A simple SRAM test. /// </summary> /// <param name="shouter">Public shouter instance.</param> /// <param name="sram">The SRAM type.</param> /// <param name="progressBar">The progress bar.</param> /// <param name="totalNumberOfAdresses">The total number of adresses.</param> /// <param name="firstBit">The value of the first bit to write to the SRAM.</param> /// <returns>Tuples of non-working addresses: (address, read_byte, expected_byte).</returns> public List <Tuple <int, string, string> > OldSRamTest(IShouter shouter, SRam sram, ProgressBar progressBar, int totalNumberOfAdresses, bool firstBit) { var translator = sram.GetPinTranslator(ZIFType); SetVccLevel(sram.VccLevel); ApplyGnd(translator.ToZIF, sram.GndPins); ApplyVcc(translator.ToZIF, sram.VccPins); PullUpsEnable(true); var badCells = new List <Tuple <int, string, string> >(); var writerZif = new ZIFSocket(40); var startBit = firstBit; for (var address = 0; address < totalNumberOfAdresses; address++) { var bit = startBit; writerZif.SetAll(true); writerZif.Disable(sram.GndPins, translator.ToZIF); writerZif.Enable(sram.Constants, translator.ToZIF); writerZif.Enable(sram.ChipEnable, translator.ToZIF); sram.SetAddress(writerZif, address); foreach (var i in sram.DataPins.Select(translator.ToZIF)) { writerZif[i] = bit; bit = !bit; } startBit = !startBit; WriteZIF(writerZif, ""); writerZif.Enable(sram.WriteEnable, translator.ToZIF); WriteZIF(writerZif, ""); writerZif.Disable(sram.WriteEnable, translator.ToZIF); WriteZIF(writerZif, ""); progressBar.Progress(); } startBit = firstBit; for (var address = 0; address < totalNumberOfAdresses; address++) { var bit = startBit; writerZif.SetAll(true); writerZif.Disable(sram.GndPins, translator.ToZIF); writerZif.Enable(sram.Constants, translator.ToZIF); writerZif.Enable(sram.ChipEnable, translator.ToZIF); writerZif.Enable(sram.OutputEnable, translator.ToZIF); writerZif.Disable(sram.WriteEnable, translator.ToZIF); sram.SetAddress(writerZif, address); WriteZIF(writerZif, "Writing SRam address."); var readerZif = ReadZIF("Reading SRam data.")[0]; var dataOutPins = sram.DataOutPins.Length != 0 ? sram.DataOutPins : sram.DataPins; foreach (var i in dataOutPins.Select(translator.ToZIF)) { if (readerZif[i] != bit) { var expected = ""; var read = ""; bit = startBit; foreach (var j in dataOutPins.Select(translator.ToZIF)) { expected = expected + (bit ? "1" : "0"); read = read + (readerZif[j] ? "1" : "0"); bit = !bit; } badCells.Add(Tuple.Create(address, read, expected)); progressBar.Shout("Bad cell at address {0}", address.ToString("X4")); break; } bit = !bit; } startBit = !startBit; progressBar.Progress(); } return(badCells); }