SSD的Read Disturb及解決方法

NO IMAGE

快閃記憶體存在幾個問題,影響著資料可靠性。

首先是擦除次數,快閃記憶體擦除次數的增多,會使隔離浮柵極電子的氧化層磨損,絕緣效能變差,最後導致資料出錯。具體可參看《你的SSD可以用100年,你造嗎?》。

然後是data retention問題,就是隨著時間的流逝,儲存在快閃記憶體中的資料會消失,原因是浮柵極裡面的電子跑出來了。電子跑出來的速度是跟擦除次數成正比的,也就是,快閃記憶體擦寫次數越多,電子跑得越快,也就是資料消失得越快。詳情還得看上面文章。

還有就是program disturb和read disturb,顧名思義,就是讀寫快閃記憶體的時候,會影響資料。與data retention不同的是,讀寫干擾導致的是電子進入浮柵極,而不是浮柵極裡面的電子跑出來。不管怎樣,浮柵極裡面電荷的異常變化,就意味著資料的丟失。讀寫干擾的影響,也是跟快閃記憶體擦寫次數息息相關的,你想,擦寫次數越多,絕緣效能越差,電子當然也就更容易進入浮柵極。

如題,今天我們先講讀干擾,看看什麼是Read Disturb,以及我們有什麼辦法來對付這種干擾。

記得幾年前我們碰到一個問題,就是有客戶反映,他們在使用我們SSD的時候,發現Performance過段時間就有一個比較大的drop。後來,經過我們工程師的努力,發現罪魁禍首就是Read Disturb。最後,聰明的工程師完美的解決了這個問題。這個工程師就是Ziv,哈哈。別問我Ziv是誰,我不會告訴你他現在美光。

Read Disturb為什麼會導致效能下降?後面再解釋。

先看看什麼是Read Disturb。

還得先從快閃記憶體基本原理開始。

還是這張圖,基本儲存單元結構圖,浮柵極被上下絕緣層(黃色標示)包裹,電荷就儲存在裡面。牢記這張圖,這是快閃記憶體的根。

這樣的單元,儲存著若干個位元的資料,具體取件於快閃記憶體型別:SLC一個單元一個位元,MLC一個單元兩個位元,TLC一個單元三個位元。一個快閃記憶體,就是由很多很多這樣的儲存單元構成。它不是雜亂無章的擺放,而是按一定規律組織起來的,如下圖所示。

快閃記憶體由Block組成,是擦除的基本單元。一個Block包含若干個Page,上圖以256個Page為例。一個Wordline(上圖黃色所示)對應著一個Page或幾個Page,取決於SLC, MLC和TLC:對SLC來說,一個WordLine對應一個Page;MLC則對應2個Page,這兩個Page是一對:Lower Page 和Upper Page;TLC對應3個Page。(關於上述論斷,是按單個Plane來說的,而且是2D快閃記憶體的)一個Page有多大,那麼WordLine上面就有多少個儲存單元(Cell),即有多少個Bitline。上圖示例有71488個bitline,表明該快閃記憶體Page大小是71488/8 = 8936 bytes。

接下來的討論,我們以MLC為例。

一個MLC,每個儲存單元儲存兩個位元的資料,一共四個狀態。通過往儲存單元的浮柵極內注入不同電荷數,來區分四個不同狀態。如下圖所示:

我們知道,要使一個電晶體導通,在控制極必須加一個大於電晶體閾值電壓的控制電壓。對浮柵極電晶體來說,往浮柵極裡面注入不同數量的電子,將改變電晶體的閾值電壓。由於不同的狀態有不同的閾值電壓,我們可以通過在控制極加不同的參考電壓來判斷當前儲存單後設資料。以上圖為例,低位元資料代表lower Page資料,高位元資料代表Upper Page資料。 如果我們要讀Upper Page資料,要區分0還是1,只需在控制極加個參考電壓V2:如果電晶體導通,說明是1 (因為不管11還是10狀態,其閾值電壓都小於V2);否則就是0 (因為不管01還是00,閾值電壓都大於V2)。如果要讀取Lower Page資料,要區分0和1的話,就稍微複雜了:我們首先得在控制極加個參考電壓V1,如果導通,說明資料是1(因為11狀態閾值電壓小於V1);如果截止,沒有辦法說明是0和1,因為10,01,00三個狀態閾值電壓都比V1大,這個時候我們需要改變控制極的參考電壓為V2,再看電晶體的導通狀態,如果導通,說明資料是0 (10狀態閾值電壓小於V2),如果電晶體截止,還是無法判斷資料是0和1,因為01和00狀態閾值電壓都大於V2。這個時候,我們需要再次改變控制極的電壓為V3,這個時候,導通說明是1,截止說明資料是0。從中我們看出,讀lower page需要嘗試多次參考電壓,才能獲得最後的資料,而讀upper page時,只需一次,所以對MLC來說,讀lower page和讀upper page的時間是有所差異的。

