SPI MRAM의 빠른 쓰기에서 실제 commit 경계는 어디일까
SPI MRAM은 긴 erase나 program 대기 없이 데이터를 연속해서 쓸 수 있다. 그렇다면 chip select를 한 번 내리고 여러 byte를 보내는 동안 갱신 전체가 한 덩어리로 보장될까? SPI MRAM Write Boundary에서 보아야 할 경계는 전송 명령의 끝과 데이터 구조의 확정 지점이다.
빠르게 쓴다는 특성과 한꺼번에 바뀐다는 특성은 별개다. 여러 byte를 순서대로 받아 쓰는 장치라면, 앞부분이 바뀌고 뒷부분은 아직 도착하지 않은 구간이 존재한다. 그 구간에서 작업이 끝나면 정상적인 byte들의 조합도 불완전한 record가 될 수 있다.
CS는 전송을 묶지만 record를 원자화하지 않는다
Everspin MR20H40/MR25H40의 Rev.12.6 문서는 WRITE 02h와 3byte 주소 뒤 데이터를 연속해서 쓸 수 있고 CS를 high로 올려 명령을 끝낸다고 설명한다. 정격 clock에서 별도의 write delay나 data polling을 요구하지 않는다는 점도 명시한다. 원문 p.7 및 p.12
이는 CS를 올릴 때까지 모든 byte를 내부에 보류했다가 한꺼번에 바꾼다는 설명이 아니다. 문서는 byte들이 순차적으로 기록된다고 한다. SPI 명령의 한 구간에 있었다는 이유만으로 host의 구조체나 log record 전체가 atomic하게 갱신된다고 가정할 수 없다.
가상의 4byte record가 00 00 00 00이고 새 값은 12 34 56 78이라고 하자. 정상 전압·명령 조건에서 앞의 세 data byte까지만 보내고 올바른 byte 경계에서 CS를 올렸다면 새 기록은 12 34 56 00이다. 세 byte를 쓴 명령은 정상적으로 끝날 수 있지만, host가 의도한 4byte 갱신은 끝나지 않았다.
마지막 byte를 다 보내지 않은 경우
datasheet는 접근을 byte의 끝, CS가 내려간 이후 8clock의 정수배 경계에서 끝내라고 요구한다. Everspin의 MR25Hxxx FAQ는 byte 중간에 CS를 high로 올렸을 때 잘린 마지막 byte는 기록되지 않는다고 설명한다. 이것은 해당 SPI 제품군의 명시된 동작이며 일반적인 정상 종료 방식으로 사용할 규칙은 아니다. 공식 FAQ, MR25Hxxx Byte Write Cycle
위 record의 두 data byte를 모두 보내고 세 번째를 4bit만 보냈다고 하자. 명령 8bit와 주소 24bit, 앞의 data 16bit와 미완성 4bit를 합하면 52clock이다. 이때 CS를 올린 경우 FAQ의 마지막 byte 규칙을 적용하면 세 번째 미완성 byte를 새 데이터로 인정하지 않는다. 앞의 완전한 두 byte가 있었다는 사실까지 전체 갱신의 취소로 바뀌는 것은 아니다.
실제 power cut은 이 정상 전압에서의 CS 종료와 같지 않다. 전압이 동작 범위를 벗어나는 중에 들어온 bit나 쓰던 byte의 결과를 위 규칙만으로 보장할 수 없다. 전원 복귀 뒤 저장 결과를 확인하는 절차가 필요하다. bus protocol의 잘린 byte 규칙을 전원 차단 원자성으로 확대하면 안 된다.
소요 시간을 줄여도 중간 상태는 존재한다
clock을 가상으로 10MHz로 두면 command 1byte, address 3byte, data 4byte는 총 64clock, 6.4μs다. WREN 명령과 CS 간격 등은 제외한 시간이다. data 세 byte까지는 56clock, 5.6μs다. 짧은 쓰기라고 해도 5.6μs에서 끝난 전송과 6.4μs까지 끝난 전송은 같은 내용을 남기지 않는다.
이 제품의 status register에는 긴 program을 기다리는 write-in-progress bit가 필요하지 않다. 하지만 busy polling이 없다는 사실이 record checksum 검사나 write 보호 조건을 대체하지는 않는다. WEL과 보호 상태는 접근이 허용되는지를 나타내며 여러 byte의 내용이 서로 일관된지를 증명하지 않는다. 원문 p.8 및 p.10
확정 지점은 저장 형식이 만들어야 한다
새 record를 빈 slot에 쓰고, payload와 길이·순번·검사 정보를 먼저 완성한 뒤 마지막에 valid marker를 쓰는 방식을 생각할 수 있다. 처음 invalid로 준비된 새 slot에서 payload가 중간에 멈추면 marker가 아직 없으므로 완성 record로 채택하지 않는다. 기존 유효 record는 새 record의 완료를 확인하기 전까지 유지한다.
여기서 marker 하나가 모든 전원 고장을 해결한다고 볼 수는 없다. slot을 재사용하면서 옛 valid marker를 남겨 두면 새 payload의 일부와 옛 marker가 함께 보일 수 있다. marker의 초기화, 순번의 처리와 읽기 검증 조건도 저장 형식의 일부다.
검사 정보도 확률적인 검출 한계를 가지므로 실제 오류 모델에 맞게 선택해야 한다. 전원 하강 중 marker byte의 유효성이 불확실할 수 있다는 점과 host의 write 순서가 실제 SPI 전송 순서로 보장되는지도 확인한다. 원자적인 record 보장은 단순히 “marker를 마지막에 보내라”는 한 줄보다 구체적인 계약이다.
SPI MRAM Write Boundary를 판단할 때는 정상 완료한 byte, 올바르게 종료한 명령과 유효한 record를 따로 확인한다. MRAM의 빠른 연속 쓰기는 좋은 재료다. 그 재료를 전원 복귀 후에도 읽을 수 있는 일관된 데이터로 만드는 확정 경계는 시스템의 기록 순서와 검증 규칙에서 정해진다.