使用由内部固件进行的自验证的NAND存储器的双重编程调试方法与流程

文档序号:30287983发布日期:2022-06-04 13:32阅读:122来源:国知局
使用由内部固件进行的自验证的nand存储器的双重编程调试方法
技术领域
:1.本发明涉及半导体
技术领域
:,并且尤其涉及一种用于nand存储器中双重编程错误的调试的方法。
背景技术
::2.随着存储器件缩小到更小的管芯尺寸以降低制造成本和增加存储密度,平面存储单元的缩放由于工艺技术限制和可靠性问题而面临挑战。三维(three-dimensional,3d)存储器架构可以解决平面存储单元中的密度和性能限制。3.在3dnand闪存中,可以垂直堆叠多层存储单元,从而可以大大提高每单位面积的存储密度。垂直堆叠的存储单元可以形成存储器串,其中存储单元的通道连接在每个存储器串中。每个存储单元可以通过一条字线和一条位线来寻址。可以同时读取或编程共享同一字线的整个存储器页中的存储单元的数据(即,逻辑状态)。然而,由于强烈的缩放,可靠性可能是3dnand闪速存储器的一个问题。技术实现要素:4.在本公开中描述了用于存储器件中的数据保护的方法和系统的实施例。5.在一些实施例中,一种编程方法可以提供一种使用nand自验证的用于增强闪存器件的调试的方法。该编程方法可以包括根据第一和第二编程数据对nand闪存器件的选定页进行编程。选定页可以包括与字线对应的多个存储单元。选定页的编程可以包括使用多个编程电压的多个编程操作。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据第一或第二编程数据确定选定页的编程存储单元是否具有阈值电压电平。编程方法还可以包括对选定页执行自验证以确定存储在选定页处的数据是否被过写(overwrite)了。该编程方法还可以包括在确定了存储在选定页处的数据被过写了时生成失败指示。6.在一些实施例中,选定页的编程可以与nand闪存器件的存储器控制器实现的程序相关联。7.该编程方法还可以包括响应于失败指示的生成来停止存储器控制器实现的程序。编程方法还可以包括基于存储器控制器实现的程序的停止的时序(timing)来调试存储器控制器实现的程序。8.在一些实施例中,自验证可以包括由nand闪存器件对选定页执行内部读取操作以确定存储在选定页处的数据。9.在一些实施例中,编程方法还可以包括比较从对选定页的内部读取操作确定的数据和第一或第二编程数据。生成失败指示可以包括:基于比较,如果失败位计数(failed-bitcount)高于阈值,则确定失败结果。10.在一些实施例中,编程方法还可以包括由nand存储器接收输入以调整自验证的执行。11.在一些实施例中,编程方法还可以包括将自验证的执行限制到nand闪存器件的由输入指定的一个或多个区域。一个或多个指定区域可以包括以下中的至少一个:用于单层单元闪存(single-levelcell,slc)的区域、用于多层单元闪存(multi-levelcell,mlc)的区域、用于三层单元闪存(triple-levelcell,tlc)的区域、用于四层单元闪存(quad-levelcell,qlc)、页、块和片存储区(plane)。12.在一些实施例中,编程方法可以包括延迟对未来编程数据的缓存,直到执行自验证之后。13.在一些实施例中,编程方法可以包括检测缓存的使用,其中延迟可以基于对缓存的使用的检测。14.在一些实施例中,nand闪存器件可以增强使用nand自验证的调试方法。nand闪存器件可以包括包含多个页的存储器阵列。多个页中的每个页可以包括与字线对应的多个存储单元。nand闪存器件还可以包括经由字线耦合到多个页的外围电路。外围电路可以根据第一和第二编程数据对nand闪存器件的选定页进行编程。选定页的编程可以包括使用多个编程电压的多个编程操作。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据第一或第二编程数据确定选定页的已编程存储单元是否具有阈值电压电平。外围电路还可以对选定页执行自验证以确定存储在选定页处的数据是否被过写了。nand闪存器件可以在确定了存储在选定页处的数据被过写了时生成失败指示。15.在nand闪存器件的一些实施例中,选定页的编程可以与nand闪存器件的存储器控制器实现的程序相关联。外围电路可以响应于失败指示的生成来停止存储器控制器实现的程序。nand闪存器件可以与主机实现的程序通信以基于存储器控制器实现的程序的停止的时序来调试存储器控制器实现的程序。16.在nand闪存器件的一些实施例中,自验证可以包括由nand闪存器件对选定页执行内部读取操作以确定存储在选定页处的数据。17.在nand闪存器件的一些实施例中,nand闪存器件可以比较从内部读取操作确定的数据和第一或第二编程数据。失败指示的生成可以包括:基于比较,如果失败位计数高于阈值,则确定失败结果。18.在nand闪存器件的一些实施例中,nand闪存器件可以接收输入以调整自验证的执行。19.在nand闪存器件的一些实施例中,nand闪存器件还可以将自验证的执行限制到nand存储器的由输入指定的一个或多个区域。一个或多个指定区域可以以下中的至少一个:用于单层单元闪存(single-levelcell,slc)的区域、用于多层单元闪存(multi-levelcell,mlc)的区域、用于三层单元闪存(triple-levelcell,tlc)的区域、用于四层单元闪存(quad-levelcell,qlc)、页、块和片存储区。20.在nand闪存器件的一些实施例中,nand闪存器件可以延迟对未来编程数据的缓存,直到执行自验证之后。21.在nand闪存器件的一些实施例中,nand闪存器件可以检测缓存的使用,其中延迟可以基于对缓存的使用的检测。22.在一些实施例中,系统可以提供一种使用nand自验证来增强调试的方法。该系统可以包括一个或多个计算设备和nand闪存器件。nand闪存器件可以包括包含多个页的存储器阵列。多个页中的每个页可以包括与字线对应的多个存储单元。nand闪存器件还可以包括经由字线耦合到多个页的外围电路。外围电路可以根据第一和第二编程数据对nand闪存器件的选定页进行编程。选定页的编程可以包括使用多个编程电压的多个编程操作。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据第一或第二编程数据确定选定页的已编程存储单元是否具有阈值电压电平。外围电路还可以对选定页执行自验证以确定存储在选定页处的数据是否被过写。nand闪存器件可以在确定了存储在选定页处的数据被过写了时生成失败指示。23.在系统的一些实施例中,选定页的编程可以与nand闪存器件的存储器控制器实现的程序相关联。外围电路可以响应于失败指示的生成来停止存储器控制器实现的程序。一个或多个计算设备可以基于存储器控制器实现的程序的停止的时序来调试存储器控制器实现的程序。24.在系统的一些实施例中,自验证可以包括由nand闪存器件对选定页执行内部读取操作以确定存储在选定页处的数据。25.在系统的一些实施例中,nand闪存器件可以比较从对选定页的内部读取操作确定的数据和第一或第二编程数据。失败指示的生成可以包括:基于比较,如果失败位计数高于阈值,则确定失败结果。26.在系统的一些实施例中,nand闪存器件可以接收输入以调整读取操作的执行。27.在系统的一些实施例中,nand闪存器件还可以将自验证的执行限制到nand闪存器件的由输入指定的一个或多个区域。一个或多个指定区域包括以下中的至少一个:用于单层单元闪存(single-levelcell,slc)的区域、用于多层单元闪存(multi-levelcell,mlc)的区域、用于三层单元闪存(triple-levelcell,tlc)的区域、用于四层单元闪存(quad-levelcell,qlc)、页、块和片存储区。28.在系统的一些实施例中,nand闪存器件还可以延迟对未来编程数据的缓存,直到执行自验证之后。29.在系统的一些实施例中,nand闪存器件还可以检测缓存的使用。延迟可以基于对缓存的使用的检测。30.本领域技术人员可以根据本公开的描述、权利要求和附图来理解本公开的其他方面。附图说明31.并入本文并形成说明书一部分的附图说明了本公开的实施例,并且与描述一起进一步用于解释本公开的原理并使相关领域技术人员能够制造和使用本公开。32.图1和图2a-2b图示了根据一些实施例的具有一个或多个存储器芯片的存储系统。33.图3图示了根据一些实施例的存储器管芯的示意图。34.图4图示了根据一些实施例的三维(three-dimensional,3d)存储器管芯的示意图。35.图5图示了根据一些实施例的3d存储器结构的一部分的透视图。36.图6图示了根据一些实施例的nand闪存的阈值电压vth分布。37.图7图示了根据一些实施例的对存储单元进行编程的方法。38.图8a图示了根据一些实施例的在nand存储器中存储数据和数据自验证的方法。39.图8b图示了根据一些实施例的使用图8a中描述的方法的时间线。40.图9图示了用于比较使用nand固件执行的调整的时间线。41.图10图示了根据一些实施例的其中发生双重编程事件的nand存储器的一部分的快照。42.图11图示了根据一些实施例的包括双重编程事件的过程流程。43.图12图示了根据一些实施例的调试双重编程事件的时间线。44.图13图示了根据一些实施例的用于执行slc备份的方法。45.图14图示了根据一些实施例的用于识别nand存储器中的不可靠区域的方法。46.图15和图16图示了根据一些实施例的用于在slc备份过程中实现nand自验证的方法。47.本发明的特征和优点将在以下结合附图的详细描述中变得更加明显,其中相同的附图标记自始至终标识对应的元素。在附图中,相似的附图标记通常表示相同的、功能相似的和/或结构相似的元素。元素首次出现的附图由相应参考编号中最左边的数字表示。48.将参照附图描述本公开的实施例。具体实施方式49.尽管讨论了具体的配置和布置,但应当理解,这样做只是为了说明的目的。相关领域的技术人员将认识到,在不背离本公开的精神和范围的情况下,可以使用其他配置和布置。对于相关领域的技术人员显而易见的是,本公开还可以用于各种其他应用中。50.应当注意,说明书中对“一个实施例”、“实施例”、“示例实施例”、“一些实施例”等的引用表明所描述的实施例可以包括特定特征、结构或特性,但每个实施例不一定包括特定特征、结构或特性。此外,这些短语不一定指相同的实施例。此外,当结合实施例描述特定特征、结构或特性时,无论是否明确地描述与其他实施例结合的这种特征、结构或特性,都在相关领域技术人员的知识范围内。51.通常,术语可以至少部分地从上下文中的使用来理解。例如,本文使用的术语“一个或多个”至少部分地取决于上下文,可用于以单数意义描述任何特征、结构或特性,或可用于以复数意义描述特征、结构、或特性。类似地,诸如“一”、“一个”或“该”之类的术语也可以被理解为传达单数用法或传达复数用法,这至少部分地取决于上下文。此外,术语“基于”可以理解为不一定旨在传达一组排他的因素,而是可以允许存在不一定明确描述的附加因素,这再次至少部分地取决于上下文。52.应当容易理解,本公开中“在……上”、“在……上方”和“在……上面”的含义应以最广泛的方式解释,使得“在……上”不仅意味着“直接在某物上”,而且包括其间有中间特征或中间层的“在某物上”的含义。此外,“在……上方”或“在……上面”不仅意味着在某物“上方”或“上面”,还可以包括在某物“上方”或“在面”而其间没有中间特征或层(即,直接在某物上)的含义。53.此外,为了便于描述,本文中可以使用空间相对术语,例如“在……下面”、“在……下方”、“在……下”、“在……上方”、“在……上”等来描述如图所示的一个元素或特征与另一个元素或特征的关系。除了图中描绘的取向之外,空间相对术语旨在涵盖使用或工艺步骤中的设备的不同取向。该装置可以以其他方式定向(旋转90度或以其他取向),并且这里使用的空间相对描述词同样可以相应地解释。54.如本文所用,术语“衬底”是指其上添加后续材料层的材料。衬底包括“顶”面和“底”面。衬底的顶面通常是形成半导体器件的地方,因此除非另有说明,否则半导体器件形成在衬底的顶侧。底面与顶面相对,因此衬底的底侧与衬底的顶侧相对。衬底本身可以被图案化(pattern)。添加在衬底顶部的材料可以被图案化或可以保持未图案化。此外,衬底可以包括多种半导体材料,例如硅、锗、砷化镓、磷化铟等。可替代地,衬底可以由非导电材料制成,例如玻璃、塑料、或蓝宝石晶圆。55.如本文所用,术语“层”是指包括具有厚度的区域的材料部分。层具有顶侧和底侧,其中该层的底侧相对靠近衬底而顶侧相对远离衬底。层可以在整个下层或上层结构上延伸,或者可以具有小于下层或上层结构范围的范围。此外,层可以是同质或不同质的连续结构的区域,其厚度小于连续结构的厚度。例如,层可以位于介于连续结构的顶面和底面之间或位于连续结构的顶面和底面处的任何一组水平面之间。层可以水平、垂直和/或沿着锥形表面延伸。衬底可以是一层,其中可以包括一个或多个层,和/或可以在其上、在其上方和/或在其下方具有一个或多个层。一层可以包括多个层。例如,互连层可以包括一个或多个导电和接触层(其中形成触头、互连线和/或垂直互连通路(verticalinterconnectaccess,via))和一个或多个介电层。56.在本公开中,为了便于描述,“层(tier)”用于指代沿竖直方向具有基本相同高度的元素。例如,字线和下面的栅极介电层可以称为“一层(atier)”,字线和下面的绝缘层可以一起称为“一层(atier)”,基本上相同高度的字线可以是称为“一层(tier)字线”或类似名称,等等。57.如本文所用,术语“标称/标称地”是指在产品或工艺的设计阶段期间设置的部件或工艺步骤的特性或参数的期望值或目标值,以及高于和/或低于期望值的一系列值。该系列值可能是由于制造过程或公差的微小变化。如本文所用,术语“约”表示可以基于与主题半导体器件相关联的特定技术节点而变化的给定量的值。基于特定的技术节点,术语“约”可以表示在例如该值的10-30%范围内变化的给定量的值(例如,值的±10%、±20%或±30%)。58.在本公开中,术语“水平/水平地/横向/横向地”是指标称地平行于衬底的侧表面,并且术语“垂直”或“垂直地”是指标称地垂直于衬底的侧表面。59.如本文所用,术语“3d存储器”是指在横向定向衬底上具有垂直定向的存储单元晶体管串(本文称为“存储器串”,例如nand串)使得存储器串在相对于衬底的垂直方向上延伸的三维(three-dimensional,3d)半导体器件。60.图1图示了根据一些实施例的具有存储系统10的系统s1的框图。在一些实施例中,系统s1可以是手机、台式电脑、笔记本电脑、平板电脑、车载电脑、游戏机、打印机、定位设备、可穿戴电子设备、智能传感器、虚拟现实(virtualreality,vr)设备、增强现实(augmentedreality,ar)设备或其中具有存储装置的任何其他合适的电子设备。存储系统10(例如,nand存储系统)可以包括存储器控制器20和一个或多个半导体存储器芯片25-1、25-2、25-3、…、25-n。每个半导体存储器芯片25(以下简称为“存储器芯片”)可以是nand芯片(例如,“闪存”、“nand闪存”或“nand”)。存储系统10可以通过存储器控制器20与主机15通信,其中存储器控制器20可以经由一个或多个存储器通道30-1、30-2、30-3、…、30-n连接到一个或多个存储器芯片25-1、25-2、25-3、...、25-n。在一些实施例中,每个存储器芯片25可以由存储器控制器20经由一个或多个存储器通道30-1、30-2、30-3、…、30-n来管理。61.在一些实施例中,主机15可以包括电子设备的处理器,例如中央处理单元(centralprocessingunit,cpu),或片上系统(system-on-chip,soc),例如应用处理器(applicationprocessor,ap)。主机15可以发送要存储在存储系统10处的数据和/或可以从存储在存储系统10中的数据中检索数据。62.在一些实施例中,存储器控制器20可以处理从主机15接收的i/o请求,确保数据完整性和高效存储,并管理存储器芯片25。为了执行这些任务,存储器控制器20可以运行固件21,其可以是由存储器控制器20的一个或多个处理器22(例如,微控制器单元、cpu)执行。例如,存储器控制器20可以运行固件21以将逻辑地址(例如,与主机数据相关联的由主机使用的地址)映射到存储器芯片25中的物理地址(例如,存储数据的实际位置)。控制器20还运行固件21来管理存储器芯片25中的有缺陷的存储器块,其中固件21可以将逻辑地址重新映射到不同的物理地址,即将数据移动到不同的物理地址。控制器20还可以包括一个或多个存储器23(例如dram、sram、eprom等),其可以用于存储由固件21使用的各种元数据。在一些实施例中,存储器控制器20还可以通过纠错码(errorcorrectioncode,ecc)引擎29执行错误恢复。ecc用于检测和纠正每个存储器芯片25内发生的原始位错误。63.在一些实施例中,存储器通道30可以经由数据总线在存储器控制器20和每个存储器芯片25之间提供数据和控制通信。存储器控制器20可以根据芯片使能信号选择存储器芯片25之一。64.在一些实施例中,图1中的每个存储器芯片25都可以包括一个或多个存储器管芯100,其中每个存储器管芯可以是3dnand存储器。65.在一些实施例中,存储器控制器20和一个或多个存储器芯片25可以集成到各种类型的存储设备中,例如,被包括在同一封装中,例如通用闪存(universalflashstorage,ufs)封装或emmc封装。也就是说,存储系统10可以被实现并封装到不同类型的终端电子产品中。在一个示例中,如图2a所示,存储器控制器20和单个存储芯片25可以集成到存储卡26中。存储卡26可以包括pc卡(pcmcia,个人计算机存储卡国际协会)、cf卡、智能媒体(smartmedia,sm)卡、记忆棒(memorystick)、多媒体卡(mmc、rs-mmc、mmcmicro)、sd卡(sd、minisd、microsd、sdhc)、ufs等。存储卡26还可以包括存储卡连接器24,其将存储卡26与主机(例如,图1中的主机15)耦合。在如图2b所示的另一个示例中,存储器控制器20和多个存储器芯片25可以集成到固态驱动器(solidstatedrive,ssd)27中。ssd27还可以包括将ssd27与主机(例如,图1中的主机15)耦合的ssd连接器28。66.图3示出了根据一些实施例的存储器管芯100的俯视图。图3中所示的示例配置作为非限制性示例给出并且应当理解存储器是可扩展的。在一些实施例中,存储器管芯100可以包括一个或多个存储器片存储区101,每个存储器片存储区101可以包括多个存储器块(memoryblock)103。相同和并发的操作可以发生在每个存储器片存储区101处。存储器块103(其可以是多个兆字节(megabytes,mb)大小的)是执行擦除操作的最小大小。存储器管芯100可以包括例如四个存储器片存储区101。每个存储器片存储区101可以包括例如六个存储器块103。每个存储器块103可以包括多个存储单元,其中每个存储单元可以通过诸如位线和字线之类的互连来寻址。位线和字线可以垂直布置(例如,分别在行和列中),以形成金属线阵列。位线和字线的方向在图3中标记为“bl”和“wl”。在本公开中,存储器块103也被称为“存储器阵列”或“阵列”。存储器阵列是存储器件中的核心区域,执行存储功能。67.在一些实施例中,存储器管芯100还可以包括外围区域105、围绕存储器片存储区101的区域。外围区域105可以包括许多数字、模拟和/或混合信号电路以支持存储器阵列的功能,例如,页缓冲器、行和列解码器和读出放大器(senseamplifier)。外围电路使用有源和/或无源半导体器件,例如晶体管、二极管、电容器、电阻器等,这对于本领域普通技术人员来说是显而易见的。68.在一些实施例中,图3中所示的存储器管芯100中的存储器片存储区101的布置和每个存储器片存储区101中的存储器块103的布置可以仅作为示例,其并不限制本发明的范围。69.图4图示了根据一些实施例的存储器管芯100的示意图。在一些实施例中,存储器管芯100可以包括一个或多个存储器块103(例如,103-1、103-2、103-3)。每个存储器块103可以包括多个存储器串212。每个存储器串212包括多个存储单元340。共享相同字线的存储单元340形成存储器页432。存储器串212还可以包括在每端的至少一个场效应晶体管(例如,mosfet)处,其分别由下部选择栅(lowerselectgate,lsg)332和顶部选择栅(topselectgate,tsg)334控制。顶部选择晶体管334-t的漏极端子可以连接到位线341,并且下部选择晶体管332-t的源极端子可以连接到阵列公共源极(arraycommonsource,acs)430。acs430可以由整个存储器块中的存储器串212共享,并且也称为公共源极线。70.在一些实施例中,存储器管芯100还可以包括外围电路,该外围电路可以包括许多数字、模拟和/或混合信号电路以支持存储器块103的功能,例如,页缓冲器/读出放大器50、行解码器/字线驱动器40、列解码器/位线驱动器52、控制电路70、电压发生器65和输入/输出缓冲器55。这些电路可以包括有源和/或无源半导体器件,例如晶体管、二极管、电容器、电阻器等,如对于本领域普通技术人员来说是显而易见的。71.在一些实施例中,存储器块103可以经由字线(wordline,“wl”)333、下部选择栅(“lsg”)332和顶部选择栅(topselectgate,“tsg”)334与行解码器/字线驱动器40耦合。存储器块103可以经由位线(bitline,“bl”)341与页缓冲器/读出放大器50耦合。行解码器/字线驱动器40可以响应于由控制电路70提供的x路径(x-path)控制信号而选择存储器管芯100上的存储器块103之一。行解码器/字线驱动器40可以根据x路径控制信号将从电压发生器65提供的电压传送到字线。在读取和编程操作期间,行解码器/字线驱动器40可以根据从控制电路70接收到的x路径控制信号将读取电压vread和编程电压vpgm传输到选定字线,并将通过电压vpass传输到未选定字线。72.在一些实施例中,列解码器/位线驱动器52可以根据从控制电路70接收到的y路径控制信号将禁止电压vinhibit传输到未选定位线并且将选定位线连接到地。换言之,列解码器/位线驱动器52可以被配置为根据来自控制电路70的y路径控制信号选择或取消选择一个或多个存储器串212。页缓冲器/读出放大器50可以被配置为根据来自控制电路70的控制信号y路径控制从存储器块103读取数据以及将数据编程(写入)存储器块103。例如,页缓冲器/读出放大器50可以将要编程的一页数据存储到一个存储器页432中。在另一个示例中,页缓冲器/读出放大器50可以执行验证操作以确保数据已经被正确地编程到每个存储单元340中。在又一个示例中,在读取操作期间,页缓冲器/读出放大器50可以感测流过位线341的反映存储单元340的逻辑状态(即数据)的电流并将小信号放大到可测量的放大率。73.在一些实施例中,输入/输出缓冲器55可以将i/o数据从/向页缓冲器/读出放大器50以及地址addr或命令cmd传输到控制电路70。在一些实施例中,输入/输出缓冲器55可以用作存储器控制器20(在图1中)和存储器芯片25上的存储器管芯100之间的接口。74.在一些实施例中,控制电路70可以响应于输入/输出缓冲器55传输的命令cmd来控制页缓冲器/读出放大器50和行解码器/字线驱动器40。在编程操作期间,控制电路70可以控制行解码器/字线驱动器40和页缓冲器/读出放大器50以对选定的存储单元进行编程。在读取操作期间,控制电路70可以控制行解码器/字线驱动器40和页缓冲器/读出放大器50来读取选定的存储单元。x路径控制信号和y路径控制信号包括行地址x-addr和列地址y-addr,行地址x-addr和列地址y-addr可以用于定位存储器块103中的选定存储单元。行地址x-addr可以包括页索引pd、块索引bd和片存储区索引pl以分别识别存储器页432、存储器块103和存储器片存储区101(在图3中)。列地址y-addr可以识别存储器页432的数据中的一个字节或一个字。75.在一些实施例中,电压发生器65可以在控制电路70的控制下产生要提供给字线和位线的电压。由电压发生器65产生的电压包括读取电压vread、编程电压vpgm、通过电压vpass、抑制电压vinhibit等。76.需要注意的是,图1、图2a-2b和图3-4中的存储系统10和存储器管芯100中的电子组件的布置被示出为非限制性示例。在一些实施例中,存储系统10和存储器管芯100可以具有其他布局并且可以包括附加组件。图4中所示的存储器管芯100上的组件(例如,控制电路70、i/o缓冲器55)也可以作为存储系统10中的独立电子组件移出存储器管芯100。图4中所示的存储器管芯100上的组件(例如,控制电路70、i/o缓冲器55)也可以移动到存储系统10中的其他组件,例如,控制电路70的一部分可以与存储器控制器20结合,反之亦然。77.图5图示了根据一些实施例的3d存储器结构500的透视图。在一些实施例中,存储器管芯100可以是3dnand存储器,并且3d存储器结构500可以是存储器管芯100的一部分,例如在图3中的区域108中。3d存储器结构500可以包括阶梯区210和沟道结构区211。沟道结构区211可以包括多个存储器串212,每个存储器串包括多个堆叠的存储单元340。阶梯区210可以包括阶梯结构。78.在一些实施例中,3d存储器结构500可以包括衬底330、衬底330上方的绝缘膜331、绝缘膜331上方的一层(tier)下部选择栅(lowerselectgate,lsg)332、以及多层(tier)控制栅极333,也称为“字线(wordline,wl)”,堆叠在lsg332的顶部以形成交替的导电和介电层(layer)的膜堆叠体335。为清楚起见,与控制栅层(tier)相邻的介电层未在图5中示出。79.在一些实施例中,每层(tier)的控制栅极由穿过膜堆叠体335的狭缝结构(slitstructure)216-1和216-2分开。3d存储器结构500还可以包括在控制栅333的堆叠体上方的一层(tier)顶部选择栅(topselectgate,tsg)334。tsg334、控制栅333和lsg332的堆叠体也可以称为“栅电极”。3d存储器结构500可以进一步包括在相邻lsg332之间的衬底330levelcell,mlc)模式、三层单元闪存(triple-levelcell,tlc)模式、四层单元闪存(quad-levelcell,qlc)模式或任何这些模式的组合下运行。在slc模式下,存储单元存储1位并具有两个逻辑状态(“状态”),逻辑{1和0},即状态er和p1。在mlc模式下,一个存储单元存储2位,并且具有四个逻辑状态,逻辑{11、10、01和00},即状态er、p1、p2和p3。在tlc模式下,一个存储单元存储3位,并且有8个逻辑状态,逻辑{111、110、101、100、011、010、001、000},即状态er和状态p1-p7。在qlc模式下,一个存储单元存储4位,并且具有16个逻辑状态。存储系统10(见图1)的存储器控制器20可以将从主机15接收的数据转换成存储器管芯100上的存储单元的对应逻辑状态,反之亦然。87.图6图示了根据一些实施例的以三层单元闪存(tlc)模式编程的nand闪存的阈值电压vth分布。在一些实施例中,存储单元的每个状态可以对应于阈值电压vth的特定范围,其中每个状态的阈值电压vth分布可以由概率密度来表示。在一些实施例中,八个tlc状态可以通过使用增量步进脉冲编程(incrementalsteppulseprogramming,ispp)方案来编程,其中编程电压vpgm可以通过添加步进脉冲vstep来递增地增加。因此,八个tlc状态可以从具有较低阈值电压的状态p1编程到具有最高阈值电压的状态p7。88.在一些实施例中,在编程之后,可以在验证过程期间通过使用一个或多个读取参考电压vr1-vr7来验证八个tlc状态er和p1-p7。通过将读取参考电压vr1-vr7中的一个或多个读取参考电压施加到目标存储单元的控制栅极,可以确定存储单元的阈值电压vth的范围。例如,为了验证存储单元是否处于状态er,可以使用读取参考电压vr1。如果目标存储单元处于状态er,则目标存储单元的阈值电压vth低于读取参考电压vr1。目标存储单元可以被接通并在沟道中形成导电路径。如果目标存储单元处于状态p1-p7中的任一状态,则目标存储单元的阈值电压vth高于读取参考电压vr1。目标存储单元由此被关断(switchoff)。经由页缓冲器/读出放大器50在对应位线处测量或感测通过目标存储单元的电流,可以验证阈值电压vth或目标存储单元的状态。89.在一些实施例中,如上所述,为了确定存储在slc模式下的两个状态er和p1,仅依靠读取参考电压vr1就足够了。为了确定mlc模式下的四种状态er和p1-p3,可以使用读取参考电压vr1、vr2和vr3。为了确定用于tlc模式的八个状态er和p1-p7,可以使用读取参考电压vr1-vr7。例如,在tlc模式下,状态er的阈值电压低于vr1,并且状态p7的阈值电压高于vr7,其中状态p1的阈值电压介于vr1和vr2之间。可以类似地确定状态p2-p6。90.图7图示了根据一些实施例的用于将存储单元编程到目标逻辑状态(例如,状态p1)的过程流程700。应当理解,过程流程700不是穷举的,并且也可以在任何所示的操作步骤之前、之后或之间执行其他操作步骤。在一些实施例中,过程流程700的一些操作步骤可以省略或可以包括其他操作步骤,其为简单起见而在此不被描述。在一些实施例中,过程流程700的操作步骤可以以不同的顺序执行和/或变化。91.在一些实施例中,在操作步骤s705,可以重置程序循环计数(programloopcount,plc),例如plc=0。当存储器控制器20(图1)向存储器管芯100发送用于对存储器管芯100上的存储单元进行编程的命令时,可以开始操作步骤s705。92.在操作步骤s710,通过将编程电压vpgm施加到存储单元的字线来对存储单元进行编程。并且plc可以在操作步骤s715加1,即plc=plc+1。编程电压vpgm可以根据存储单元的目标逻辑状态来选择,其中目标逻辑状态取决于由存储控制器20发送的编程数据。93.在操作步骤s720,可以通过在存储单元的字线上施加第一读取参考电压并测量流过对应位线处的存储单元的电流,来将存储单元的阈值电压vth与第一读取参考电压(也称为编程验证电平)进行比较。例如,如果存储单元将被编程为目标逻辑状态p1,则可以使用第一读取参考电压vr1(参见图6),因为对于状态p1,通过条件是存储单元的阈值电压位于读取参考电压vr1和vr2之间。94.在操作步骤s725,确定存储单元的阈值电压vth是高于还是低于第一读取参考电压vrl。如前所述,如果存储单元的阈值电压vth低于第一读取参考电压vr1,则存储单元可以接通,在沟道中形成导电路径。由页缓冲器/读出放大器50(在图4中)在对应位线处测量的电流相对较高。如果存储单元的阈值电压vth高于第一读取参考电压vr1,则存储单元被关断并且由页缓冲器/读出放大器50在对应位线处测量的电流相对较低。95.如果确定存储单元的阈值电压vth低于第一读取参考电压vrl,则过程流程700进行到操作步骤s730,其中检查plc是否小于最大值plcmax。96.在一些实施例中,最大值plcmax可以是预定值,例如plcmax=25。在一些实施例中,最大值plcmax可以根据在预筛选编程测试期间跨不同存储器管芯选择的一组存储单元的plc来确定。97.如果plc小于plcmax,则在操作步骤s735,编程电压vpgm可以增加量δv,使得编程电压vpgm=vpgm+δv。并且在操作步骤s710,可以利用经增加的编程电压vpgm再次对存储单元进行重新编程。98.可以重复操作步骤s710-s735直到针对存储单元达到期望的目标阈值电压vth。然而,如果在操作步骤s730,已经达到plcmax但存储单元仍未被编程到目标逻辑状态,则在步骤s740可以识别存储单元具有编程失败。99.如果在操作步骤s725,存储单元的阈值电压vth被确定为高于第一读取参考电压vrl,则可以在操作步骤s745将其与第二读取参考电压进行比较。如果存储单元将被编程到目标逻辑状态p1,则可以使用第二读取参考电压vr2(参见图6)。如果在操作步骤s750确定存储单元的阈值电压vth低于第二读取参考电压vr2,则在操作步骤s755可以将存储单元识别为编程通过(即,被编程到目标逻辑状态)。在只有状态er和p1的slc模式下,可以省略第二参考电压。100.然而,如果在操作步骤s750确定存储单元的阈值电压vth高于第二读取参考电压vr2,则可以在步骤s740识别存储单元具有编程失败,因为在编程期间存储单元的阈值电压可以通过在其控制栅极(即对应的字线)上施加编程电压vpgm来增加,但不能减小。在3dnand存储器中,在存储单元被擦除并重置为状态er之后,可以将存储单元重新编程为具有较低阈值电压的逻辑状态。擦除操作将存储器块中的所有存储单元重置为状态er,因为同一存储器块中的存储单元共享相同的阵列公共源极430。101.返回参考图4,在一些实施例中,虽然存储器块(例如,存储器块103)是3dnand存储器中的最小可擦除单元,但存储器页(例如,存储器页432)是用于读取和编程操作的最小可寻址单元。在读取和编程操作期间,可以根据由控制电路70接收到的地址addr中包含的页索引pd和块索引bd,来读取或编程选定存储器块的存储器页中的数据(即逻辑状态)。可以通过在对应位线341上施加禁止电压vinhibit来禁止已达到目标逻辑状态(即,目标阈值电压)的存储单元进一步编程。102.以上,已经描述了关于3dnand存储器的结构及其功能的实施例。在一些实施例中,希望提供可靠的存储单元用于编程以及随后的擦除和重新编程。参考图7的该方法示出了如何在编程操作之后验证存储单元的示例。在过程流程700结束时,存储单元可能通过验证过程、或验证过程失败。本领域的技术人员将理解,一旦存储单元上的编程和验证操作已经结束(通过或失败),则编程和验证操作可以继续到下一个存储单元(即,过程流程700可以在下一个存储单元重新开始)。在一些实施例中,继续到下一个存储单元可以包括“掩蔽(mask)”完成的存储单元,使得算法迭代过程流程700不会错误地在同一存储单元上重复。掩蔽存储单元(或掩蔽存储位)可以描述为临时或永久标记(mark)或标志(flag)为存储单元,以便可以基于标志调整未来的操作(例如,跳过)。在一个示例中,当发现不可纠正的失败时,可以永久掩蔽位。nand控制器可以禁止对有缺陷的存储单元的任何进一步的使用。上面参考图4以及在对应位线341上使用禁止电压vinhibit描述了掩蔽的一个示例。103.在一些实施例中,过程流程700对于要接收编程的存储单元(即,将存储单元的状态从er改变到诸如p1之类的更高状态的操作)可能是足够的。根据过程流程700,在s720开始的验证过程可以跟随在s710的编程步骤(例如,用编程电压对存储单元进行编程,然后验证正确性)。但是,要保持在er状态下的存储单元是怎样呢?在示例场景中,寻求将8位串写入存储器页432(图4)之一。8位串可以包括例如与电子状态{p1ererp1erp1erer}相对应的位。可以理解,接收到p1状态的存储单元将经历步骤s710,并且随后通过步骤s720和之后的步骤得到验证。然而,保持在er状态的单元将不经历步骤s710和s720。通常的做法是在将新数据写入在存储器的块上之前擦除该块(例如,通常,块中的所有存储单元在编程开始之前都以er状态开始)。因此,为了将编程数据的er状态写入存储单元中,nand对存储单元不做任何事情(即,存储单元被跳过,这依赖于存储单元已经处于er状态下的假设)。104.重申一下,在一些实施例中,对页进行编程并不等同于对页中的每个存储单元进行编程。一些单元可以跳过接收编程操作。因此,对页进行编程可以包括仅对页中的一个或多个存储单元进行编程。验证在存储单元被编程时执行(例如,er→p1可以触发验证操作),而不是在存储单元要保持在er时执行(例如,er→er存储单元未被编程,因此可以跳过验证)。其中,可能由于跳过验证而出现问题。如果跳过的存储单元中的现有状态不是预期的er(例如,存储单元具有持续的p1状态),这可能是一个问题。在这种情况下,写入操作将假定存储单元处于er状态(此时存储单元并非如此)。反过来,存储器控制器会假定“写入”操作er→er成功执行了(由于缺乏验证),但实际发生的是p1状态持续存在(p1→p1)。当将来从这个存储单元中读取数据时,会发现数据已经损坏。因此,需要一种方法和系统来在不可纠正的纠错码(uncorrectableerrorcorrectioncode,uecc)出现之前提供数据保护,从而可以最小化数据丢失的机会。105.为了减轻如上所述的错误,可以引入操作以使诸如过程流程700之类的过程更加鲁棒。106.图8图示了根据一些实施例的用于在nand存储器中存储数据和对数据自验证的过程流程800。在一些实施例中,方法步骤中描述的功能可以由nand存储器件本身上的电路(例如,一个或多个处理器22(图1)、存储器芯片25中的控制电路(图10等)来执行。在步骤s810,可以将数据存储在nand存储器的一页中。待存储的数据可以包括一系列位(例如,二进制数据),其也可以称为编程数据(例如,要在页中编程的数据)。nand存储器的页可以包括存储单元(例如,页432(图4))。存储可以包括根据编程数据对nand存储器的选定页进行编程。选定页包括与字线对应的多个存储单元。选定页的编程可以包括使用多个编程电压的多个编程操作(步骤s810)。选定页的编程还可以包括多个验证操作(步骤s820)。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据编程数据确定多个存储单元的已编程存储单元是否具有阈值电压电平。在步骤s820,可以执行对存储单元的编程的验证以确定编程是否被正确执行了或者是否应该再次执行步骤s810(参见例如步骤s735(图7))。验证可以包括在存储单元中的已编程存储单元的字线上施加参考电压并测量在对应位线处流过存储单元中的已编程存储单元的电流(参见例如s720(图7))。107.在一些实施例中,在步骤s860,可以在步骤s820的验证之后掩蔽存储单元中的已编程存储单元(例如,如果结果是通过,则针对数据存储过程的剩余部分掩蔽存储单元;如果结果为失败,则在s810重新开始)。在步骤s865,可以执行检查以确定目标数量的位是否已经根据在该页中被编程(例如,检查以查看编程数据的存储是完成还是未完成)。换言之,执行确定步骤,以确定根据编程数据的最后一位是否已被编程在页中(例如,最后一位可以是根据编程数据在页中要被编程的最后一个非er状态)。若存储尚未结束,则过程可以返回步骤s810并继续至后续的存储单元以用于存储编程的剩余部分。应当理解,过程流程800可以包括基于返回通过结果的多个验证操作中的每一个验证操作来确定对选定页的编程的完成。用于确定编程完成的另一个条件可以是考虑用于存储n位编程数据的存储单元,其中n是大于1的整数。该确定可以基于将编程数据的第n位编程到页中。108.在一些实施例中,在步骤870,可以通过对页执行读取操作并将根据自验证读取操作确定的数据与用于启动过程流程800的编程数据进行比较来执行另一验证操作。图8的步骤可以被实现为nand控制器(例如,控制器20(图1))中的固件方法。109.在一些实施例中,在步骤s875,结束将数据存储在nand页中的过程流程800。该结束可以通过来自附加验证步骤s870的通过或失败确定来标记。通过/失败确定可以基于由对页的读取操作确定的被存储数据与用于启动过程流程800的编程数据之间的精确匹配。在一些实施例中,通过/失败确定可以基于失败计数阈值。例如,如果失败位计数低于给定阈值,则nand固件可以确定通过结果。应当理解,术语“低于阈值”也旨在包括“低于或等于阈值”的范围,因为这两个术语之间的差异仅仅是阈值的偏移(例如,低于10与低于或等于9是相同的)。类似的逻辑适用于术语“高于阈值”和“高于或等于阈值”。阈值可以根据要实施nand存储器的环境的需要或偏好进行调整。例如,具有多个冗余备份机制的数据存储中心可能使用与个人计算机上的用户不同的阈值。110.在一些实施例中,图8中所示的时间线示出了迄今为止描述的过程的示例。例如,可能存在步骤s810和s820的多个循环以对nand存储器的页中的多个存储单元进行编程和验证(为清楚起见,其他步骤未在时间线上示出,但应理解为存在)。在循环结束时(即当编程数据已完全传送到页时),执行步骤s870以使用nand存储器的内部读取能力来验证被存储的数据。然后在步骤s875结束nand存储器的页的编程。111.之前提到过,在一些实施例中,过程流程800可以用于在过程流程700(图7)不执行的情况下增加nand存储器鲁棒性,例如,当待写入数据时是er状态,但对应的存储单元中存在的实际状态是p1等。例如,当第一程序将数据存储在页上但随后第二程序将其数据存储在同一页上时(例如,存储器的过度编程(overprogram)),可能会出现这种情况。过度编程错误可能是由糟糕的编码引起的。无论是否执行步骤s820(或图7的步骤720),步骤870的自验证都能够读取整页,从而检测未执行的步骤s820可能遗漏的任何错误。以这种方式可以防止数据损坏。例如,如果在步骤s875发出失败结果,则存储器控制器中的固件可以选择不同的页来存储程序数据。如果步骤s870的读取操作返回失败结果(例如,掩蔽nand存储器的区域),则nand存储器还可以防止进一步使用nand存储器的一个或多个故障区域。此外,步骤s870可以是数据存储过程结束时的单个实例,这可以导致比例如在每个循环之后执行读取验证的时间负担小得多。112.在一些实施例中,步骤s870的nand固件实现允许快速执行附加验证以及在数据存储操作的早期阶段执行附加验证。由于页的读取是由硬件对nand存储器本身执行的,因此读取操作也可以称为内部读取,或自验证。与此相比,如果外部主机计算机要执行步骤s870,则所产生的附加时间负担可能高到足以阻碍执行步骤s870。113.在一些实施例中,步骤s870的附加验证可能伴随某些缺点。例如,即使内部固件实现比主机固件实现更快,验证步骤s870仍然可以将读取操作的时间增加到对于nand存储器的消费者可能不期望的程度。毕竟,步骤s870是附加的读取步骤,并且可以为数据存储过程增加例如数十微秒。因此,nand存储器固件可以实现具有允许调整由nand固件如何执行步骤s870的特征。也就是说,在一些实施例中,该方法可以包括在nand存储器处接收输入以调整验证数据在页中的存储。114.在一些实施例中,输入可以允许、禁用、在时间上偏移等执行步骤s870的读取操作以及限制nand存储器的哪些区域将接收步骤s870。nand存储器的一些区域可能比其他区域更可靠。因此,输入可以用于指定nand存储器的一个或多个区域以允许或禁止执行步骤s870的读取操作。一个或多个指定区域可以包括例如用于slc的区域、用于mlc的区域、用于tlc的区域、用于qlc的区域、页、块或片存储区中的至少一个——仅举几个非限制性的示例。作为示例,输入可以包括对第一slc部分、第一和第二tlc部分以及特定页执行自验证的指令。作为另一个示例,输入可以包括对特定qlc部分执行自验证的指令。诸如“元素1、元素2和元素3中的至少一个”等术语可以指代诸如以下的排列:元素1中的一个或多个;元素2中的一个或多个;元素1中的一个或多个和元素2中的一个或多个;元素1中的一个或多个和元素3中的一个或多个;元素2中的一个或多个和元素3中的一个或多个;或元素1中的一个或多个、元素2中的一个或多个以及元素3中的一个或多个。对于具有更少或更多元素的组,可以设想对应的排列。115.在一些实施例中,输入可以被实现为用户提供的用于执行数据存储操作的命令的前缀。可以有一位或两位用于指定slc/mlc/tlc/qlc模式。例如,可以有三位用于指定tlc页的上页、中页或下页中的任何一个。116.在一些实施例中,nand固件可以确定何时何地以自动化方式实施自验证(无需用户输入)。例如,nand存储器可以实现对哪些存储单元或存储单元组有缺陷或出于其他原因有风险的记录。根据记录,当将数据存储在已知具有相关联的风险的存储单元中时,nand固件可以实现自验证。117.在一些实施例中,输入还可以调整在数据存储过程期间如何处理某些数据(例如,延迟清除缓存的数据)。118.图9示出了根据一些实施例的用于比较使用nand固件执行的调整的时间线900和902。在一些实施例中,nand存储器产品可以具有高速缓存系统实现。缓存系统可能与nand固件自验证特征(例如,图8中的步骤s870的读取操作)相冲突。因此,设想nand固件可以根据是否在nand存储器中实现缓存来调整操作。对nand操作的调整可以通过用户输入或nand固件中的自动过程来控制。119.在一些实施例中,时间线900示出了在nand存储器的高速缓存区域中创建高速缓存数据传输a904。然后程序a使用高速缓存数据传输a,这在时间线900中表示为程序繁忙a906。程序繁忙a906可以是例如对nand存储器中的页的存储单元进行编程的操作(例如,根据过程流程800(图8))。在程序繁忙a906期间,可以准备另一个高速缓存数据传输908以供将来执行程序b,这在时间线900中表示为程序繁忙b910。高速缓存数据传输b908的准备允许一旦程序繁忙a906结束就立即执行程序b。一个问题是高速缓存数据传输b908的创建可能会过写现有的高速缓存数据传输a904。毕竟,高缓存存储被设计为小的,以便快速和临时存储。然后,可能是程序繁忙a906尝试执行自验证步骤s870(图8),却发现高速缓存已被程序b要求占用。注意,当执行在步骤s870读取的页时,被缓存的数据可以用作为比较的基础(图8)。120.因此,在一些实施例中,当nand存储器采用高速缓存时,nand固件可以调整操作以便如时间线902中所示那样操作。时间线900和902在被执行的过程方面是相似的,但是,时间线902将高速缓存数据传输b908的创建移动到程序购买a906之后的时序。注意,这是一种折衷,其中缓存的时间节省被没收,以利于允许使用nand固件自验证。通过以这种方式安排高速缓存数据传输b908的时序,程序繁忙906可以自由地包括步骤s870(图8)而没有发现被过写的高速缓存的风险。在一些实施例中,nand固件可以调整时序。例如,nand固件可以被配置为检测缓存的使用,并且然后基于检测来执行高速缓存数据传输b908的创建的延迟。121.早先提到,在一些实施例中,步骤s870(图8)的nand固件实现允许在数据存储操作的早期阶段快速执行自验证。此功能可以用于改进调试过程,例如,以修复与双重编程相关的问题。122.图10图示了根据一些实施例的用于对nand存储器的页进行编程的过程流程1000。具体来说,图10图示了其中发生双重编程事件的nand存储器的一部分的三个快照。图10的示例场景应被理解为非限制性的(例如,程序可以写入多于或少于6页的nand存储器,可以存在其他方式导致双重编程错误等)。在步骤s1002,可以由一个或多个计算设备(例如,主计算机15(图1))执行第一组指令。第一组指令可以包括用于根据第一编程数据将数据存储到nand存储器的页的指令。在图10所示的示例中,第一组指令已使存储器控制器20(图1)根据第一编程数据(表示为pg0pgm-pg6pgm)将数据存储在pg0-pg6中。在步骤s1002还示出了下一个存储事件将要开始的地址。它由下一个编程指针1008表示,它指向pg7(pg7及以后处于擦除状态(“ers”),准备好接收编程数据)。123.在一些实施例中,在步骤s1004,可以由一个或多个计算设备执行第二组指令。第二组指令可以包括用于根据第二编程数据将数据存储到nand存储器的页的指令。然而,由于数据存储操作的编码中的错误,程序指针被错误寻址(mis-address)到pg4,pg4存储了与第一编程数据相对应的数据。该事件可以称为双重编程事件。错误寻址由错误的程序指针1008'表示,并且对应的被过写页表示为pg4双重程序1010。124.在一些实施例中,存储在pg4中的数据直到稍后时间(例如,几分钟后、几天后等)才被一个或多个计算设备使用。在步骤s1006,一个或多个计算设备执行从nand存储器的pg4读回数据的操作。由于pg4中存在不可纠正的纠错码,读取失败。pg4处的数据很可能在此时已损坏,既不代表第一编程数据也不代表第二编程数据。发生这种情况是因为,如上所述,接收er状态的存储单元被跳过。例如,具有被第二编程数据{p1erp1er}不正确过写的状态{erp1erp1}的存储单元可能导致存储单元实际存储{p1p1p1p1}。er状态的跳过导致第一编程数据和第二编程数据的p1状态组合,导致被存储数据的损坏(不代表第一编程数据或第二编程数据中的任一者的无用数据)。125.在一些实施例中,为了纠正错误寻址错误,例如参考图10所描述的错误,开发者可以实施调试措施来确定错误的原因。一旦确定了错误的原因,就可以对指令代码进行适当的更正。再次强调,存储在pg4中的数据可能要到几天后才能读取。这会给调试工作带来很大的障碍,因为错误寻址的发现可能发生得晚得多。在双重编程事件和随后的读取失败之间的时间内可能会发生许多操作。由于开发者没有追溯(retrospection)的好处,开发者别无选择,而只能怀疑所有操作都可能有责任(atfault)。然后,开发者可以为每个操作设置测试以排除标称上在工作的操作。应当理解,如果要执行的测试数量为数百或数千,则这可能是一个繁琐的过程。为了减少这种负担,可以通过实施本文公开的nand自验证实施例来增强调试过程。126.图11示出了根据一些实施例的包括双重编程事件的过程流程1100、1102和1104。通过比较每个过程流程的差异,应当显而易见的是本文实施例中的nand自验证方法可以通过在错误发生后立即检测错误来显著增强调试过程。在一些实施例中,由一个或多个计算设备执行的程序已经遇到了uecc存储器。错误的来源是未知的——例如,它可能是从被执行程序的nand读取数据时代码中的缺陷、一个或多个计算设备的逻辑中的缺陷、nand存储器中的错误、nand固件代码中的缺陷等。为了确定uecc的原因,开发者可以准备测试用例(例如,模拟)。测试用例可以包括遇到了uecc的程序的执行,但受到由开发者施加的特定约束(例如,测试用例参数)。127.在一些实施例中,过程流程1100可以包括步骤s1106、s1108、s1112和s1114。在步骤1106,执行测试用例。在步骤s1108,测试用例可以与最终用户固件(例如,旨在供消费者使用的固件)交互以将数据存储在nand存储器中,例如,使用过程流程700(图7)。最终用户固件可以包括例如主机15(图1)中的固件和/或nand存储器中的固件。在过程流程1100的上下文中,应了解nand固件不实施nand自验证(例如,它被禁用或不存在)。在步骤s1112,在nand存储器的页中发生双重程序写入(例如,pg4双重程序1010(图10))。在步骤s1114(其可以是几分钟后、几天后或更多),遇到作为双重编程的结果的uecc读取。在这种情况下,程序的开发者几乎没有获得关于uecc是如何发生的附加信息,除了在步骤s1114被告知测试约束能够产生uecc读取。错误的可能嫌疑人(suspect)可以是在步骤s1106到s1114之间的时间内由程序和固件执行的任何操作。开发者不知道步骤s1112的双重编程事件,并且该执行的目标是发现它。128.在一些实施例中,开发者可以实现过程流程1102,其具有相对于过程流程1100的一些增强。过程流程1102可以包括步骤s1106、s1110、s1112和s1116。步骤1106可以如前所述。现在的不同之处在于,在步骤1110,允许测试用例与调试固件(例如,由开发者提供)交互。调试固件是一种权宜之计,以试图将计算机操作停止得更接近可能导致uecc读取的任何原因。调试固件可以包括例如指令,所述指令用于读取测试用例中过程的某些输出,并且然后当在输出之一中发现异常时停止测试用例的运行。然而,在步骤s1112,发生双重编程错误,但被写入数据的验证在较长的时间内没有执行。在步骤s1116,调试过程检测到异常并返回失败结果,以停止测试用例。在这种情况下,由开发者实现的调试过程被更好地设计为通过在过程流程1100的步骤s1114中早于uecc读取事件地检测到异常来排除可能的错误原因。但是,可以通过如在过程流程1104中实现本文公开的nand自验证实施例来进一步增强调试过程。129.在一些实施例中,使用调试固件的又一个问题是它会增加显著的运行时间和开销。例如,调试固件可以被设置为引入冗余的下一个程序指针,其用于跟踪下一个程序指针1008(图10)。冗余程序指针可以是指向虚拟层(layer)或深层的设置点。可以比较冗余程序指针和下一程序指针1008以确定匹配或是否已经发生数据损坏。此过程可能添加大量调试代码并花费大量时间到达故障点。这会导致高开销,因为有更多固件代码来检查逻辑以查看nand序列是否有故障(atfault)。此解决方案可能潜在地更改大部分固件。固件可以看作是流水线。每次执行冗余程序指针的比较时,流水线都会暂停,这会增加大量时间。130.在一些实施例中,过程流程1104可以包括步骤s1106、s1110、s1112'和s1116。步骤1106和s1110可以如前所述。过程流程1104的不同在于启用经由nand固件的自验证(例如,已启用s870(图8)的读取步骤)。在一些实施例中,步骤s870(图8)可以处于禁用状态以便提高系统性能,但可以在需要时启用。例如,调试固件可以包括对nand固件的指令以打开nand自验证特征。在步骤s1112',出现双重编程错误。与先前呈现的过程流程相比,过程流程1104可以在回读步骤检测双重编程页。回读失败,并且nand自验证过程发出失败指示——nand存储器特定页中的数据有错误。该指示可以用于在接近双重编程事件的时间点停止测试场景和调试过程。该信息对于快速识别代码的哪一部分对于造成双重编程错误负责有价值。即,接着发生的调试可以基于程序的停止的时序。此外,与上述的冗余程序指针场景(其增加大量时间和开销)不同,使用步骤s870(图8)不会实现固件操作的如此广泛的改变并且时序影响不那么严重。步骤s870是使用nand存储器的内部能力进行快速页读取。131.双重编程事件和后续检测方法可以用以下方式描述。在一些实施例中,可以根据第一编程数据对nand闪存器件的选定页进行编程。然后,可以根据第二编程数据对选定页进行编程。选定页可以包括与字线对应的存储单元(例如,页432(图4))。选定页的编程可以包括使用多个编程电压的多个编程操作(例如,步骤s710(图7)或s810(图8))。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应操作之后执行,以根据第一或第二编程数据确定多个存储单元的已编程存储单元是否具有阈值电压电平(例如,步骤s720(图7)或s820(图8))。132.然后,在一些实施例中,可以使用与nand存储器相关联的固件对选定页执行自验证以确定存储的第一数据是否被过写(或者如果指令以不同的顺序执行,则第二数据是否被过写)。该方法可以包括在确定了存储在选定页处的数据被过写时发出失败指示。自验证可以包括由nand闪存器件对选定页执行内部读取操作(例如,步骤s870(图8)),以确定存储在选定页处的数据。133.应该理解的是,在一些实施例中,参考图11描述的功能还可以包含参考其他附图描述的特征。例如,可以针对调试固件和/或nand固件提供用于调整读取操作的执行的输入(例如,启用步骤s870(图8))。在另一个示例中,如果nand存储器具有缓存系统,则nand自验证可以被配置为与之前参考图9描述的缓存特征交互。在又一示例中,输入也可以用于限制将针对其使用nand自验证的nand存储器的区域,如参考图8所述。134.图12图示了根据一些实施例的调试双重编程事件的时间线1200。在一些实施例中,时间线1200的上侧表示与调试固件有关的事件。时间线1200的下侧表示与程序的测试用例有关的事件。调试固件和测试用例可以实现之前参考图11描述的一个或多个特征。135.在一些实施例中,调试固件在时间1202启动。在时间1204,调试固件向nand存储器的固件发送输入以启用nand自验证,如先前参考图8、图9和/或图11所描述的。在时间1206,可以运行程序的测试用例。基于测试用例的要求,设想测试用例在该时间点启动或测试用例先前启动并在时间1206继续运行。在时间1208,nand自验证特征确定由于双编程事件导致的失败。在时间1210,调试固件和/或nand固件被指示停止。在时间1212,测试用例停止。在时间1214,调试开始。由于测试用例和固件已经在双重编程事件后立即停止,因此可以显著简化调试步骤,因为将更容易识别已经导致双重编程事件发生的代码段。136.在一些实施例中,调试可以由一个或多个计算设备(例如,主机15(图1))执行。137.在一些实施例中,本文公开的nand自验证特征可以在涉及用于防止数据损坏的数据备份的方法中实现。数据备份方案的一个示例可以包括存储驱动器的raid布置(例如,使用物理驱动器、逻辑驱动器或其组合)。存储驱动器可以包括一个或多个nand存储器件。raid布置可以依赖于针对其寻求保护的每个块末尾的所谓奇偶校验位。通常,raid布置依赖于控制器硬件支持来指示链接的存储驱动器以冗余布置运行。额外的控制器硬件支持会导致额外的ram和芯片尺寸成本。此外,可以限制每个奇偶校验组提供的保护量(例如,每个奇偶校验组一个数据错误)。138.在一些实施例中,用于保护nand存储器中的数据的raid布置的替代方案可以用于实施所谓的slc备份。139.图13图示了根据一些实施例的用于执行slc备份的过程流程1300。在一些实施例中,标准mlc、tlc或qlc程序将在nand存储器上执行。怀疑在nand存储器的部分中,用于mlc、tlc或qlc编程的某些存储单元具有固有的相关联风险(例如,存在一个或多个存储单元可能无法正确接收编程的可能性)。由于slc编程可以比mlc、tlc或qlc编程更可靠,因此冗余slc编程将与原始mlc、tlc或qlc编程一起执行。140.在一些实施例中,提供编程数据以用于存储在nand存储器中。在步骤s1302,根据编程数据使用mlc、tlc或qlc编程(例如,使用过程流程700(图7)中的步骤)对nand存储器的页进行编程。在步骤s1304,使用一个或多个计算设备(例如,主机计算机15(图1))从nand存储器读回mlc、tlc或qlc编程的页。注意,与从nand存储器的固件21(图1)发起页读取指令相反,主机固件可以正发出从nand存储器读取的指令。在步骤s1306,mlc、tlc或qlc编程也可以被编程在nand存储器中的适当数量的slc页中(例如,tlc编程数据可以被写入三个slc页)。保存到nand存储器的slc区域的编程数据可以为nand存储器的较不可靠的mlc、tlc或qlc区域中的数据提供可靠的备份。然而,与过程流程1300相关联的时间负担可能是不期望的,尤其是使用主机固件执行回读所花费的时间。141.本文公开的nand自验证方法可以用于修改slc备份方案并缩短执行数据备份的时间负担,从而提高nand存储器系统中的数据保护方法的性能。然而,在描述使用nand自验证方法的备份操作之前,首先描述一种用于识别nand存储器中不可靠区域的方法是有益的。142.图14图示了根据一些实施例的用于识别nand存储器中的不可靠区域的过程流程1400。在一些实施例中,应当理解,不可靠区域可以指nand存储器中存在无法正确编程数据的风险的区域(例如,不可靠区域具有编程数据的相关联的失败概率)。在一个非限制性示例中,可以将风险量化为阈值概率。低失败概率(例如,低于阈值)可以被认为是可靠的,反之亦然。例如,可以基于nand固件的用户或开发者的需要来确定阈值概率。143.在一些实施例中,在步骤s1402,可以对nand存储器执行数据存储测试。数据存储测试可以包括例如将数据存储在nand存储器的页中(例如,使用过程流程700(图7))。数据存储测试还可以包括从nand存储器的页读回存储的数据。在步骤s1404,可以对在步骤s1402读回的数据执行分析。该分析可以包括确定nand存储器中的读取失败区域。该分析可以包括生成可靠和/或不可靠的一个或多个区域的列表。可靠性和/或不可靠性可以如上所述量化(例如,基于失败概率)。在步骤s1406,可靠性/不可靠性的确定的区域可以存储在nand固件中和/或发送到nand固件,以通知后续的slc备份过程。144.图15图示了根据一些实施例的用于在slc备份过程中实现nand自验证的过程流程1500。在一些实施例中,提供编程数据以用于使用mlc、tlc或qlc编程存储在nand存储器中。然而,与过程流程1300(图13)形成对比,被识别为不可靠的nand存储器的区域可以遵循过程流程1500。不可靠区域可以使用例如过程流程1400(图14)来确定。提供的数据根据编程数据存储在nand存储器的页中。145.在一些实施例中,在步骤s1502,可以根据编程数据对nand存储器的第一页的存储单元进行编程(例如,使用步骤s710(图7)或s810(图8))。nand存储器第一页的存储单元的编程可以使用slc编程执行,这比mlc、tlc或qlc编程更可靠。146.在一些实施例中,在步骤s1504,可以执行验证以确定第一页的存储单元的编程是否正确执行(例如,使用步骤s720(图7)或s820(图8))。注意,编程数据最初是为mlc、tlc或qlc编程提供的。因此,可以使用slc编程对适当数量的附加页执行上述数据存储操作(例如,qlc编程数据可以写入四个slc页)。147.在一些实施例中,在步骤s1506,可以根据编程数据对nand存储器的第二页的存储单元进行编程(例如,使用步骤s710(图7)或s810(图8))。nand存储器的第二页的存储单元的编程可以使用mlc、tlc或qlc编程来执行。在步骤s1502,存储在nand存储器的mlc、tlc或qlc区域中的数据与存储在nand存储器的slc区域中的数据匹配。148.在一些实施例中,在步骤s1508,可以执行验证以确定第二页的存储单元的编程是否正确执行(例如,使用步骤s720(图7)或s820(图8))。149.在一些实施例中,在步骤s1510,可以使用与nand存储器相关联的固件对第二页执行读取操作以验证第二页中数据的存储(例如,nand自验证,类似于步骤s870(图8))。使用nand内部固件来验证已编程的第二页(即mlc、tlc或qlc页),执行编程的验证可以比使用主机固件执行验证快得多(如步骤s1304中完成的(图13))。也就是说,过程流程1500是slc备份方法的一部分,该slc备份方法包括不使用与配置为执行slc备份方法的一个或多个主机计算设备相关联的固件对第二页执行读取操作,一个或多个主机计算设备是nand存储器的主机。换言之,与使用与一个或多个主机计算设备相关联的固件对第二页执行读取操作相比,使用与nand存储器相关联的固件对第二页执行读取操作还包括减少完成备份方法的时间。在一些示例中,与使用与一个或多个主机计算设备相关联的固件对第二页执行读取操作相比,完成速度可以提高5%或更多、10%或更多、或15%或更多。150.在一些实施例中,在步骤s1512,可以释放第一页(slc区域)以准备接收新数据(即,可以使第一页中的被存储数据无效和/或被擦除)。151.参考图8描述了在一些实施例中输入可以用于调整使用nand固件21(图1)的读取操作的执行。此外,参照图14描述了,可靠性/不可靠性的一个或多个区域可以被确定、存储和/或发送到nand固件以通知随后的slc备份过程。图16说明了与图8和图14的这些方面有关的附加细节——示例以非限制性的能力被提供。也就是说,应该理解,图8、图14或图16中未明确示出的附加特征仍是基于参考其他附图描述的实施例而设想的。152.图16示出了根据一些实施例的用于在slc备份过程中实现nand自验证的过程流程1600。在一些实施例中,在步骤s1602,可以启动一个或多个固件。一个或多个固件可以包括例如存储系统10(例如,nand存储器)的固件21(图1)和/或提供nand存储器和一个或多个主机计算设备之间的使能通信的一个或多个计算设备的固件。在启动了时,在步骤s1604,可以启用和配置nand固件中的nand自验证特征(例如,启用执行步骤s870(图8))。nand自验证特征的启用可以使用输入来实现(例如,如参考时间1204(图12)所述)。该输入还可以包括nand存储器的不可靠区域的信息(例如,如参考图14所描述的)。153.在一些实施例中,随着使用与nand存储器相关联的固件启用读取操作,可以选择nand存储器的一个或多个区域。可以对选定的一个或多个区域执行nand自验证。可以使用输入指定一个或多个选定区域(例如,不可靠区域)。这可以通过不对被确定为可靠的区域执行nand自验证来显著提高slc备份过程的速度(例如,如参考图14所描述的)。154.前面已经描述,在一些实施例中,输入可以被实现为用户提供的用于执行数据存储操作的命令的前缀。在步骤s1604,随着nand自验证特征的启用,可以进行多种配置。例如,步骤s1604可以包括配置字线位图(用于选择字线或页)、配置字符串位图(用于选择字符串)、配置页类型位图(用于选择特定页,例如上页、中页、下页),并配置存储器级别类型(以选择mlc、tlc或qlc)。前面参考图8描述了选择nand存储器中的特定位置。155.在一些实施例中,在步骤s1606,可以对在步骤s1604中指定了的nand存储器的选定区域执行slc备份过程。步骤s1606可以通过执行过程流程1500(图15)来实现。可以使用步骤s1502和s1504(图15)来实现对nand存储器的slc区域的写入。可以使用步骤s1506和s1508(图15)来实现对nand存储器的mlc、tlc或qlc区域的写入。执行nand自验证可以使用步骤s1510(图15)或s870(图8)来实现。可以使用步骤s1512来实现使不需要的slc区域无效。156.本文公开的实施例中的方法步骤可以以任何可想到的顺序执行,并且不需要执行所有步骤。157.总之,本公开提供了一种使用nand自验证来调试双重编程错误的方法。该编程方法可以包括根据第一和第二编程数据对nand闪存器件的选定页进行编程。选定页可以包括与字线对应的多个存储单元。选定页的编程可以包括使用多个编程电压的多个编程操作。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据第一或第二编程数据确定选定页的编程的存储单元是否具有阈值电压电平。编程方法还可以包括由nand闪存器件对选定页执行自验证以确定存储在选定页处的数据是否被过写。该编程方法还可以包括在确定了存储在选定页处的数据被过写时生成失败指示。158.本公开还提供了一种用于使用nand自验证来调试双重编程错误的nand闪存器件。nand闪存器件可以包括包含多个页的存储器阵列。多个页中的每个页可以包括与字线对应的多个存储单元。nand闪存器件还可以包括经由字线耦合到多个页的外围电路。外围电路可以根据第一和第二编程数据对nand闪存器件的选定页进行编程。选定页的编程可以包括使用多个编程电压的多个编程操作。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据第一或第二编程数据确定选定页的编程的存储单元是否具有阈值电压电平。外围电路还可以对选定页执行自验证以确定存储在选定页处的数据是否被过写。nand闪存器件可以在确定了存储在选定页处的数据被过写时生成失败指示。159.本发明还提供了一种用于使用nand自验证调试双重编程错误的系统。该系统可以包括一个或多个计算设备和nand闪存器件。nand闪存器件可以包括包含多个页的存储器阵列。多个页中的每个页可以包括与字线对应的多个存储单元。nand闪存器件还可以包括经由字线耦合到多个页的外围电路。外围电路可以根据第一和第二编程数据对nand闪存器件的选定页进行编程。选定页的编程可以包括使用多个编程电压的多个编程操作。选定页的编程还可以包括多个验证操作。多个验证操作中的验证操作可以在多个编程操作中的对应编程操作之后执行,以根据第一或第二编程数据确定选定页的编程存储单元是否具有阈值电压电平。外围电路还可以对选定页执行自验证以确定存储在选定页处的数据是否被过写。nand闪存器件可以在确定了存储在选定页处的数据被过写时生成失败指示。160.具体实施例的上述描述将如此充分地揭示本公开的一般性质,以至于其他人可以通过应用本领域技术人员内的知识,容易地修改和/或适应各种应用,这样的具体实施例,无需过度实验,且不背离本公开的一般概念。因此,基于本文所呈现的公开内容和指导,此类适应和修改旨在落入所公开实施例的等同物的含义和范围内。应当理解,本文的措辞或术语是出于描述而非限制的目的,使得本说明书的术语或措辞将由本领域技术人员根据公开和指导来解释。161.本公开的实施例已经在上面借助说明指定功能的实现及其关系的功能构建块进行了描述。为了描述的方便,这里已经任意定义了这些功能构建块的边界。只要适当地执行指定的功能及其关系,就可以定义替代边界。162.
发明内容和摘要部分可以阐述如发明人所设想的本公开的一个或多个但不是所有示例性实施例,因此,不旨在以任何方式限制本公开和所附权利要求.163.本公开的广度和范围不应受到任何上述示例性实施例的限制,而应仅根据所附权利要求及其等同物来定义。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1