在上圖中,如果我們把00和01狀態調換一下,如下圖所示:

如果我們還是讀lower Page資料。首先,我們在控制極加個參考電壓V1,如果電晶體導通,說明資料是1;如果截止,這個時候我們在控制極直接加參考電壓V3,如果導通,說明是0,因為不管10還是00,低位元都是0;如果截止,就是1。我們最多經過兩次電壓嘗試就把資料區分出來了,比前面少了一次電壓嘗試。有些快閃記憶體廠家採取前面那種編碼方式,而有些快閃記憶體廠家採取後面那種編碼方式。所以,不同商家的快閃記憶體特性存在差異。

注意到上面那個Vpass了嗎?那是導通電壓,就是說,不管你當前浮柵極裡面電荷多少,閾值電壓多少,在控制極加上Vpass,該電晶體總是導通的。

有了這麼多鋪墊,我們來看一下我們是如何讀取一個page資料的。

如上圖所示,先看左邊(a)部分,如果我們要讀取一個Block當中的某個Page,需要在其它所有Wordline控制極上加一個Vpass電壓,這樣保證了其它電晶體都是導通的;對被讀取的Page,需要在其所在Wordline的控制極上加參考電壓Vref,可能加一次參考電壓就能把資料讀出來,也可能需要幾次,具體做法如前面描述。

再看右半部分(b)。讀操作時,襯底加電壓是0,讀取的page,控制極上的電壓是Vref,而對其他Page,控制極上加的電壓是Vpass。問題來了,由於其他Page上加了一個Vpass,相對來說是一個比較大的電壓,這樣就會在浮柵極和襯底形成一個較強的電場,可能就把一些電子吸入浮柵極,有點輕微Program的意思。隨著該Block上Page資料讀的次數越來越多,無辜的page(沒有被讀到的)中的浮柵極電子進入越來越多,導致裡面資料狀態發生變化,也就意味著資料出錯。

這就是Read Disturb。同一個block上page讀,自己沒事,導致其他沒有被讀的page資料出錯。在此,我代表ssdfans全體成員,強烈譴責這種損人利己的行為!!

Read Disturb會導致浮柵極進入電子,跟Data Retention浮柵極電子流失不同。由於有額外的電子進入,會導致電晶體閾值電壓右移(Data Retention問題導致閾值電壓左移),如下圖所示:

由於電晶體閾值電壓偷偷的發生了變化(變大了),快閃記憶體內部邏輯如果還是按照之前的參考電壓加在控制極上,然後去判斷資料的話,肯定會發生誤判,也就是讀到錯誤的資料。

閾值電壓右移的速度,也就是Read Disturb影響資料的程度,一方面與你讀該Block上資料的次數有關,讀的越多,右移越多,影響越大,另一方,還跟你block的擦除次數有關,擦寫次數越多,絕緣效果越差,電子進入浮柵極就越容易,read Disturb的影響也就越大。

那麼,快閃記憶體使用者如何對付Read Disturb呢?

一般做法就是記錄每個Block讀的次數,趕在這個數值達到閾值(快閃記憶體廠家提供)之前,把block上所有的資料重新整理一遍(讀出來,擦除,然後在寫回),或者把資料搬到別的地方。回到開頭那個問題,Read Disturb為什麼會導致SSD效能下降?就是因為一個Block上的資料讀的次數太多了,韌體需要趕在UECC出現之前,把整個Block資料重新整理或者搬移,佔用底層頻寬,導致Host讀寫效能下降。

還有人研究發現,減小Vpass可以緩解Read Disturb。因為Vpass變小,電場減弱,吸入電子的能力減弱,能緩解read Disturb影響。一方面,現在快閃記憶體廠商都沒有開放調Vpass電壓的介面給使用者;另一方面,過低的Vpass會導致讀失敗。該方法只能緩解,不能從源頭上杜絕Read Disturb的影響。

我的建議是,能減少快閃記憶體讀的次數就儘量減少讀的次數,比如儘量把資料放快取(SSD或者host快取),但不管怎樣,都要實現資料重新整理或者資料轉移機制,因為,你的快閃記憶體遲早會碰到Read Disturb問題。