모든 이야기

SPI NAND를 읽을 때 주소를 두 번 나누어 지정하는 이유

SPI NAND에서 어떤 주소의 32byte를 읽으려는데, 한 번은 page 주소를 보내고 다음에는 column 주소를 보내야 한다. 작은 데이터를 요청했으니 바로 그 byte부터 출력하면 될 것 같지만 NAND array와 serial 출력 사이에는 page cache가 있다. NAND Page Cache는 array에서 감지한 page를 host가 부분적으로 가져갈 수 있게 보관한다.

이 구조를 이해하면 주소 두 개는 중복이 아니다. 첫 주소는 어느 page를 cache에 가져올지, 두 번째 주소는 현재 cache의 어느 byte부터 꺼낼지를 지정한다.

page를 고른 뒤 byte를 고르는 순서

Alliance Memory SPI NAND Rev.1.0의 5.2–5.3절은 Page Read 13h가 array data를 cache로 옮기고, Read from Cache 03h/0Bh가 column에서 출력한다고 설명한다. 두 명령 사이에는 tRD 동안의 busy 상태가 있다.

이 제품군의 AS5F34G04SND-08LIN을 예로 들면 한 block은 64page이고, page의 main data는 2048byte다. 1.3절의 mapping에서 row address 하위 6bit는 block 내부 page를, 그 위 bits는 block을 고른다. column은 page 안의 byte 위치다. spare 영역까지 존재하지만 아래 예는 main data만 사용한다.

block 7의 page 3에서 column 100부터 32byte를 읽는다고 하자. row 값은 7×64+3=451, 즉 0x1C3이다. 13h에 필요한 24bit 주소 field로 이 row를 전달하고, 장치가 array sensing과 cache 전송을 끝내도록 기다린다. 이 부품에서는 사용하지 않는 상위 주소 bits도 문서에 맞게 처리한다.

그 뒤 03h의 column field에 100, 즉 0x64를 넣어 cache의 byte 100–131을 가져온다. 이 column 주소를 13h에 대신 넣으면 원하는 block/page를 선택한 것이 아니다. row와 column은 숫자 모양이 비슷해도 서로 다른 공간의 주소다.

같은 cache에서 다른 부분을 읽기

cache에 page 451이 남아 있고 이를 바꾸는 동작이 없었다면, 다음 32byte를 column 500부터 출력하는 데 새 page sensing이 필요하지 않다. 같은 page의 다른 구간을 serial interface로 가져올 수 있다.

반대로 row 452의 column 100을 읽으려면 먼저 새 Page Read가 필요하다. column을 바꾸는 명령만으로는 cache의 page가 451에서 452로 바뀌지 않는다. 이 누락은 값이 그럴듯하게 출력될 수 있어 찾기 어렵다. driver가 cache에 들어 있는 row를 함께 관리해야 한다.

cache는 비휘발성 저장 array와 다르다. reset이나 다른 cache를 사용하는 명령 뒤에 이전 내용이 계속 유효하다고 가정하지 않는다. 여러 요청이 같은 장치를 공유하면 cache row와 명령 순서를 하나의 상태로 다뤄야 다른 요청의 page를 읽는 혼동을 막을 수 있다.

serial clock만 높여도 기다림은 남는다

가상 tRD를 50µs로 고정하고 32byte를 x1 방식 50MHz로 출력한다고 하자. payload 전송만 계산하면 32×8/50MHz=5.12µs다. 새 page를 가져오는 첫 요청은 두 부분만 더해도 55.12µs가 필요하다.

clock을 100MHz로 높이면 payload는 2.56µs가 되지만 합은 52.56µs다. 두 시간이 모두 반으로 줄지 않는다. array sensing이 같은 50µs로 남았기 때문이다. 이 수치는 설명용이며 실제 부품의 tRD 보증값이나 측정 throughput이 아니다. command·주소·dummy·status polling과 CS timing도 계산에서 빠졌다.

같은 page 안에서 여러 부분을 읽으면 초기 tRD를 나눠 부담할 수 있다. 하지만 매우 작은 read가 여러 page에 흩어지면 매번 page-to-cache를 수행한다. 단순한 SPI clock 수치보다 접근의 page locality가 응답 시간에 큰 영향을 줄 수 있다.

완료 상태와 올바른 내용도 구분한다

5.2절은 GET FEATURE 0Fh로 C0h status의 OIP를 확인하고, OIP가 0이 된 뒤 cache output을 진행하는 순서를 설명한다. busy가 끝났다는 정보는 내용에 오류가 없다는 정보와 별개다.

12절의 ECC status는 오류 없음, 정정됨, 정정되지 못함 등을 구분한다. 내부 ECC를 사용한다면 해당 read가 갱신한 상태를 함께 확인해야 한다. status를 다른 page read 뒤에 뒤늦게 확인하면 어느 page의 결과인지 혼동할 수 있다. ECC 설정과 보호되는 영역도 대상 부품에 맞춰야 한다.

NAND Page Cache를 거친 읽기는 “주소를 보내면 즉시 byte가 나온다”는 모델로 설명하기 어렵다. page 선택·cache 완료·부분 출력이 이어지는 동작이다. cache가 담은 row와 출력 column을 함께 추적하면, 불필요한 sensing을 줄일 지점과 clock을 올려도 남는 대기, 잘못된 page를 읽는 오류를 구분할 수 있다.

SPI NAND를 읽을 때 주소를 두 번 나누어 지정하는 이유 · ariser