NAND busy가 풀린 것을 성공으로 읽으면 위험하다
NAND를 program한 뒤 busy가 풀렸다. 다음 page로 넘어가도 될까? 동작이 끝났다는 사실만 확인했다면 아직 한 단계가 남는다. NAND Status Register에는 “지금 일하고 있는가”와 “그 일이 성공했는가”가 따로 들어 있기 때문이다.
상태 register를 단순한 ready 스위치로 취급하면 정상 종료와 실패 종료를 같은 사건으로 읽는다. 오류를 표시하는 bit까지 포함해, 어떤 명령의 결과를 언제 읽었는지 연결해야 실제 저장 결과를 판단할 수 있다.
종료와 성공을 서로 다른 bit로 읽는다
Alliance Memory의 SPI NAND 문서를 예로 들자. 이 제품군에서는 GET FEATURE 0Fh 명령과 주소 C0h로 status register를 읽는다. bit 0의 OIP는 Operation In Progress다. program, page read, erase 또는 reset이 진행 중이면 1이고, 0이면 interface가 ready 상태다. 이것이 성공 여부까지 뜻하지는 않는다. Alliance SPI NAND 원문 p.41, Table 12-1
bit 3의 P_FAIL은 program 실패, bit 2의 E_FAIL은 erase 실패다. bit 1의 WEL은 쓰기 허용 latch이며 program execute나 erase 전에 설정되어야 한다. WEL이 1이라는 사실은 쓰기 준비 조건을 말한다. 이번 데이터가 이미 성공적으로 기록되었다는 뜻은 아니다.
상위의 ECCS1·ECCS0는 읽기에서 나온 ECC 상태다. 문서는 00b를 검출 오류 없음, 01b를 오류 검출 후 정정, 10b를 오류 검출 후 정정하지 못함, 11b를 최대 정정 수에 해당하는 오류를 정정한 상태로 정의한다. 11b의 자세한 오류 수는 확장 register에 따른다. 이 bit 배치는 해당 문서의 규칙이며 다른 제조사의 NAND에 그대로 적용할 수 없다.
ready인 08h는 성공한 program이 아니다
가상 trace에서 다른 status bit는 모두 0이라고 정하자. program 실행 중 status가 01h이면 OIP=1이다. 이후 08h가 돌아왔다면 OIP=0이므로 장치는 ready지만 P_FAIL=1이다. ready만 검사한 코드는 이 실패 종료를 성공으로 오해한다.
erase 뒤 04h가 나오면 같은 방식으로 ready이면서 E_FAIL=1이다. 읽기 완료 뒤 20h가 나오면 ECCS=10b, OIP=0이다. 데이터 전송을 할 수 있는 상태와, 그 데이터를 ECC가 올바르게 복구했는지는 별개의 판단이다. 10h라면 ECCS=01b로 정정된 결과다. 이것을 모든 제품에서 동일한 16진수 상태표라고 읽어서는 안 된다.
program의 실제 명령 흐름은 WRITE ENABLE 06h, PROGRAM LOAD, PROGRAM EXECUTE 10h, GET FEATURE 순으로 설명되어 있다. 실행 뒤 OIP가 내려오는지 기다리고 P_FAIL을 확인해야 명령의 결과가 이어진다. erase에는 E_FAIL, page read에는 완료된 읽기의 ECC 상태가 필요하다. 원문 p.28 및 p.35
실패 bit에도 수명이 있다
이 문서에서 P_FAIL은 다음 PROGRAM EXECUTE 명령 sequence 또는 RESET에 의해 지워진다. E_FAIL은 다음 BLOCK ERASE 시작 또는 RESET에 의해 지워진다. 따라서 이전 결과를 저장하기 전에 같은 종류의 새 명령을 시작하면, 이전 실패 표시가 사라질 수 있다.
가령 page A의 program이 실패했다. 상태를 읽어 두기 전에 page B의 program execute를 시작하면 P_FAIL이 지워진다. B가 성공한 뒤 P_FAIL=0을 보았다고 해서 A도 성공했다고 소급할 수는 없다. 실패 표시를 명령의 주소와 함께 보존해야 하는 이유다.
실패 bit의 의미도 물리적인 셀 불량으로 좁힐 수 없다. 원문은 P_FAIL이 잘못된 주소나 보호된 영역에 쓰기를 시도할 때도 설정된다고 명시한다. E_FAIL 역시 잠긴 영역에 erase를 시도하면 설정된다. 실패 표시를 받았을 때 주소·보호 상태·명령 순서와 실제 program/erase 문제를 함께 확인해야 한다.
ECC 상태는 read 시작이나 reset 뒤 초기화되고 유효한 동작 완료 후 갱신된다. ECC를 꺼도 해당 상태가 지워진다. 그러므로 초기값 00b만 보고 아직 읽지 않은 page가 오류 없다고 판단하면 안 된다. power-on reset 뒤에는 block 0, page 0의 내용에 따른 별도 규칙도 있어, 평소 읽기 결과와 초기화 결과를 구별해야 한다.
timeout 역시 성공이나 실패를 대신하는 상태값이 아니다. 제한 시간 안에 ready를 관측하지 못했다면 명령이 끝났는지 알지 못한 것이다. reset으로 interface를 회복시키더라도 원래 명령의 성공 증거가 새로 생기지는 않는다.
NAND Status Register를 읽는 올바른 단위는 bit 하나보다 명령 한 건이다. 실행한 종류와 주소를 기록하고, 완료를 기다리고, 그 종류에 맞는 결과를 저장한다. ready가 알려 주는 것은 다음 대화가 가능해졌다는 사실이다. 이전 일이 성공했는지는 그 뒤의 질문으로 남는다.