Pamięć Flash – klasyfikacja nośników i typy błędów
| TechnikaPamięć Flash typu NAND oraz NOR jest ważnym komponentem różnego rodzaju urządzeń. Aby projekt, w którym korzysta się z tych typów nośników pamięci, zakończył się sukcesem, dobrze jest znać m.in. występujące między nimi różnice, sposoby ich klasyfikacji i problemy dla nich charakterystyczne. Wymienione kwestie przedstawiamy w artykule.
Pamięci Flash zbudowane są z komórek, z których każda składa się z dwóch bramek: pływającej i sterującej. W tej pierwszej gromadzony jest ładunek. Bramka sterująca odczytuje go jako wartość logiczną 0 lub 1. Może ona też kasować i zapisywać zawartość bramki pływającej. Ze względu na rodzaj bramki logicznej pamięci Flash dzieli się na: NOR oraz NAND.
Pamięć Flash - NAND vs. NOR
Pamięci NAND mają typowo większe pojemności niż NOR, przede wszystkim dzięki niższemu kosztowi bitu danych. Wynika on stąd, że mają one o typowo kilkadziesiąt procent mniejsze komórki, dzięki czemu cechuje je większa gęstość upakowania danych. Dlatego są używane głównie do przechowywania danych.
Pamięci flasz typu NAND i NOR są zorganizowane w bloki. Taka architektura pozwala obniżyć koszt przy jednoczesnym zachowaniu wydajności. Mniejsze rozmiary bloków umożliwiają szybsze cykle kasowania. Minusem są jednak większy rozmiar i koszt pamięci. Dzięki niższemu kosztowi bitu danych mniejsze bloki są bardziej opłacalne w pamięciach NAND.
Szybkość operacji
Kasowanie danych w pamięciach NAND jest prostsze, z kolei operacja ta w przypadku pamięci NOR jest znacznie wolniejsza, nawet kilkaset razy. Te drugie to pamięci o dostępie swobodnym, natomiast w NAND wykorzystuje się multipleksowane adresy i magistrale danych. Przez to odczyt jest w ich przypadku znacznie wolniejszy, nawet kilkaset razy.
Aby go przyspieszyć, pamięci NAND odczytuje się stronami, które stanowią zbiór bloków. Każda strona jest odczytywana sekwencyjnie, a operacje spowalniające to zadanie są wykonywane tylko na początku każdego cyklu odczytu. W efekcie wypadkowy czas dostępu jest krótszy niż w NOR.
W pamięciach flash obu typów dane mogą być zapisywane w bloku tylko wtedy, gdy jest pusty. W rezultacie wolne kasowanie danych w pamięciach NOR wydłuża również operację zapisu. W NAND tymczasem, podobnie jak w przypadku odczytu, dane są często zapisywane stronami. By przyspieszyć operację zapisu, pamięci NOR wykorzystują podobne rozwiązanie z buforowaniem danych.
Niezawodność pamięci Flash
Pamięci NOR pobierają więcej mocy po włączeniu zasilania, ale mniej w trybie standby. Oprócz tego pod tym względem oba typy nośników są porównywalne, a więc wypadkowy pobór mocy zależy od typu wykonywanych operacji. Pamięci NOR pobierają jej mniej podczas operacji odczytu, zaś NAND w czasie operacji kasowania, zapisu i odczytu sekwencyjnego.
W pamięciach Flash występuje niekorzystne zjawisko bit-flippingu. Jest ono częstsze w pamięciach NAND niż NOR. Poza tym w tych pierwszych podczas produkcji niektóre bloki pamięci ulegają uszkodzeniu (bad blocks). W czasie użytkowania pamięci jeszcze ich przybywa w miarę kolejnych cykli zapisu i kasowania danych. W fabrycznie nowych pamięciach NOR nie występują uszkodzone bloki i mniejsza ich liczba powstaje w czasie użytkowania nośnika. W zakresie liczby cykli zapisu i kasowania pamięci obu typów są porównywalne, jednak ze względu na mniejsze rozmiary bloków każdorazowo kasowanych żywotność pamięci NAND jest dłuższa.
Podsumowując, pamięci NOR sprawdzają się, gdy nie jest wymagana duża pojemności, ale ważne są: szybki odczyt i niezawodność zapisu, natomiast NAND, gdy oczkuje się dużej pojemności oraz szybkiego zapisu i kasowania danych.
Czym jest bramka pływająca?
Pamięci NAND klasyfikuje się na podstawie ich architektury i sposobu przechowywania danych w komórkach pamięci. Aby dobrze zrozumieć specyfikę, zalety i ograniczenia poszczególnych typów tytułowych nośników, warto najpierw poznać szczegóły ich struktury i działania.
Jak wspomnieliśmy we wstępie, pamięci Flash zbudowane są z komórek, z których każda składa się z dwóch bramek: pływającej i sterującej. Pierwsza z wymienionych jest to dodatkowa, elektrycznie izolowana bramka pomiędzy bramką a kanałem tranzystora. To w niej gromadzony jest ładunek, który jest odczytywany jako wartość logiczna 0 lub 1.
Na czym polega odczyt?
Bramka pływająca jest elektrycznie izolowana, więc ładunki w niej zgromadzone pozostają tam nawet w razie odłączenia zasilania. To zapewnia nieulotność zapisanych danych. Inaczej niż w przypadku "zwykłych" tranzystorów MOSFET ze stałym napięciem progowym w tych z bramką pływającą zależy ono od ilości ładunku zgromadzonego w bramce pływającej.
Im jest ich więcej, tym wyższe napięcie progowe. Dzięki temu dane zapisane w komórce pamięci można odczytać, mierząc napięcie progowe, po przekroczeniu którego tranzystor zaczyna przewodzić prąd, i porównując je ze stałym napięciem odniesienia.
Zapis i kasowanie danych
Jeżeli z kolei chodzi o operację zapisu danych, można ją zrealizować na jeden z dwóch sposobów. W pierwszym między ujemnie naładowanym źródłem a dodatnio naładowaną bramką kontrolną doprowadzane jest silne pole elektryczne. W efekcie ładunki są ze źródła przez cienką warstwę tlenku wprowadzane do bramki pływającej. W drugiej metodzie rezultat ten uzyskuje się, gdy przez kanał płynie prąd o dużym natężeniu.
Operacja kasowania danych polega z kolei na przyłożeniu ujemnego napięcia do bramki kontrolnej i dodatniego napięcia do zacisków źródła i drenu. Powoduje to przepływ ładunków z powrotem do kanału przez cienką warstwę tlenku.
Sposób, w jaki dane są zapisywane oraz kasowane, powoduje stopniowe zużywanie się warstwy tlenku. Gdy nie można już zmierzyć różnicy między stanami logicznymi, komórkę uznaje się za niesprawną.
Klasyfikacja pamięci NAND
Generalnie wyróżnić można trzy główne typy pamięci NAND: SLC (Single Level Cell), MLC (Multi Level Cell) i TLC (Triple Level Cell). Pamięci TLC mają większą pojemność (przy porównywalnych wymiarach) niż MLC, które z kolei pod tym względem przewyższają SLC. Oprócz tego każdy typ pamięci NAND ma zalety i pewne ograniczenia.
W pamięciach SLC każda komórka pamięci przechowuje tylko jeden bit informacji, napięcie progowe komórki jest więc porównywane z jednym poziomem napięcia. Dzięki temu odczyt komórki jest łatwiejszy i szybszy. Łatwiej jest także bezbłędnie rozpoznać poziom logiczny, nawet w obecności zaburzeń podczas operacji odczytu. Poza tym na poprawność odczytu w mniejszym stopniu wpływa zużywanie się komórki. Dodatkowo dane można kasować i programować przy niższych napięciach, co wydłuża żywotność nośnika wyrażaną liczbą cykli kasowania / zapisywania. Ograniczeniem pamięci SLC NAND jest większy koszt w porównaniu z innymi typami pamięci, które charakteryzuje większa gęstość upakowania danych.
Pamięci MLC i TLC
W pamięciach MLC Flash każda komórka pamięci przechowuje dwa bity informacji, napięcie progowe jest więc porównywane z trzema poziomami napięć. W związku z tym wymagana jest większa precyzja odczytu, co z kolei spowalnia tę operację w porównaniu z pamięciami typu SLC. Łatwiej jest również o błędny odczyt. Na jego wiarygodność w większym stopniu wpływa również zużycie komórki. Wymóg większej dokładności spowalnia także operację programowania. Główną zaletą jest niższy koszt bitu danych, nawet kilkukrotnie mniejszy niż w przypadku SLC NAND.
W pamięciach TLC NAND każda komórka pamięci przechowuje trzy bity informacji, napięcie progowe jest zatem porównywane z siedmioma poziomami. W związku z tym zalety i ograniczenia pamięci MLC ulegają w ich przypadku dalszemu pogłębieniu. Dlatego pamięci TLC są wykorzystywane głównie tam, gdzie koszt jest priorytetem, a optymalizacja aplikacji pod tym kątem może się odbyć kosztem mniejszej liczby cykli programowania / kasowania, a zatem głównie w elektronice użytkowej.
Ponadto dostępne są pamięci 3D NAND lub V-NAND (Vertical NAND), w których komórki pamięci są rozmieszczane w płaszczyźnie Z. W ten sposób zwiększa się gęstość upakowania danych.
Błędy w pamięciach NAND
Ponieważ pamięci NAND są podatniejsze na występowanie błędów, warto przed włączeniem do projektu nośnika tego typu zapoznać się z tymi najczęstszymi oraz metodami ich niwelowania lub zapobiegania im. Generalnie błędy te można podzielić na dwie kategorie: trwałe i czasowe. Do pierwszej z nich należy zaliczyć zużywanie się pamięci.
O mechanizmie zużywania się pamięci wspomnieliśmy w akapicie opisującym operacje kasowania oraz zapisywania danych. Dla przypomnienia – za każdym razem, gdy komórka jest programowana lub kasowana, kilka ładunków zatrzymuje się w warstwie tlenku, tym samym przyczyniając się do jej zużycia. Gdy nie jest już możliwe rozróżnienie poziomów logicznych, daną komórkę uznaje się za uszkodzoną i wyłącza z użytku.
Błędy odczytu
Aby odczytać komórkę pamięci, należy zmierzyć jej napięcie progowe. W tym celu na bramkę podaje się napięcie, które zwiększa się do czasu, gdy tranzystor zacznie przewodzić prąd. W związku z tym, że komórki pamięci NAND są ze sobą połączone w ramach jednej strony, wszystkie, które poprzedzają daną komórkę, muszą być załączone, zanim można będzie odczytać jej stan.
Choć napięcie odczytu jest znacznie mniejsze w porównaniu z napięciem programowania lub kasowania, może powodować niewielkie przesunięcia napięcia progowego komórek. Te, mimo że za każdym razem niewielkie, zmiany ostatecznie w kolejnych cyklach odczytu kumulują się, co w dłuższej perspektywie skutkuje błędami odczytu. Ponieważ jednak zaliczane są one do kategorii problemów czasowych, można je zlikwidować, kopiując dany blok do innego, a następnie wykasowując ten pierwszy przed jego ponownym zaprogramowaniem.
Błędy zapisu
Do tej samej kategorii problemów przejściowych co wyżej opisane błędy odczytu zalicza się także błędy programowania. Jak wspomnieliśmy, w celu zapisu danych albo ich skasowania do komórki przykładane jest napięcie. Z powodu występowania pasożytniczego sprzężenia pojemnościowego oddziałuje ono również na sąsiednie komórki. Może to zmienić ich napięcie progowe. Podobnie jak w przypadku błędów odczytu, aby uniknąć błędów zapisu, zawartość danego bloku trzeba skasować po wcześniejszym jej skopiowaniu do innego bloku.
Błędy przechowywania
Warto również wspomnieć o tym, że dane przechowywane w pamięciach Flash z czasem ulegają samoistnemu uszkodzeniu. Jest to spowodowane utratą ładunku przechowywanego w bramce pływającej. To z kolei wynika stąd, że mimo obecności warstwy izolatora ładunki z bramki pływającej od czasu do czasu przenikają przez niego. W miarę upływu czasu efekt ten się kumuluje, ostatecznie zmieniając stan komórki zafałszowując zapisaną w niej informację. Analogicznie, do przypadku innych błędów czasowych, by problem ten rozwiązać, problematyczny blok należy skasować po wcześniejszym skopiowaniu jego zawartości do innego.
Warto dodać, że na ten typ błędów bardziej narażone są komórki pamięci z większą liczbą cykli kasowania / programowania ze względu na większe w ich przypadku zużycie warstwy tlenku. Czynnikiem, który sprzyja zafałszowywaniu zapisanych danych, jest również temperatura – im wyższa, tym większe prawdopodobieństwo jego wystąpienia. Częściej tego typu błędy występują w pamięciach MLC i TLC.
Na czym polega równoważenie zużycia pamięci?
Na koniec warto wyjaśnić, jak usiłuje się spowolnić trwałe zużywanie się pamięci. W tym celu stosuje się technikę optymalizacji jej zużycia (wear leveling). Polega to na monitorowaniu częstości użycia poszczególnych bloków pamięci i równomiernym rozmieszczaniu w nich danych tak, aby żaden z bloków nie był czyszczony ani zapisywany częściej niż pozostałe. W efekcie wszystkie bloki pamięci są przynajmniej raz zapisane, zanim operacja ta zostanie powtórzona. Maksymalna liczba komórek pamięci flash jest wtedy zużyta minimalnie, a żywotność jest najdłuższa z możliwych. Wear leveling realizuje się na jeden z dwóch sposobów.
Pierwsza metoda polega na optymalizacji zapisu wyłącznie danych dynamicznych, czyli tych, które są często zmieniane. Zapisuje się je do tych bloków, których dotychczas używano najrzadziej. Druga metoda polega na zarządzaniu zapisem danych dynamicznych i statycznych. Monitorowany jest w niej stopień zużycia wszystkich bloków pamięci. Jeżeli te, z których dotychczas korzystano najrzadziej, są aktualnie puste, zapisuje się do nich nowe informacje. Gdy jednak znajdują się już w nich dane statyczne, te ostatnie przenosi się do bloków bardziej zużytych. Z powodu złożoności technika ta bardziej obciąża kontroler pamięci i spowalnia zapis. W zamian zapewnia jednak maksymalną możliwą żywotność nośnika. Integralność danych poprawia się z kolei, stosując kodowanie korekcyjne ECC (Error Correction Code). Aby sprawdzić, czy dane zostały zapisane poprawnie, uzupełnia się je o nadmiarowe informacje. Po ich rozkodowaniu wiadomo, które bity danych są przekłamane.
Monika Jaworowska