A method of reading data from a memory array, the method comprising: reading data from memory cells of the memory array using a standard read operation by comparing values associated with the memory cells of the memory array with a reference value using a single read operation; and in response to detecting a condition associated with said standard read operation, in the data read from the memory cells of the memory array associated with said standard read operation, performing a self-reference read from at least one of the memory cells, wherein the self-reference read comprises comparing a value read from a memory cell to another value read from the same memory cell, using a plurality of read operations on the same memory cell by: performing a standard read operation on the memory cell; programming the memory cell to a reference state; reading the memory cell programmed at the reference state; and using a differential amplifier to compare the values of the standard read operation with that of the value obtained from the reading of the cell programmed at the reference state, wherein when the two values read from the memory cell are the same, the memory cell is determined to be in the reference state and when the two values read from the memory cell are different, the memory cell is in a non-reference state and the memory cell is subsequently re-written to the non-reference state, wherein each of the memory cells comprises a memory element configured to have a different resistance in a reference state than in a non-reference state, and wherein the condition is indicative of an error which is uncorrectable via error correction codes and wherein the standard read or the self-reference read is performed based on a select signal indicative of the condition, the method further comprising sending data read from the standard read and the self-reference read to a memory controller with a fixed latency and said fixed latency is the same latency associated with the self-reference read, such that data read using the standard read is provided to the memory controller with the latency of the self-reference read. reading data from memory cells of the memory array using a standard read operation by comparing values associated with the memory cells of the memory array with a reference value using a single read operation; and in response to detecting a condition associated with said standard read operation, in the data read from the memory cells of the memory array associated with said standard read operation, performing a self-reference read from at least one of the memory cells, wherein the self-reference read comprises comparing a value read from a memory cell to another value read from the same memory cell, using a plurality of read operations on the same memory cell by: performing a standard read operation on the memory cell; programming the memory cell to a reference state; reading the memory cell programmed at the reference state; and using a differential amplifier to compare the values of the standard read operation with that of the value obtained from the reading of the cell programmed at the reference state, wherein when the two values read from the memory cell are the same, the memory cell is determined to be in the reference state and when the two values read from the memory cell are different, the memory cell is in a non-reference state and the memory cell is subsequently re-written to the non-reference state, wherein each of the memory cells comprises a memory element configured to have a different resistance in a reference state than in a non-reference state, and wherein the condition is indicative of an error which is uncorrectable via error correction codes and wherein the standard read or the self-reference read is performed based on a select signal indicative of the condition, the method further comprising sending data read from the standard read and the self-reference read to a memory controller with a fixed latency and said fixed latency is the same latency associated with the self-reference read, such that data read using the standard read is provided to the memory controller with the latency of the self-reference read.