모든 이야기

NAND reset 뒤 ready 신호가 돌아와도 쓰던 데이터는 보장되지 않는다

NAND가 응답하지 않아 reset을 보냈고, 잠시 뒤 ready가 돌아왔다. 통신이 회복되었으니 중간에 쓰던 page도 정상일까? NAND Reset Recovery에서 가장 먼저 구별할 것은 명령을 다시 받을 수 있는 상태와 저장 데이터가 유효한 상태다.

reset은 진행 중인 작업을 끝까지 성공시키는 명령이 아니다. 장치의 제어 상태를 정리하며 작업을 중단할 수 있다. 기록 중에 바뀐 셀 상태까지 이전 상태로 되돌려 주는 transaction rollback으로 생각하면 복구 절차가 틀어진다.

중단한 일이 무엇인지 먼저 남긴다

Alliance SPI NAND 문서는 RESET FFh가 모든 동작을 멈추며, cache program이나 cache read의 진행 중·대기 중 작업도 중단할 수 있다고 설명한다. 같은 문서에서 reset 중에는 OIP=1이고, OIP=0이면 interface가 ready다. reset은 program·erase 실패 bit도 지운다. ready와 지워진 실패 bit만으로 중단한 명령의 결과를 재구성할 수 없다. Alliance SPI NAND 원문 p.36 및 p.41

부분 기록의 위험은 병렬 NAND 문서에 더 직접적으로 나와 있다. Alliance AS9FxxG08SA의 Reset 절은 busy 상태에서 read·program·erase를 중단할 수 있으며, 변경 중이던 셀의 데이터는 부분적으로 program 또는 erase되어 더 이상 유효하지 않다고 명시한다. 이 문서의 reset timing은 해당 병렬 제품의 규칙이다. SPI 제품의 status 값과 섞어서 사용하지 않아야 한다. Alliance AS9FxxG08SA 원문 p.19, §3.6

read를 중단했다면 완료되지 않은 buffer 데이터를 읽기 결과로 채택하지 않는다. array 내용을 읽어 오는 일과 내용을 바꾸는 일은 다르다. program을 중단했다면 대상 page의 기록 결과가 불확실하다. erase를 중단했다면 대상 block의 셀이 모두 지워졌다는 조건을 잃는다. 명령 종류가 다르므로 재시작 범위도 달라진다.

초기화된 flag는 사라진 사건을 말해 주지 않는다

가상의 SPI trace를 보자. 시간 0μs에 page A의 program execute를 시작하고, 100μs에 OIP=1을 관측했다. 120μs에 reset을 보내고 140μs에 OIP=0, P_FAIL=0을 읽었다고 하자. 이 수치는 설명용 일정이며 제품의 reset 정격이 아니다.

140μs의 결과로 알 수 있는 것은 interface가 ready이고 현재 P_FAIL이 0이라는 사실이다. reset이 P_FAIL을 지우므로 A가 program에 성공했는지, 실패했는지, 일부만 진행되었는지는 이 두 bit로 확정할 수 없다. reset 전에 무엇을 실행했는지 host가 남겨 두어야 다음 검증의 대상을 찾는다.

셀의 중간 상태를 단순화해 보면 rollback이 아닌 이유가 드러난다. 가상의 셀에서 초기 문턱전압이 0.5V이고 목표가 2.0V라고 하자. 여러 pulse로 올리다가 1.3V에서 중단되었다면 제어 회로를 초기화해도 그 전압이 자동으로 0.5V나 2.0V가 되는 것은 아니다. 이 값들은 특정 NAND의 실제 state나 program pulse가 아니라, 저장 상태의 변화와 제어 초기화가 다름을 보여 주는 예다.

다시 쓰기 전에 유효성 조건을 복원한다

중단한 읽기는 필요한 초기화와 설정 확인 뒤 다시 수행하고, 새로 완료된 명령의 ECC 상태를 확인한다. 중단한 program의 page는 단순히 같은 데이터를 다시 보내는 것만으로 정상 page가 된다고 가정하지 않는다. 제품마다 허용 program 횟수와 순서가 있고, 이미 변한 셀을 처음 쓰는 page처럼 취급할 수 없기 때문이다.

중단한 erase도 일부 byte가 FFh로 보인다는 이유만으로 완료 처리할 수 없다. block 전체의 erase 조건이 필요하다. 다시 erase하여 재사용할 수 있는지, 검증 과정에서 실패를 보고하면 어떻게 제외할지는 해당 제품의 허용 절차와 block 관리 정책에 따라 결정한다. reset을 한 번 겪었다는 이유만으로 무조건 영구 bad block이라고 결론 내릴 수도 없다.

여기에는 논리 주소 갱신 순서가 연결된다. 새 page B가 성공했다고 확인하기 전에 원래 데이터 A를 버리거나 mapping을 B로 확정했다면, reset 후 새 기록의 유효성을 판단하지 못할 때 복구할 출발점도 잃는다. 새 데이터를 검증하고 전환을 확정하는 절차와 기존 유효본을 유지하는 정책이 필요한 이유다. 구체적인 transaction 보장은 NAND reset 명령만으로 제공되지 않는다.

여러 die나 pending 작업이 있는 구성에서는 reset의 적용 범위도 확인해야 한다. 어떤 target의 어떤 작업이 취소되는지 모르면 주소 하나만 검사하고 다른 중단 작업을 놓칠 수 있다. datasheet의 recovery timing을 지키는 일은 그 절차의 시작이지 전체 데이터 복구의 완료가 아니다.

NAND Reset Recovery의 완료 조건은 ready 하나로 쓰기 어렵다. 장치가 명령을 받을 수 있고, 중단한 작업의 범위를 알고, 사용할 데이터나 block의 유효성을 다시 확보해야 한다. reset 전의 작업 기록을 남기는 습관이 reset 후의 판단 근거가 된다.