位精确 ECC 恢复 (BEER):利用 DRAM 数据保留特性确定 DRAM 片上 ECC 功能

抽象:

不断增加的单单元DRAM错误率促使DRAM制造商采用片上纠错编码(ECC),该编码完全在DRAM芯片内运行,以提高工厂良率。片上 ECC 功能及其对 DRAM 可靠性的影响被视为商业机密,因此只有制造商才能准确了解片上 ECC 如何改变外部可见的可靠性特性。因此,片上 ECC 阻碍了第三方 DRAM 客户(例如,测试工程师、实验研究人员),他们通常根据这些特性设计、测试和验证系统为了让第三方深入了解片上 ECC 如何在纠错期间转换 DRAM 错误模式,我们引入了位精确 ECC 恢复 (BEER),这是一种用于确定完整 DRAM 片上 ECC 功能(即 其奇偶校验矩阵),无需硬件工具、有关 DRAM 芯片或片上 ECC 机制的先决条件知识,或访问 ECC 元数据(例如,错误综合症、奇偶校验信息)。BEER 利用了关键见解,即通过精心设计的测试拍打非侵入性地诱导数据保留错误,揭示特定 ECC 功能特有的行为我们使用 BEER 识别来自三大 DRAM 制造商的 80 个具有片上 ECC 的真实 LPDDR4 DRAM 芯片的 ECC 功能。我们评估了 BEER 在仿真中的正确性和在真实系统上的性能,以证明 BEER 在广泛的片上 ECC 功能中是有效和实用的。为了证明BEER的价值,我们提出并讨论了第三方可以使用BEER改进其设计和测试实践的几种方法。作为一个具体的例子,我们介绍并评估了BEEP,这是第一种错误分析方法,它使用已知的片上ECC功能来恢复导致可观察的校正后错误的不可观察的原始位错误的数量和位精确位置。

第1节.

介绍

动态随机存取存储器 (DRAM) 是各种计算平台上系统主存储器的主要选择,因为它相对于其他存储器技术具有有利的每比特成本。DRAM 制造商通过提高各代设备的原始存储密度来保持竞争优势。不幸的是,这些改进在很大程度上依赖于工艺技术的扩展,这会导致严重的可靠性问题,从而降低工厂产量。DRAM制造商传统上使用制造后修复技术(如行/列备用)来减轻良率损失[51]。然而,现代DRAM芯片中的持续技术扩展需要更强的减错机制才能保持可行性,因为在较小的工艺技术节点上越来越频繁的随机单位错误[39],[76],[89],[99],[109],[119],[120],[124],[127],[129],[133][160]。因此,DRAM制造商已经开始使用片上纠错编码on-die ECC),它默默地完全在DRAM芯片内纠正单位错误[39],[76],[120],[129],[138]。片上 ECC 在 DRAM 芯片之外完全不可见,因此用于纠正错误的 ECC 元数据(即奇偶校验位、错误综合症)对系统的其余部分是隐藏的。

先前的工作[60],[97],[98],[120],[129],[133],[138],[147]表明现有的片上ECC代码是64位或128位单错误校正(SEC)汉明码[44]。然而,每个DRAM制造商都认为他们的片上ECC机制的设计和实现是高度专有的,并确保不会在任何公开文档中透露其详细信息,包括DRAM标准[68],[69],DRAM数据表[63],[121],[149],[158],出版物[76],[97],[98],[133]和行业白皮书[120][147]。.

由于未知的片上ECC功能封装在DRAM芯片中,因此可以混淆原始位错误(即预校正错误)1以特定于 ECC 功能的方式。因此,软件可见的不可纠正错误(即校正后错误)的位置通常不再与物理DRAM错误机制引起的校正前错误的位置相匹配。虽然从黑盒的角度来看,这种行为似乎是可取的,但它给第三方DRAM客户带来了严重的问题,他们根据他们购买和使用的DRAM芯片的可靠性特征来研究,测试和验证和/或设计系统。第2.2节详细描述了这些客户及其面临的问题,包括但不限于三个重要群体:(1)需要确保补充错误缓解机制(例如,DRAM控制器中的等级级ECC)经过精心设计以配合片上ECC功能的系统设计人员[40],[129],[160],(2)大型行业(例如,计算系统提供商,如微软[33], 惠普 [47] 和英特尔 [59]、DRAM 模块制造商 [4],[92],[159])或政府实体(例如,国家实验室 [131],[150]),他们在验证他们购买和使用的 DRAM 芯片时必须了解 DRAM 可靠性特征,以及 (3) 需要全面了解物理设备特征以研究和建模 DRAM 可靠性的研究人员 [17]、[20]、[31]、[42] , [43], [46], [72], [78]–[86], [109], [138], [139], [172], [178]。

对于这些第三方中的每一个,仅仅根据现有的行业[60],[97],[98],[120],[133],[147]和学术[129],[138]出版物了解或逆向工程ECC代码的类型(例如,n位汉明码)不足以准确确定ECC机制如何混淆特定的错误模式。这是因为给定类型的 ECC 代码可以根据其 ECC 功能(即其奇偶校验矩阵)的设计方式具有许多不同的实现,并且不同的设计会导致不同的可靠性特征。例如,图1显示了对于使用不同ECC功能的相同类型的三个不同ECC代码(即具有32个数据位和6个奇偶校验位的单错误校正汉明码),在不同位位置观察到错误的相对概率。我们通过模拟 10 获得这些数据9ECC 单词使用 EINSim 模拟器 [2],[138],并显示通过统计自举 [95] 计算的 32 个样本的中位数和 1000% 置信区间。我们模拟0xFF测试模式2在原始比特错误率为 10 时具有均匀随机预校正误差–4(例如,在实验研究中经常看到[17],[20],[43],[46],[76],[102],[109],[139],[157])。

图1:

不同 ECC 函数在不同位位置的相对误差概率,具有均匀随机分布的预校正(即原始)位误差。

显示全部

数据表明,相同类型的ECC代码可能具有截然不同的校正后误差特征。这是因为当每个 ECC 机制面对比它能够纠正的更多的错误(即不可纠正的错误)时,其行为都不同,导致它错误地对未遇到错误的位执行特定于 ECC 功能的“更正”(即错误更正,第 3.3 节对此进行了扩展)。因此,研究使用相同类型ECC代码但不同ECC功能的两个DRAM芯片的研究人员或工程师可能会发现,即使物理DRAM单元的可靠性特征相同,芯片的软件可见可靠性特征也有很大不同。另一方面,如果我们知道完整的ECC函数(即其奇偶校验矩阵),我们就可以准确计算出哪些预校正误差模式导致一组观察到的误差。图 1 是将此类计算汇总到 10 个的结果9错误模式3,以及第 7.1 节演示了如何使用 ECC 函数仅使用观察到的校正后错误来推断校正前错误计数和位置。

了解校正前和校正后错误之间的精确转换有利于上述所有第三方用例,因为它为系统设计人员、测试工程师和研究人员提供了一种将存储器本身的错误特征与特定 ECC 功能的影响隔离开来的方法。第 2.2 节提供了几个示例用例,并详细描述了了解 ECC 功能的好处。虽然专门的、可能是侵入性的方法(例如,芯片拆卸[66],[164],先进的成像技术[48],[164])理论上可以提取ECC功能,但对于许多第三方用户来说,这些技术通常是无法访问或不可行的。

为了使第三方能够重建预校正DRAM可靠性特征,我们的目标是开发一种方法,该方法可以可靠准确地确定完整的片上ECC功能,而无需硬件工具,有关DRAM芯片或片上ECC机制的先决条件知识,或访问ECC元数据(例如,错误综合症,奇偶校验信息)。为此,我们开发了Bit-E xact ECC恢复(BEER),这是一种新方法,只需研究DRAM芯片产生的软件可见的校正后错误模式,即可确定DRAM芯片的完整片上ECC功能。因此,BEER 不需要硬件支持、硬件入侵或访问内部 ECC 元数据(例如,错误综合症、奇偶校验信息)。BEER 利用了关键见解,即强制 ECC 功能对精心设计的不可纠正的错误模式采取行动,揭示了 ECC 功能特定的行为,从而消除了不同 ECC 功能的歧义。BEER包括三个关键步骤:(1)通过暂停DRAM刷新来故意诱导无法纠正的数据保留错误,同时使用精心设计的测试模式来控制错误的位位置,这是通过利用数据保留错误的固有数据模式不对称来完成的(在第3.2节中进行了讨论),(2)枚举ECC机制导致错误校正的位位置,以及(3)使用SAT求解器[28]。 求解导致观察到的一组错误校正的唯一奇偶校验矩阵。

我们实验性地将 BEER 应用于来自三大 DRAM 制造商的 80 个具有片上 ECC 的真实 LPDDR4 DRAM 芯片,以确定芯片的片上 ECC 功能。我们描述了将BEER应用于任何具有片上ECC的DRAM芯片所需的实验步骤,并表明BEER可以容忍观察到的实验噪声。我们表明,不同的制造商似乎使用不同的片上ECC功能,而来自同一制造商和型号的芯片似乎使用相同的片上ECC功能(第5.1.3节)。不幸的是,我们使用真实DRAM芯片的实验研究在进一步验证方面有两个限制:(1)由于片上ECC功能被视为每个制造商的商业机密,因此即使考虑与DRAM制造商签订保密协议,我们也无法获得比较BER结果的基本事实,以及(2)出于保密原因,我们无法发布我们使用BEER发现的最终ECC功能(在第2.1节中讨论)。

为了克服使用真实DRAM芯片进行实验研究的局限性,我们严格评估了BEER在仿真中的正确性(第6节)。我们证明了 BEER 正确恢复了 115300 单错误校正汉明码的片上 ECC 函数4,代表片上 ECC,ECC 字长范围为 4 到 247 位。我们使用真实系统评估 BEER 实现的运行时间和内存消耗,以证明 BEER 是实用的,并且 BEER 所需的 SAT 问题是实际可以解决的。

为了展示 BEER 在实践中的实用性,我们提出并讨论了第三方可以利用 BEER 揭示的 ECC 功能的几种方法,以更有效地设计、研究和测试使用带有片上 ECC 的 DRAM 芯片的系统(第 7 节)。作为一个具体的例子,我们介绍并评估了Bit-E xact Error Profiling(BEEP),这是一种新的DRAM数据保留错误分析方法,该方法纯粹根据观察到的校正后错误重建校正前的错误计数和位置。使用BEER揭示的ECC功能,BEEP精确推断出在给定的一组测试条件下观察到的未观察到的原始位错误对应于观察到的校正后错误。我们表明,BEEP能够表征各种ECC功能、ECC字长、错误模式和错误率的预校正误差。我们公开发布我们的工具作为开源软件:(1)用于将BEER应用于真实DRAM芯片的实验数据的新工具[1],以及(2)EINSim的增强功能[2],用于在模拟中评估BEER和BEEP。

本文做出了以下主要贡献:

  1. 我们提供位精确 ECC 恢复 (BEER),这是第一种确定完整 DRAM 片上 ECC 功能(即其奇偶校验矩阵)的方法,无需硬件工具、有关 DRAM 芯片或片上 ECC 机制的先决条件知识,也无需访问 ECC 元数据(例如,错误综合症、奇偶校验信息)。

  2. 我们实验性地将 BEER 应用于来自三大 DRAM 制造商的 80 个具有未知片上 ECC 机制的真实 LPDDR4 DRAM 芯片,以确定其片上 ECC 功能。我们表明,BEER对观察到的实验噪声具有鲁棒性,来自不同制造商的DRAM芯片似乎使用不同的片上ECC功能,而来自同一制造商和型号的芯片似乎使用相同的功能。

  3. 我们评估了 BEER 在仿真中的正确性,并表明 BEER 正确识别了 115300 个具有代表性的片上 ECC 代码的片上 ECC 函数,ECC 字长范围为 4 到 247 位。

  4. 我们分析评估了 BEER 的实验运行时间,并使用真实系统来测量 SAT 求解器的性能和内存使用特征(例如,短代码可以忽略不计,代表性 57 位代码的中位数为 1.6 小时和 3.128 GiB 内存,62 位代码的内存长达 11 小时和 4.247 GiB 内存),以证明 BEER 是实用的。

  5. 我们提出并评估了位精确错误分析(BEEP),这是一种新的DRAM数据保留错误分析方法,它使用已知的ECC功能(例如,通过BEER)来推断预校正错误计数和位置。我们表明,BEEP能够表征不同ECC功能,码字长度,错误模式和错误率的位精确预校正错误位置。

  6. 我们开源了我们开发的软件工具,用于(1)将BEER应用于来自真实DRAM芯片的实验数据[1]和(2)在模拟中评估BEER和BEEP [2]。

第2节.

未知片上ECC的挑战

本节讨论为什么片上 ECC 被认为是专有的,它的保密性如何给第三方消费者带来困难,以及 BEER 方法如何通过确定完整的片上 ECC 功能来帮助克服这些困难。

2.1. 关于片上 ECC 的保密

片上 ECC 以静默方式缓解了降低工厂良率的不断增加的单位错误 [39]、[76]、[89]、[99]、[109]、[119]、[120]、[124]、[127]、[129]、[133][160]。由于片上 ECC 对外部 DRAM 芯片接口不可见,因此较旧的 DRAM 标准 [68]、[69] 对片上 ECC 机制没有限制,而较新的标准 [70] 仅指定了片上 ECC 的高级描述,以支持新的(尽管有限)DDR5 功能,例如片上 ECC 清理。特别是,对片上ECC功能本身的设计或实现没有任何限制。

这意味着了解片上ECC机制的去尾可以揭示有关其制造商工厂良率的信息,这些信息是高度专有的[23],[55],因为它们与商业利益,潜在的法律问题和45 +十亿美元DRAM市场中的竞争力直接相关[143],[170].因此,制造商认为他们的片上ECC设计和实现是他们不愿意披露的商业秘密。根据我们的经验,DRAM 制造商不会根据保密协议透露片上 ECC 细节,即使对于了解细节是互惠互利的大型工业板供应商也是如此。5

这给我们使用真实DRAM芯片的实验带来了两个挑战:(1)我们无法访问“真实”ECC函数来验证BEER的结果;(2)基于我们与DRAM制造商的关系,出于保密原因,我们无法发布我们使用BEER确定的最终ECC函数。然而,这并不妨碍第三方消费者将BEER应用于他们自己的设备,我们希望我们的工作鼓励DRAM制造商对他们的设计更加开放。6

2.2. 片上 ECC 对第三方的影响

片上 ECC 改变了 DRAM 芯片的软件可见可靠性特性,因此它们不再仅由 DRAM 芯片内物理发生的错误方式决定。图 1 通过显示使用不同的片上 ECC 功能如何改变最终用户显示相同的底层 DRAM 错误的方式来说明这一点。校正后误差不是遵循校正前误差分布(即均匀随机误差),而是表现出特定于ECC函数的形状,如果不精确知道每种情况下使用哪种ECC函数,则很难预测这些形状。这意味着,无论底层DRAM技术和错误机制如何,具有不同片上ECC功能的两款商用DRAM芯片都可能表现出相似或不同的可靠性特征。因此,仅靠物理误差机制的行为无法解释DRAM芯片的校正后误差特性。

不幸的是,这给第三方DRAM消费者(例如,系统设计师,测试人员和重新搜索者)带来了严重的问题,他们无法再通过研究其软件可见的错误来准确理解DRAM芯片的可靠性特征。这种缺乏理解使第三方无法(1)做出明智的设计决策,例如,在构建基于内存控制器的错误缓解机制以补充片上ECC时,以及(2)开发依赖于利用DRAM芯片可靠性特征的可预测方面的新想法,例如,所有DRAM技术的基础物理错误机制。随着技术不断扩展的错误率恶化[39],[76],[86],[89],[90],[99],[119],[120],[124],[127],[129],[133],制造商可能会诉诸更强的代码,进一步扭曲校正后的可靠性特征。 本节的其余部分介绍未知片上 ECC 函数阻碍第三方的三种关键方式,确定该函数有助于缓解问题。

设计高可靠性系统。十个系统设计人员寻求提高内存可靠性,而不是DRAM单独提供的可靠性(例如,通过在服务器级机器的内存控制器中包含等级级ECC或将ECC包含在片上缓存中)。特别是,等级级ECC经过精心设计,以缓解常见的DRAM故障模式[21](例如,芯片故障[129],突发错误[29],[116]),以便纠正尽可能多的错误。然而,针对关键故障模式进行设计需要了解DRAM芯片的可靠性特征,包括任何底层ECC功能(例如,片上ECC)的影响[40][160]。例如,Son等人[160]表明,如果片上ECC遭受不可纠正的错误并错误地“纠正”了一个非错误位(即引入错误校正),则更强的秩级ECC可能不再能够检测到本来是可检测(可能可纠正)的错误。为了防止这种情况,两个级别的ECC必须精心设计,以互补彼此的弱点。一般来说,如果知道具有片上ECC的DRAM芯片的ECC功能及其对典型DRAM故障模式的影响,则可以更有效地围绕具有片上ECC的DRAM芯片构建高可靠性系统。

测试、验证和质量保证。大型计算系统提供商(例如,微软[33],惠普[47],In-tel[59]),DRAM模块制造商[4],[92],[159]和政府实体(例如,国家实验室[131],[150])通常会对他们购买的DRAM芯片进行广泛的第三方测试,以确保芯片满足内部性能/能源/可靠性目标。这些测试验证了DRAM芯片是否按预期运行,并且对于观察到的任何错误都有众所周知的,令人信服的根本原因(例如,基本的DRAM错误机制)。不幸的是,片上ECC会干扰此类测试的两个关键组件。首先,它混淆了预校正错误的数量和位精确位置,因此诊断任何观察到的错误的根本原因变得具有挑战性。其次,片上 ECC 将所有写入的数据编码为 ECC 码字,因此写入物理单元的值可能与在 DRAM 芯片接口上观察到的值不匹配。编码过程破坏了针对特定电路级现象的精心构建的测试模式(例如,加剧位线之间的干扰[3],[79],[123]),因为编码数据可能不再具有预期的效果。不幸的是,构建这样的模式对于高效测试至关重要,因为它最大限度地减少了实现高错误覆盖率所需的测试时间[3],[51]。在这两种情况下,由 BEER 确定的完整片上 ECC 功能准确描述了片上 ECC 如何将预校正误差转换为校正后误差。这使用户能够推断预校正错误位置(在第7.1节中演示)并设计测试模式,从而产生具有所需属性的码字(在第7.2节中讨论)。

科学误差表征研究。科学错误表征研究探索物理DRAM错误机制(例如,数据保留[42],[43],[46],[74],[75],[78]–[81],[109],[139],[157],[172],[173],减少访问延迟[16],[17],[20],[37],[83]–[85],[102],[104],电路干扰[35],[79],[81],[86],[90],[135],[136]),通过故意加剧误差机制并分析由此产生的误差的统计特性(例如,频率,空间分布)。 这些研究有助于建立误差模型[20],[31],[43],[83],[94],[104],[157],[178],导致新的DRAM设计和操作点,改进最先进的技术。遗憾的是,片上 ECC 使误差分析和建模复杂化,因为 (1) 掩盖了作为研究对象的物理预校正误差,以及 (2) 阻止直接访问奇偶校验位,从而排除了对给定芯片中所有 DRAM 单元的全面测试。尽管先前的工作[138]能够推断校正前误差的高级统计特征,但它并没有提供校正前和校正后误差之间的精确映射,这只有在知道完整的ECC函数时才有可能。通过我们新的 BEER 方法了解完整的 ECC 功能,可以恢复整个 ECC 字中预校正错误的位精确位置(如第 7.1 节所示),以便错误表征研究可以将 DRAM 错误机制的影响与片上 ECC 的影响区分开来。第7节详细讨论了BEER实现的几项关键表征研究。

第3节.

背景

本节提供了与本手稿相关的 DRAM、编码理论和满足性 (SAT) 求解器的基本概述。有关更多详细信息,我们将向读者推荐有关DRAM设计和操作的综合文本[17]–[20],[45],[54],[61],[64],[65],[77],[102],[103],[106],[111],[153]–[155],[180],编码理论[25],[53],[108],[115],[122],[146][148] 和 SAT 求解器 [8]、[24]、[28][30]。

3.1. DRAM 单元和数据存储

DRAM芯片使用存储电容器的电荷水平将每个数据位存储在自己的存储单元由于电容器容易受到电荷泄漏的影响 [26]、[42]、[90]、[95]、[109]、[110]、[138]、[139]、[169],因此存储值最终可能会降低到数据丢失的程度,从而导致数据保留错误。 在正常 DRAM 操作期间,刷新操作会在每个刷新窗口恢复存储在每个单元中的数据值 (t参考资料),例如,32ms 或 64ms [67]–[69]、[109]、[110]、[139],以防止数据保留错误。

根据给定芯片的电路设计,每个单元可以使用两种编码约定之一存储数据:单元将数据“1”编码为完全充电的存储电容器(即充电状态),反单元将数据“1”编码为完全放电的电容器(即放电状态)。尽管在正常运行期间,细胞的编码方案对系统的其余部分是透明的,但在存在数据保留错误的情况下,这一点变得很明显,因为DRAM细胞通常仅从其充电状态衰减到放电状态,如先前的工作[26],[90],[95],[109],[110],[138],[139]所示。

3.2. 研究 DRAM 错误

故意诱导DRAM错误(例如,通过违反去故障时序参数)通过由此产生的误差的统计特征揭示有关DRAM芯片内部设计的详细信息。以前的工作使用自定义内存测试平台(例如,基于FPGA的[46])和商用CPU[6],[57](例如,通过BIOS[56]更改CPU配置寄存器)来研究各种DRAM错误机制,包括数据保留[26],[90],[95],[109],[110],[138],[139],电路时序违规[17],[83]-[85],[102],[104]和Rowham-mer[86],[90],[125],[126],[135],[136]。我们的工作重点是数据保留错误,因为它们表现出经过充分研究的特性,有助于我们的目的:

  1. 通过操纵刷新窗口(t参考资料) 和环境温度。

  2. 它们是可重复的[139],[163],它们的空间分布是均匀随机的[7],[43],[84],[138],[157]。

  3. 它们从充电状态单向失效到放电状态[26],[90],[95],[109],[110],[138],[139]。

DRAM 芯片外错误。软件可见的内存错误通常是由于DRAM芯片外部的组件(例如,插座,总线)的故障而发生的[119]。然而,我们的工作重点是DRAM芯片发生的错误,这是现代技术节点大小[39],[76],[89],[99],[119],[120],[124],[127],[129],[133],[160]的严重且日益严重的问题。这些错误是片上ECC的主要动机,它试图在DRAM芯片外观察到它们之前纠正它们。

3.3. 片上 ECC 和汉明码

随着制造商不断提高DRAM存储密度,不需要的单位错误更频繁地出现[39],[41],[50],[76],[89],[99],[105],[114],[119],[120],[128],[129],[133],[138],[151],[161],[162] 并降低工厂产量。为了消除这些错误,制造商使用片上ECC [39],[76],[120],[128],[129],[133],[138],这是直接在DRAM芯片中实现的纠错码。

图 2 显示了系统如何与使用片上 ECC 的存储芯片接口。系统将k数据字(d)写入芯片,芯片在内部维护数据的扩展n位表示,称为码字c),由d的ECC编码创建。存储的代码字可能会遇到错误,从而导致潜在的错误代码字 (c)。如果发生的错误多于ECC可以纠正的错误,例如,单错误校正(SEC)代码中的两个错误,则在ECC解码(d)之后读出的最终数据字也可能包含错误。编码和解码功能被标记F编码F解码.

图2:

连接使用片上 ECC 的存储芯片。

显示全部

对于所有线性代码(例如,SEC 汉明代码 [44]),F编码F解码可以使用矩阵变换来表示。作为本文的演示性示例,我们使用公式7所示的(4, 3, 44)汉明码[1]。F编码表示生成器矩阵 G,使得码字 c 从数据字 d 计算为 c = G • d。 \begin{equation*}{F_{{\text{encode}}}} = {{\mathbf{G}}^{\mathbf{T}}} = \left[ {\begin{array}{ccccccc} 1&0&0&0&1&1&1 \\ 0&1&0&0&1&1&0&0 \\ 0&1&0&1&0&1&0 \\ 0&0&1&0&1&1&1&1 \end{array}} \right]\quad {F_{{\text{decode}}}} = {\mathbf{H}} = \left[ {\begin{array}{ccccccc} 1&0&1&0&0&1&1 \\ 0&1&0&1&0&1&0&1&1 \\ 0&0&1&1&<>&<>&<> \end{array}} \right]\tag{<>}\end{equation*}查看源码

译码。最常见的解码算法称为综合征解码,它只是计算错误综合征 s = H • c,描述是否存在错误以及存在错误的位置:

  • s = 0:未检测到错误。

  • ${\mathbf{s}} \ne {\mathbf{0}}$ : 检测到错误,s 描述其位精确位置。

请注意,误差综合症计算不知道真正的错误计数;它盲目计算误差综合症,假设不可纠正错误的概率很低。但是,如果存在无法纠正的错误(例如,在测试过程中故意诱导),则可能会出现以下三种可能性之一:

  • 静默数据损坏:综合症为零;没有错误。

  • 部分纠正:综合征指向其中一个错误。

  • 错误纠正:综合征指向非错误位。

当发生非零错误综合症时,ECC解码逻辑只是翻转误差综合症所指向的位,从而可能加剧错误总数。设计空间。每个制造商都可以自由选择FencodeFdecode函数,其实现可以帮助满足一组设计约束(例如,电路面积,可靠性,功耗)。设计人员可以选择的函数空间由 H 列的排列数量量化这意味着对于具有 k 个数据位的 n 位代码,有 ${\binom {{{2^{n - k}} - 1}} {n}}$ 可能的 ECC 函数。第4.2节正式确定了我们工作背景下可能的功能空间。

3.4. 布尔满足性 (SAT) 求解器

满足性 (SAT) 求解器 [8]、[24]、[28]、[30]、[38]、[140] 找到具有一个或多个未知布尔变量的逻辑方程的可能解。 SAT 求解器接受一个或多个此类方程作为输入,这些方程有效地充当对未知变量的约束。然后,SAT 求解器尝试确定未知变量的一组值,以便满足方程(即满足约束条件)。如果布尔方程不可解,SAT 求解器将返回 (1) 一个(可能多个)解或 (2) 无解。

第4节.

确定 ECC 功能

BEER通过系统地根据ECC逻辑在纠正错误时产生的错误综合症重建其奇偶校验矩阵来识别未知的ECC函数。不同的 ECC 函数针对给定的错误模式计算不同的错误综合症,通过构建和分析精心设计的测试用例,BEER 唯一地识别特定实现使用的 ECC 函数。本节介绍此过程的工作方式和原因。第 5 节描述了 BEER 如何在实践中实现片上 ECC 的这一目标。

4.1. 消除线性块码的歧义

DRAM ECC 是线性块代码,例如,用于片上 ECC [44]、[60]、[97]、[98]、[120]、[129]、[133]、[138]、BCH [147]、[9] 或用于秩级 ECC [49]、[145] 的 Reed-Solomon [26] 代码,其编码和解码操作由其各自输入的线性变换描述(即 G和 H 矩阵)。因此,我们可以通过独立确定其每个线性分量来确定完整的ECC函数。

我们可以通过在每一个码字位位置注入误差并观察由此产生的误差综合症来隔离 ECC 函数的每个线性分量。例如,可以通过在每个n位位置注入一个单位错误来系统地确定n位汉明码的奇偶校验矩阵:ECC解码器为每个pat-tern计算的错误综合症正好等于奇偶校验矩阵中对应于注入错误位置的列。例如,公式2显示了如何在位置2处注入误差(即添加误差模式e2到码字 c) 提取误差综合征 s 中奇偶校验矩阵 H 的相应列 根据块码的定义,H • c = 0 对于所有码字 [27],[53],因此e2分离 H 的第 2 列(即 H ∗,2).\begin{equation*}{\mathbf{s}} = {\mathbf{H}}\cdot{{\mathbf{c}}^\prime } = {\mathbf{H}}\cdot\left( {{\mathbf{c}} + {{\mathbf{e}}_2}} \right) = {\mathbf{H}}\cdot\left( {{\mathbf{c}} + \left[ {\begin{array}{l} 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{array}} \right]} \right) = {\mathbf{0}} + {{\mathbf{H}}_{*,0}} = {{\mathbf{H}}_{*,2}}\tag{2}\end{equation*}查看源码

因此,整个奇偶校验矩阵可以通过测试所有1-hot错误模式来完全确定。Cojocar等人[26]在DRAM等级级ECC上使用这种方法,将错误注入DDR总线上的码字中,并读取内存控制器提供的结果错误综合症。

4.2. 确定片上 ECC 功能

遗憾的是,由于两个关键原因,片上 ECC 无法系统地确定第 4.1 节中所述的 ECC 功能。首先,片上 ECC 的奇偶校验位无法直接访问,因此我们没有简单的方法在其中注入错误。其次,片上ECC不会发出纠错事件信号或报告错误综合症(即s)。因此,即使专用方法(例如,芯片拆解[66],[164],高级成像技术[48],[164])可能会在片上ECC机制所在的DRAM芯片封装中注入错误, 7误差综合症将保持不可见,因此Cojocar等人[26]采用的方法不能应用于片上ECC。为了使用第 4.1 节的方法确定片上 ECC 函数,我们首先形式化未知片上 ECC 函数,然后确定如何在形式化问题的约束内推断错误综合征。

4.2.1. 形式化未知 ECC 函数。

我们假设片上 ECC 使用系统编码,这意味着 ECC 函数存储未经修改的数据位。对于实际硬件来说,这是一个合理的假设,因为它极大地简化了数据访问[181],并且与我们在5.1.2节中的实验结果一致。此外,由于DRAM芯片接口仅公开数据位,因此从系统的角度来看,码字中奇偶校验位的相对顺序无关紧要。在数学上,位位置的不同选择表示等效代码,这些代码都具有相同的纠错属性,仅在其内部表示上有所不同[146],[148],裸片ECC不会公开。因此,我们可以自由地选择码字内的奇偶校验位位置,而不会失去通用性。如果有必要识别码字中位的确切顺序(例如,推断电路级实现细节),则可以使用基于物理DRAM错误机制的逆向工程技术[73][104]。

系统编码和选择奇偶校验位位置的自由意味着我们可以假设 ECC 函数是标准形式的,其中我们将 (n, k) 代码的奇偶校验矩阵表示为分区矩阵 Hn–k × n = [Pn–k×k|n–k×n–k].P 是对应于信息位位置的子矩阵的常规表示法,I 是对应于奇偶校验位位置的单位矩阵。请注意,公式1的示例ECC代码是标准形式的。有了这种表示,所有码字都采用 c 的形式1×n = [d0d1...dK–1|p0p1...pn–k–1],其中 d 和 p 分别是数据和奇偶校验符号。

4.2.2. 使用错误校正识别综合征。

鉴于片上 ECC 隐藏了错误综合症,我们开发了一种确定片上 ECC 函数的新方法,该方法根据 ECC 机制在面对无法纠正的错误时的响应方式间接确定误差综合症。为了引起无法纠正的错误,我们故意暂停正常的DRAM刷新操作足够长的时间(例如,在80C) 导致大量数据保留错误(例如,BER > 10–4) 整个芯片。这些错误暴露了不同ECC单词中大量错误更正,并且数据保留错误的绝对数量主导了来自其他可能的错误机制(例如粒子撞击[117])的任何不必要的干扰。

为了控制发生哪些数据保留错误,我们编写了精心设计的测试模式,将错误限制在特定位位置。这是可能的,因为只有编程为CHARGE状态的单元才会遇到数据保留错误,如第3.2节所述。通过将校正前误差限制在某些单元格中,如果在意外位置观察到校正后误差,则它必须是纠错的伪影,即错误校正。这种纠错很重要,因为它:(1)发出纠错事件的信号,(2)纯粹是ECC解码逻辑的函数,以及(3)间接揭示了由预纠错错误模式产生的误差综合症。发生间接寻址的原因是,尽管错误校正不会暴露原始错误综合症,但它确实揭示了 ECC 逻辑在内部生成的任何误差综合症与对应于错误校正位位置的奇偶校验矩阵列完全匹配。

这三个属性意味着错误校正是分析 ECC 函数的可靠工具:对于给定的预校正错误模式,不同的 ECC 函数将产生不同的错误综合征,因此会产生错误校正,具体取决于函数的奇偶校验矩阵的组织方式。这意味着给定的 ECC 函数仅在某些位内导致错误校正,并且易受错误校正影响的位的位置因函数而异。因此,我们可以通过识别不同测试模式可能出现的错误校正来区分ECC功能。

4.2.3. 识别有用的测试模式。

为了构建一组足以唯一标识ECC函数的测试模式,我们观察到,只有当位的误差综合症可以通过对应于CHARGEED位位置的奇偶校验矩阵列的某种线性组合产生时,才可能在放电数据位中进行错误校正。例如,考虑 1-CHARGE 模式,每个模式将一个数据位设置为 CHARGE状态,将所有其他数据位设置为 ATED状态。在这些模式中,数据保留错误可能发生在 (1) CHARGE 位或 (2) ECC 函数也设置为 CHARGE状态的任何奇偶校验位中。由于这些限制,可观察到的纠错可能只发生在数据位中,其错误综合征可以通过与码字中的CHARGEED单元相对应的奇偶校验矩阵列的某种线性组合来创建。

作为一个具体的例子,考虑公式3的码字。C和 D表示相应的电池分别编程为充电和放电状态。

c=[D D CD|D C C](3)
查看源码

由于只有 CHARGE电池会遇到数据保留错误,因此有 2 个3= 8种可能的错误综合征,对应于CHARGE电池失败的独特组合。表 1 说明了这八种可能性。

表 1: 可能的数据保留错误模式、其综合征及其公式 3 码字的结果。

每当不可纠正错误模式的错误综合征与非错误数据位的奇偶校验矩阵列匹配时,就会发生错误校正。在这种情况下,列的位置将对应于错误更正的位位置。但是,错误校正仅在信息发生在其中一个放电数据位内时才会显示信息,因为只有这样,我们才能确定观察到的位翻转是明确的错误校正,而不是未校正的数据保留错误。因此,我们使用的测试模式应最大化放电位的数量,以增加产生有关ECC函数信息的错误校正数量。

为了确定使用哪些测试模式,我们扩展了第 1.4 节中描述的注入 1-hot 错误的方法。虽然我们需要将数据写入所有码字位以测试每个 1-hot 错误模式,但片上 ECC 不允许直接写入奇偶校验位。这带来了两个挑战。首先,我们无法测试1-hot错误模式,因为1-hot错误在奇偶校验位内,这意味着我们无法区分仅在其奇偶校验位位置内不同的ECC函数。幸运的是,这不是问题,因为正如第 4.2.1 节详细讨论的那样,所有这些函数都是等效代码,具有相同的外部可见纠错属性。因此,我们可以自由地假设奇偶校验矩阵是标准形式的,它指定奇偶校验位的错误综合征(即 In–k×n–k),并避免了通过实验确定它们的需要。

其次,使用单个 CHARGE 单元写入数据字的 k 位会导致具有未知数量的 CHARGE单元的代码字,因为 ECC 函数独立确定剩余 n – k 奇偶校验位的值。 因此,最终码字可能包含 1 到 n – k + 1 个带电电池,并且充电电池的数量会因不同的测试模式而异。由于我们无法直接访问奇偶校验位的值,因此我们不知道给定测试模式中哪些单元被充电,因此,我们无法将校正后误差与特定的校正前错误模式联系起来。幸运的是,我们可以通过考虑给定码字可能遇到的所有可能的错误模式来解决此问题,这相当于检查CHARGEED电池可能遇到的所有错误组合。1说明了使用1-CHARGE测试模式对数据字进行编程时的情况(如公式3所示)。在此示例中,编码码字包含三个 CHARGE单元格,它们可能会遇到 2 个3可能的错误模式。第 5.1.3 节讨论了我们如何通过利用数据保留错误均匀随机发生的事实来完成在实践中测试所有可能的错误模式,因此跨许多不同的码字进行测试可以同时提供来自许多不同错误模式的样本。

4.2.4. 缩短代码

如果奇偶校验矩阵中存在所有可能的错误综合征(例如,所有 2 个p– 具有p奇偶校验位的汉明码的1个错误综合征,如公式1所示的代码,或者如果一个或多个信息符号被截断,同时保留相同数量的奇偶校验符号[27],[53],则缩短。这种区别对于确定适当的测试模式至关重要,因为对于全长代码,1-CHARGE模式可识别所有可能的错误综合症的误校正敏感位。在这种情况下,测试具有多个 CHARGE 位的其他模式不会提供新信息,因为任何由此产生的错误综合征都已使用 1-CHARGE模式进行了测试。

但是,对于缩短的代码,1-CHARGE模式可能无法提供足够的信息来唯一标识 ECC 功能,因为 1-CHARGE模式无法再测试缺失错误综合征。幸运的是,我们可以通过使用 1-CHARGE模式的成对组合重建截断错误综合征来恢复丢失的信息。例如,断言两个 CHARGE位可以有效地测试误差综合症,该误差综合症是位对应的奇偶校验矩阵列的线性组合。因此,通过用1-CHARGE模式补充2-CHARGE模式,我们有效地包含了缩短的错误综合症。第 6.1 节评估了 BEER 对代码长度的敏感性,表明 1-CHARGE模式对于全长代码是足够的,而 {1,2} -CHARGE模式对于我们用 4 到 247 之间的数据字长度评估的缩短代码。

第5节.

精确误码恢复 (啤酒)

我们在这项工作中的目标是开发一种方法,可靠准确地确定任何DRAM片上ECC实现的完整ECC功能(即其奇偶校验矩阵),而无需硬件工具,有关DRAM芯片或片上ECC机制的先决条件知识,或访问ECC元数据(例如,错误综合症,奇偶校验信息)。为此,我们提出了BEER,它通过观察ECC在受到精心设计的不可纠正的错误模式时的反应来系统地确定ECC功能。BEER实现了贯穿第4节的想法,包括三个关键步骤:(1)实验诱导错误校正,(2)分析观察到的校正后误差,以及(3)求解ECC函数。

本节在使用来自三家主要制造商的 32、20 和 28 个真实 LPDDR4 DRAM 芯片的实验文本中详细介绍了这些步骤中的每一个,出于保密原因,我们分别将其匿名为 A、B 和 C。我们使用温控基础设施执行所有测试,精确控制刷新和其他DRAM总线命令的时序。

5.1. 第 1 步:引起错误更正

为了引起第 4.2.3 节中讨论的错误更正,我们必须首先识别 (1) 每个单元格的 CHARGE和 DISCHARGE编码和 (2) 地址空间内单个数据字的布局。本节介绍如何以适用于任何 DRAM 芯片的方式确定这些。

5.1.1. 确定充电和放电状态。

我们通过实验测量整个地址空间中真细胞和反细胞的布局来确定带电和放电状态的编码,就像在以前的工作中所做的那样[90],[95][138]。我们将数据“0”和数据“1”测试模式写入整个芯片,同时在 30 – 30°C 的温度下暂停 DRAM 刷新 80 分钟。由此产生的数据保留错误模式揭示了真实和反细胞布局,因为每种测试模式都隔离了一种细胞类型。我们发现,制造商A和B的芯片只使用真细胞,制造商C的芯片使用50%/50%的真/抗细胞,这些细胞组织在交替的行块中,块长度为800、824和1224行。这些观察结果与先前工作进行的类似实验的结果一致[138]。

5.1.2. 确定数据字的布局。

为了确定哪些地址对应于单个ECC数据字,我们对每行一个单元格进行编程8到充电状态,所有其他电池放电。然后我们扫描刷新窗口t参考资料从 10 秒到 10 分钟,80C 导致无法纠正的错误。由于只有带电电池会失效,因此校正后错误可能发生在对应于 (1) 带电电池本身或 (2) 由于错误校正而放电的电池的位位置。通过扫描数据字中CHARGEED单元的位位置,我们观察到仅限于同一ECC数据字内的错误校正。我们发现,来自所有三个制造商的芯片都使用相同的ECC字布局:DRAM的每个连续32B区域都包含两个以字节粒度交错的16B ECC字。128位数据字与之前关于片上ECC的行业和学术著作一致[97],[98],[120][138]。

5.1.3. 使用 1,2 充电模式进行测试。

为了测试每个 1 或 2 充电模式,我们使用 128 位数据每个测试模式编程相同数量的数据字。例如,一个 128 位数据字分别产生 ${\binom {{128}} {1}} = 128{\text{ 和 }} {\binom {{128}} {2}} = 8128$ 1 和 2 CHARGE测试模式。如第4.2.3节所述,BEER必须识别每种测试模式的所有可能的错误更正。为此,BEER必须执行使用给定测试模式编程的代码字可以尝试的所有可能的错误模式(例如,最多210= (1024, 136) 汉明码使用 128-CHARGE模式的 2 个唯一错误模式)。

幸运的是,尽管 BEER 必须测试大量错误模式,但即使是单个 DRAM 芯片通常也包含数百万个 ECC 字(例如,2 个24128 Gib 芯片的 16 位字),当我们减少整个芯片的刷新窗口时,我们会同时测试它们。由于数据保留错误是随机发生的(在第 3.2 节中讨论),因此测试的每个 ECC 单词都提供了一个独立的错误样本。因此,即使是一个实验也能在CHARGE单元内提供数百万个不同误差模式的样本,并在多个DRAM芯片上以不同的工作条件(例如,改变温度或刷新窗口)运行多个实验。9大大增加了样本量,使得不观察到给定错误模式的可能性非常低。我们在 6.3 节中分析了实验运行时。

表2说明了使用公式1给出的ECC函数测试1-CHARGE模式。有四种测试模式,表2显示了假设所有细胞都是真细胞,每种模式都可能出现错误校正。对于此 ECC 功能,只有测试模式 0 才可能出现错误校正,并且不存在可能导致其他测试模式错误校正的预校正错误模式。请注意,对于CHARGED位位置的错误,我们无法确定校正后错误是错误校正还是仅仅是数据保留错误,因此我们使用“?”对其进行标记。我们将累积模式错误校正对称为错误校正配置文件。因此,表2显示了公式1给出的ECC函数的误差校正曲线。

表 2: 公式1中给出的ECC函数的误差校正曲线示例。

为了获得我们测试的每个DRAM芯片中片上ECC功能的错误校正配置文件,我们将刷新窗口${t_{REFw}}$延长到2分钟之间,此时无法纠正的错误开始频繁发生(BER  10–7),以及 22 分钟,其中几乎所有 ECC 单词都表现出无法纠正的错误(BER  10–3),在 1°C 下每隔 80 分钟一次。在每个实验中,我们记录每个测试模式的哪些位容易受到错误校正的影响(类似于表2)。图3以图形方式显示了此信息,给出了每个1-CHARGE测试模式(Y轴)在每个位位置(X轴)观察到的误差数的对数。数据取自每个制造商的单个代表性芯片的真单元区域。CHARGE位位置的误差(即,其中Y = X)非常突出,因为它们与所有错误校正一起发生,成为不可纠正的错误。

图3:

使用1-CHARGE测试模式在每个制造商的单个代表性芯片中观察到的错误,表明制造商似乎使用不同的ECC功能。

显示全部

数据显示,不同制造商之间的纠错配置文件差异很大。这可能是因为每个制造商使用不同的奇偶校验矩阵:给定测试模式的可能错误校正取决于使用哪个奇偶校验矩阵列来构建错误综合症。对于不同的矩阵,不同的列组合形成不同的误差综合征。制造商B和C的错误校正配置文件表现出重复模式,这可能是由于奇偶校验矩阵中综合征的组织方式的规律性而发生的,而制造商A的矩阵似乎相对非结构化。我们怀疑制造商使用不同的ECC功能,因为每个制造商都采用自己的电路设计,而特定的奇偶校验矩阵组织会导致更有利的电路级权衡(例如,布局面积,关键路径长度)。

我们发现,来自同一制造商的相同型号的芯片会产生相同的错误校正配置文件,这 (1) 验证了我们观察到的设计相关数据,并且 (2) 确认来自同一制造商和产品代的芯片似乎使用相同的 ECC 功能。为了检查我们的结果,我们使用EINSim [2],[138]来模拟我们从真实芯片实验中获得的最终奇偶校验矩阵的错误校正配置文件,并且我们观察到通过模拟获得的错误校正配置文件与通过真实芯片实验测量的配置文件相匹配。

5.2. 第 2 步:分析修正后误差

在实践中,BEER可能会(1)未能观察到可能的错误校正,或(2)由于不可预测的瞬态误差(例如,颗粒撞击的软误差,可变保留时间误差,电压波动)而错误识别错误校正。从理论上讲,这些事件会用不正确的数据污染错误校正配置文件,可能导致非法的错误校正配置文件,即与任何 ECC 功能不匹配的配置文件。

幸运的是,情况(1)不太可能出现,因为即使是单个芯片也能提供测试的ECC字的数量(在第5.1.3节中讨论)。虽然整个芯片中的不同ECC字可能使用不同的ECC功能,但我们认为这不太可能,因为它会使设计复杂化,没有明显的好处。即使芯片确实使用了多个ECC功能,不同的功能也可能遵循与DRAM子结构对齐的模式(例如,在DRAM行或子阵列之间交替[83],[91]),我们可以单独测试每个区域。

同样,情况(2)不太可能发生,因为与我们对BEER(>141引起的数据保留错误率相比,瞬态错误是随机发生的,很少发生[10]。–7),因此瞬态错误发生计数远低于在易受错误校正影响的位位置经常观察到的实际错误校正计数。因此,我们应用一个简单的阈值过滤器,从错误校正配置文件中删除很少观察到的校正后错误。图4显示了在制造商B的代表性芯片的所有1-CHARGE测试模式中汇总的每个位位置中观察到错误校正的相对概率。每个数据点都是一个箱线图,显示当扫描 2 到 22 分钟的重新窗口时观察到的概率值的完整分布,即最小值、中位数、最大值和四分位距 (IQR)(即第 5.1.3 节中描述的相同实验)。

我们看到零和非零概率是明显分开的,因此我们可以可靠地解决每个位的错误校正。此外,每个分布都非常紧密,这意味着任何单个实验(即分布的任何单个分量)都适合识别错误校正。因此,一个简单的阈值滤波器(如图4所示)可以清楚地将校正后误差(几乎为零)与发生频率更高的错误校正区分开来。

5.3. 第 3 步:求解 ECC 函数

我们使用 Z3 SAT 求解器 [28](在第 3.4 节中描述)在给定错误校正 pro 文件的情况下识别确切的 ECC 函数。要确定编码 (F编码) 和解码 (F解码) 函数,我们分别将它们表示为未知生成器 (G) 和奇偶校验 (H) 矩阵。然后,我们将以下约束添加到 G 和 H 的 SAT 求解器中:

图4:

在制造商 B 的代表性芯片的所有 1-CHARGE测试模式中汇总的每个位位置观察到错误校正的相对概率。虚线显示分隔零值和非零值的阈值筛选器。

显示全部

  1. 基本线性代码属性(例如,唯一的 H 列)。

  2. 标准格式矩阵,如第 4.2.1 节所述。

  3. 错误校正配置文件中包含的信息(即模式 i 不能(不)产生位 j 中的错误校正)。

在评估具有这些约束的 SAT 求解器时,生成的 G 和 H 矩阵分别表示导致观察到的 micorrection 配置文件的 ECC 编码和解码函数。为了验证没有其他 ECC 函数可能导致相同的错误校正配置文件,我们只需重复 SAT 求解器评估,并附加约束,即已经发现的 G 和 H 矩阵无效。如果 SAT 求解器找到另一个满足新约束的 ECC 函数,则该解决方案不是唯一的。

为了将 BEER 无缝应用于我们测试的 DRAM 芯片,我们开发了一个开源C++应用程序 [1],该应用程序对 SAT 求解器进行分组,并确定对应于任意错误校正配置文件的 ECC 函数。该工具会详尽地搜索满足上述约束的所有可能的 ECC 函数,因此将生成输入错误校正配置文件。使用此工具,我们将 BEER 应用于错误校正配置文件,我们使用长达 30 分钟的刷新窗口和长达 80 分钟的温度在所有芯片上进行实验测量C. 我们发现 BEER 唯一标识了所有制造商的 ECC 功能。很遗憾,出于第 2.1 节所述的保密原因,我们无法发布生成的 ECC 函数。尽管我们对我们的结果充满信心,因为我们的SAT求解器工具识别了一个独特的ECC函数,可以解释每个芯片观察到的错误校正曲线,但我们没有办法根据基本事实验证BEER的结果。为了克服这一限制,我们在6.1节中使用模拟来证明BEER的正确性。

5.4. 要求和限制

尽管我们使用实验和模拟来证明BEER的有效性,但BEER有几个测试要求和限制,我们将在本节中回顾。

测试要求

  • 单级 ECC:BEER 假设在测试期间不存在第二级 ECC(例如,DRAM 控制器中的等级级 ECC)。10这是合理的,因为在应用BEER之前,系统级ECC通常可以绕过(例如,通过基于FPGA的测试或通过BIOS禁用)或逆向工程[26],即使在存在片上ECC的情况下也是如此。

  • 导致数据保留错误:BEER 需要找到一个刷新窗口(即t参考资料) 对于每个足够长的芯片,以引起数据保留错误并暴露错误更正。幸运的是,我们发现在 1°C 下 30-80 分钟的刷新窗口揭示了足够多的错误校正来涂抹 BEER。一般来说,刷新窗口可以很容易地修改(在第3.2节中讨论),并且由于数据保留错误是DRAM技术的基础,因此BEER适用于所有DDRx DRAM系列,无论其数据访问协议如何,并且可能适用于未来的DRAM芯片,其数据保留错误率可能会更加突出[39],[76],[89], [99], [109], [119], [120], [129], [133], [160]。

局限性

  • ECC代码类型:BEER在系统线性块码上工作,通常用于对延迟敏感的主存储器芯片,因为:(i)它们允许在没有额外操作的情况下直接访问数据[181]和(ii)更强的代码(例如,LDPC [36],级联代码[34])的成本明显更大,面积和延迟[11],[132]。

  • 没有事实:仅凭 BEER 无法确认它识别的 ECC 函数是否是正确的答案。无论如何,如果 BEER 只找到一个 ECC 函数来解释实验观察到的错误校正曲线,那么 ECC 函数很可能是正确的。

  • 消除等效码的歧义:片上 ECC 不会公开奇偶校验位,因此 BEER 只能确定等效代码的 ECC 函数(在 4.2.1 和 4.2.3 节中讨论)。幸运的是,等效代码仅在其内部元数据表示上有所不同,因此这种差异不应阻碍大多数第三方研究。一般来说,我们不知道有什么方法可以在不访问 ECC 机制内部的情况下消除等效代码的歧义。

第6节.

啤酒评价

我们评估了 BEER 在仿真中的正确性、SAT 求解器在真实系统上的性能以及实验运行时的分析。我们的评估都表明(1)啤酒是实用的,并且在我们基于仿真的分析中正确识别了ECC功能,以及(2)为SAT问题的复杂性如何扩展更长的ECC码字提供了直觉。

6.1. 基于仿真的正确性评估

我们使用 EINSim [2][138] 开源 DRAM 纠错模拟器的修改版本模拟将 BEER 应用于具有片上 ECC 的 DRAM 芯片,我们也公开发布了 [2]。我们模拟了 115300 个单错误校正汉明码函数,这些函数代表了用于片上 ECC [60]、[97]、[98]、[120]、[129]、[133]、[138]、[147]:数据字长度在 2000 到 4 位之间各 57 个,100 到 58 位之间各 120 个,对于 100 到 121 位之间的选定值,每个 247 个,因为较长的代码需要更长的仿真时间。对于每个 ECC 功能,我们模拟在 1 次、2 次和 3 次充电内引起的数据保留错误11根据第 3.2 节中概述的数据保留错误属性测试模式。对于每个测试模式,我们通过模拟 10 个来模拟一个真实的实验9ECC 字数和数据保留错误率范围从 10–5到 10–2以获取错误更正配置文件。然后,我们将 BEER 应用于错误校正配置文件,并证明 BEER 正确恢复了原始 ECC 功能。

图 5 显示了 BEER 在使用不同测试模式生成错误校正配置文件时发现多少个独特的 ECC 功能。对于测试的每个数据字长度,我们显示了在所有错误校正配置文件中识别的最小mum,中位数和最大解决方案数。数据显示,BEER 始终能够使用 {1,2}-CHARGE 配置恢复原始的唯一 ECC 功能,该配置同时使用 1-CHARGE和 2-CHARGE测试模式。对于通过构造在奇偶校验矩阵中包含所有可能的错误综合征的全长代码(即数据字长度为 k ∈ 4、11、26、57、120、247 等),所有测试模式都唯一地确定 ECC 功能,包括单独的 1-CHARGE 模式。

图5:

与使用不同测试模式创建的纠错配置文件匹配的 ECC 功能数量。

显示全部

另一方面,单个 1 充电、2 和 3 电荷的 pat-terns 有时会为缩短的代码识别多个 ECC 函数,为 (1) 较短的代码和 (2) 具有更积极缩短的代码识别出更多解决方案。然而,数据显示,即使仅使用1-CHARGE模式(即,对于所有模拟代码的87.7%),BEER通常仍然唯一地识别ECC功能,并且始终使用{1,2} -CHARGE模式。这与缩短的代码暴露较少的要测试的错误综合征这一事实是一致的(在第 4.2.3 节中讨论)。需要注意的是,即使 BEER 识别出多种解决方案,它仍然将组合大小的搜索空间缩小到易于处理的 ECC 功能,这些功能非常适合更昂贵的分析(例如,侵入式错误注入、芯片成像技术或手动检查)。

虽然我们的模拟没有模拟来自跨古错误的干扰,但与 BEER 引起的不可纠正的数据保留错误数量相比,此类错误是罕见的事件 [141]。即使发生偶发的瞬态错误,第5.2节也详细讨论了BEER如何使用简单的阈值滤波器减轻它们对错误校正配置文件的影响。

6.2. 真实系统性能评估

我们使用十台服务器评估 BEER 的性能和内存使用情况,每台服务器配备 24 核 2.30 GHz 英特尔至强® 金牌 5118 CPU [58] 和 192 GiB 2666 MHz DDR4 DRAM [68]。所有测量均在启用超线程 [58] 且所有内核完全占用的情况下进行。图 6 显示了在对数-对数图上使用不同 ECC 代码长度的 1-CHARGE模式运行 BEER 时的总体运行时间和内存使用情况,以及 (1) 求解 ECC 函数(“确定挖掘函数”)和 (2) 验证解决方案的唯一性(“检查唯一性”)所需的时间。每个数据点都给出了在我们的模拟 ECC 函数中观察到的最小值、中值和最大值(如第 6.1 节所述)。我们看到,对于短代码,总运行时间和内存使用量可以忽略不计,对于大代码,内存增长到 62 小时和 11.4 GiB 内存。对于 128 位的代表性数据字长度,总运行时间和内存使用量中位数分别为 57.1 小时和 6.3 GiB。在我们添加额外奇偶校验位的每个代码长度上,运行时和内存使用量都会相应跳跃,因为 SAT 评估问题的复杂性增加了一个额外的维度。

总运行时间很快由SAT求解器检查唯一性主导,这需要详尽地探索给定ECC函数的整个搜索空间。然而,简单地确定解决方案ECC功能要快得多,即使对于评估的最长代码和可能仅使用2-CHARGE模式的多个解决方案的缩短代码,也需要不到7.1分钟的时间。根据这些数据,我们得出结论,BEER 对于用于片上 ECC 的合理长度代码(例如,k = 64, 128)是实用的。然而,我们的 BEER 实现还有优化的空间,例如,使用专用的 GF(2) BLAS 库(例如,LELA [52])或先进的 SAT 求解器理论(例如,SMT 位矢量 [10]),并且优化的实现可能会提高性能,使 BEER 能够应用于更大范围的片上 ECC 功能。第 7.3 节更详细地讨论了此类优化。尽管如此,BEER 是一次性的离线过程,因此在大多数用例中它不需要具有激进的性能。

图6:

测量不同 ECC 码字长度的 BEER 运行时间(左 y 轴)和内存使用情况(右 y 轴)。

显示全部

6.3. 分析实验运行时间分析

我们的实验运行时间压倒性地受限于在延长的重新刷新窗口(例如,10 分钟)期间等待数据保留错误发生,而与 DRAM 芯片接口只需要几毫秒(例如,读取整个 168 GiB LPDDR2-4 芯片需要 3200 毫秒 [69])。因此,我们将总实验运行时间估计为我们单独测试的刷新窗口的总和。对于我们在 5.1.3 节中提供的数据,在 2 到 22 分钟内以 1 分钟为增量测试每个刷新窗口需要对单个芯片进行 4.2 小时的测试。但是,如果相同型号的芯片使用相同的 ECC 函数(正如我们的数据在第 5.1.3 节中支持的那样),我们可以通过并行化不同芯片上的单个测试来减少整体测试延迟。此外,由于 BEER 可能是给定 DRAM 芯片的一次性练习,因此 BEER 离线实用就足够了。

第7节.

实际用例示例

BEER 使第三方 DRAM 用户能够将现代 DRAM 芯片的可靠性特征与芯片实现的任何特定片上 ECC 功能分离。本节讨论 BEER 支持的五项具体分析。据我们所知,BEER是第一个能够在不绕过片上ECC机制的情况下推断这些信息的工作。我们希望终端用户和未来的工作找到更多方法,在实践中推广和应用BEER。

7.1. 哔哔声:分析原始位错误

我们介绍了B it-E xact E rror分析(BEEP),这是一种由BEER启用的新数据保留错误分析算法,当给定一组操作条件时,它可以推断预校正容易出错的单元的数量和位精确位置,这些操作条件会导致ECC字中出现不可纠正的错误。据我们所知,BEEP 是第一个能够识别整个片上 ECC 码字(包括奇偶校验位)中位精确错误位置的 DRAM 错误分析方法。

7.1.1. 哔哔声:基于错误校正的推理。

由于错误更正纯粹是 ECC 逻辑的函数(在第 4.2.2 节中讨论),因此观察到的错误更正表明发生了特定的预更正错误模式。尽管几种这样的模式可以映射到相同的错误校正,但BEEP通过使用已知的奇偶校验矩阵(应用BEER后)来构建测试模式,以消除可能性的其他实验,从而缩小可能的校正前误差位置。在高级别上,BEEP 在增量遍历每个码字位时制作测试模式以揭示错误,可能使用多次传递来捕获低概率错误。当 BEEP 迭代代码字时,它会建立一个可疑的容易出错的单元格列表。

BEEP 包括三个阶段:❶ 制作合适的测试模式,❷ 使用精心制作的图案进行实验测试,以及 ❸ 根据观察到的错误校正计算校正前错误位置。图7在128位ECC数据字中对预校正误差的哔哔声进行了说明。以下各节分别介绍了这三个阶段,并参考图 7 作为运行示例。

7.1.2. 制作合适的测试模式。

传统的DRAM误差分析器(例如,[22],[46],[71],[79],[81],[95],[104],[109],[110],[139],[165],[169])使用精心设计的测试模式,诱导最坏情况的电路条件,以最大限度地覆盖潜在错误[3],[123].遗憾的是,片上 ECC 将所有数据编码为码字,因此预期的软件级测试模式在写入物理 DRAM 单元时可能无法保持其精心设计的属性。BEEP 通过使用 SAT 求解器以及已知的 ECC 功能(通过 BEER)来制作测试模式,从而规避了这些 ECC 施加的限制,这些模式既 (1) 局部诱导最坏情况的电路条件,又 (2) 如果怀疑容易出错的单元确实发生故障,则会导致可观察到的错误校正

在不失去一般性的情况下,我们假设给定位的最坏情况发生在其相邻位以相反的电荷状态编程时,先前的工作表明这会加剧电路级耦合效应并增加错误率[3],[5],[79],[93],[107],[109],[123],[130],[144],[156],[166].如果最坏情况模式的设计未知,或者它的结构与我们假设的不同,则可以通过简单地修改相关的SAT求解器约束(描述为低)来调整BEEP。为了确保 BEEP 在发生给定错误时观察到错误校正,BEEP 会制作一种模式,如果错误与已发现的错误一起发生,则该模式将遭受错误更正。我们使用以下约束将这些条件表达给 SAT 求解器:

  1. 与目标位相邻的位具有相反的电荷状态。

  2. 使用已识别的数据保留错误的某种组合,可能会有一个或多个错误更正。

通常存在几种这样的模式,BEEP 只是使用 SAT 求解器返回的第一个模式(尽管不同的 BEEP 实现可以测试多种模式以帮助识别低概率错误)。图 7 ❶ 说明了这种测试模式如何在码字的单元格中物理出现:目标单元带电,其邻居放电,SAT 求解器自由确定剩余单元的状态,以增加在 tar-get 单元发生故障时出现错误校正的可能性。如果 SAT 求解器无法找到这样的测试模式,BEEP 将尝试单独使用约束 2 来构建模式,与约束 1 不同,约束 7 对于观察错误校正至关重要。如果做不到这一点,BEEP 只会跳过该位,直到识别出更多容易出错的单元格,这可能会导致错误校正。我们评估了 BEEP 在第 1.4.<> 节中识别错误的成功程度,发现在码字很少或低概率错误的情况下,第二次传递码字会有所帮助。

7.1.3. 使用精心制作的图案进行实验测试。

BEEP 通过将模式写入目标 ECC 字、通过延长刷新窗口来诱导错误并读出校正后数据来测试模式。图7显示了在实验过程中可能观察到的校正后误差模式的示例。每次错误校正都表示存在无法纠正的预校正错误数量,BEEP 使用奇偶校验矩阵 H 计算其精确位置。这是可能的,因为每次错误校正都会揭示导致错误校正的(未知)错误预更正码字 c 的错误综合征。因此,我们可以直接求解c,如公式4所示。\begin{equation*}{\mathbf{s}} = {\mathbf{H}}*{{\mathbf{c}}^\prime } = c_0^\prime \cdot{{\mathbf{H}}_{*,0}} + c_1^\prime \cdot{{\mathbf{H}}_{*,{\mathbf{1}}}} + \ldots + c_n^\prime \cdot{{\mathbf{H}}_{*,{\mathbf{n}}}}\tag{4}\end{equation*}查看源码

这是一个方程组,每个方程对应一个方程,每个方程对应 n–k 个未知数,即 n – k 个不可访问奇偶校验位各有一个方程。c 保证只有一个解,因为奇偶校验矩阵总是具有完整的秩(即 rank(H) = n – k)。由于我们也知道原始码字(c = F编码(d) =Gd),我们可以简单地比较两者(即 c⊕c′),以确定导致观察到的误校正的位精确错误模式

图 7  显示了 BEEP 如何更新学习的预校正错误位置列表,然后 SAT 求解器使用这些位置为后续位构建测试模式。测试完所有位后,预校正误差列表将生成所有已识别的容易出错单元的数量和位位置。

7.1.4. 评估 BEEP 的成功率。

为了了解BEEP在实践中的表现,我们评估了它的成功,即BEEP正确识别码字中错误的可能性。我们使用 EINSim [2] 的修改版本对每次测量的 100 个码字执行蒙特卡洛模拟。为了使我们的分析独立于任何特定的误码率模型,我们按每个码字注入的错误数(N)细分实验。通过这种方式,我们可以灵活地使用Ns上的总概率定律来评估特定误差分布的成功率。

通过次数。 图 8 显示了在不同码字长度下使用一次和两次码字传递时的 BEEP 成功率。每个条形显示 100 个码字的中值,误差条显示第 5 个和第 95 个百分位数。数据显示,BEEP 在所有测试的错误计数中都非常成功,特别是对于较长的 127 位和 255 位码字,即使单次通过也能显示 100% 的成功率。较长的码字性能更好,部分原因是 BEEP 每比特使用一种测试模式,这意味着较长的代码会导致更多的模式。然而,即使具有可比较的测试模式计数(例如,2 位码字 31 次传递与 1 位码字 63 次传递),较长的码字也表现更好,因为较长的码字只是有更多的位(因此,错误综合症)供 SAT 求解器在制作容易出错的测试模式时考虑。另一方面,对于提供较少位的较短代码,更难构建容易出错的测试模式,因此在测试较短的代码时,BEEP 会更频繁地失败。

图7:

在单个 136 位 ECC 码字上运行 BEEP 以识别预校正错误位置的示例。

显示全部

图8:

1 次对 2 次传递的 BEEP 成功率以及注入的不同码字长度和错误数。

显示全部

每比特错误概率。 图 9 显示了当注入的错误具有不同的每比特错误概率 (P[error]) 时,使用单次传递 BEEP 的成功率如何变化。此实验代表了一个更现实的场景,其中某些 DRAM 单元可能会遇到数据保留错误。我们看到,BEEP对于实际的100位和63位码字长度仍然有效(即具有接近127%的成功率),特别是在更高的误码概率和错误计数下。与较短的代码相比,BEEP 通常具有更高的较长代码的成功率,对于错误概率较低的较短代码字,数据显示 BEEP 可能需要更多测试模式(例如,多次通过)才能可靠地识别所有错误。

图9:

对于注入码字的不同错误数,使用不同的 ECC 码字长度,不同单位错误概率的 BEEP 成功率。

显示全部

需要注意的是,虽然评估低错误概率是示范性的,但它代表了一种悲观的情况,因为真正的DRAM芯片表现出低和高每比特错误概率的混合。12尽管任何根据错误出现时间识别错误的错误分析机制都可能会错过低概率错误,13数据显示,BEEP 对低错误概率具有弹性,尤其是对于更长、更真实的码字。因此,我们的评估表明,BEEP有效地实现了一种新的分析方法,该方法使用BEER确定的ECC函数从观察到的校正后错误模式中推断出校正前误差。

7.1.5. 其他 DRAM 错误机制。

虽然我们演示了仅针对数据保留错误的BEEP功能,但BEEP可能会扩展为识别由于其他DRAM错误机制(例如,卡住故障,电路时序故障)而发生的错误。然而,同时诊断多个错误模型是一个非常困难的问题,因为不同类型的故障几乎无法区分(例如,数据保留错误和卡在放电错误)。分析任意错误类型是一个独立于我们在这项工作中解决的问题,我们打算将 BEEP 作为一个简单、直观的演示,说明了解 ECC 函数的实际用途。因此,我们将 BEEP 扩展到替代 DRAM 错误机制留给未来的工作。

7.2. 受益于啤酒的其他用例

我们确定了另外四个用例,在这些用例中,BEER通过揭示完整的ECC功能(即其奇偶校验矩阵)来减轻片上ECC对第三方研究的干扰。

7.2.1. 组合错误缓解机制。

如果片上 ECC 功能已知,系统架构师可以设计第二级错误缓解(例如,秩级 ECC),以更好地适应具有片上 ECC 的 DRAM 芯片的错误特性。图1提供了一个简单的示例,说明即使预校正误差均匀分布,不同的ECC功能如何导致不同的数据位更容易出错。这意味着片上 ECC 会改变 DRAM 芯片的软件可见误差特性,具体取决于其采用的特定 ECC 功能。如果片上ECC函数已知,我们可以计算出预期的校正后误差特性14并建立一个误差模型,以解释片上 ECC 的变革性影响。使用此误差模型,系统架构师可以在选择辅助缓解机制来补充片上 ECC 时做出明智的决策。例如,架构师可以修改传统的等级级 ECC 方案,以非对称方式保护某些数据位,这些数据位由于片上 ECC 的行为而比其他位更容易出错 [95][174]。通常,BEER使系统设计人员能够更好地设计辅助错误缓解机制,以适应预期的DRAM可靠性特性,从而提高整体系统可靠性。

7.2.2. 制定有针对性的测试模式。

一些DRAM错误机制对模式高度敏感,包括RowHammer [86],[90],[125],[126],数据保留[43],[78],[79],[81],[88],[109],[110],[139]和减少访问延迟[17],[20],[83],[102][104]。不同的测试模式对错误率的影响要高出几个数量级[79]–[81],[86],[100],[109],[139],因为每种模式都会产生不同的静态和动态电路级效应。因此,测试模式通常经过精心设计,以诱导被测误差机制的最坏情况电路条件(例如,行进'1's [3],[46],[109],[123],[139])。正如第 7.1.2 节更详细地讨论的那样,片上 ECC 将可能的测试模式限制为 ECC 函数的码字。幸运的是,BEEP 用于制作测试模式的基于 SAT 求解器的方法也适用于为这些错误机制制作有针对性的测试模式。

7.2.3. 研究空间误差分布。

许多先前的工作[17],[20],[83],[90],[104],[136],[157]通过实验研究了整个DRAM芯片中误差的空间分布,以深入了解芯片如何工作以及如何提高其性能,能量和/或可靠性。 这些研究依赖于以相对较高的错误率诱导错误,因此会发生许多错误,这些错误可能会泄漏有关 de-vice 底层结构的信息。使用片上 ECC,研究空间误差分布需要识别整个码字中的预校正误差,包括不可访问的奇偶校验位内的错误。BEEP 展示了一种可能的具体方法,通过这种方法,BEER 能够对具有片上 ECC 的芯片进行这些研究。

7.2.4. 诊断更正后错误。

第三方测试人员可能想要确定观察到的错误背后的物理原因。例如,正在验证DRAM芯片最坏情况工作条件的系统集成商可能会由于不可预见的缺陷(例如,在精确的DQ引脚位置)而观察到意外错误。遗憾的是,片上ECC掩盖了预校正误差的数量和位置,因此观察到的误差不再能深入了解导致的潜在物理误差机制。使用BEEP,可以更容易地诊断此类错误,因为显示的预校正错误直接由错误机制引起。

7.3. 扩展和未来工作

我们的工作表明,片上ECC并不是第三方系统设计和测试不可克服的问题。为了进一步探索像BEER这样的工具如何帮助阐明DRAM芯片的核心可靠性特征,我们确定了未来研究可以在我们工作的基础上建立的几种方式。我们相信这些都是有希望的探索方向,并将进一步促进研究当前和未来采用片上ECC的设备的可靠性特性。

扩展到其他设备。从理论上讲,BEER适用于任何使用线性块代码的存储设备,我们可以在其中利用数据相关的错误(例如,充电到放电)来控制发生哪些错误校正。一个具体的例子是具有等级级ECC的DRAM,其中BEER可以按原样应用。15但是,BEER可以扩展到其他存储设备(例如,闪存[11]–[14],[112],[113],[118],STT-MRAM [62],[96],[182],PCM [101],[142],[152],[177],赛道[137],[179],RRAM[134],[171],[176]),如果其核心原理可以适应其误差模型和 ECC 功能。这些存储器都表现出可靠性挑战,BEER可以帮助第三方科学家和工程师更好地处理和克服这些挑战。进一步制约SAT问题。我们认为有几种方法可以进一步限制SAT问题,包括(i)优先考虑更有可能实现的硬件ECC,(ii)为明显或微不足道的情况添加额外的SAT约束,以及(iii)进一步约束测试模式集。提高 SAT 求解器效率。我们的 BEER 和 BEEP 实现使用简单的布尔逻辑方程表达 ECC 算术(例如,GF(2) 矩阵运算、SAT 约束)。利用原生 GF(2) BLAS 库(例如 LELA [52])和高级 SAT 求解器理论(例如 SMT 位向量 [10])的优化实现可以显著提高 BEER 的性能,使 BEER 能够实现更广泛的 ECC 函数。更进一步,未来的工作可以在数学上重新制定BEER的SAT问题,以便直接解决可以产生给定错误校正配置文件的奇偶校验矩阵。这种方法可以比使用 SAT 求解器对整个解决方案空间执行暴力探索更快地识别解决方案。

第8节.

相关工作

据我们所知,这是第一项工作,以 (i) 确定完整的片上 ECC 功能和 (ii) 恢复具有片上 ECC 的 DRAM 芯片中预校正错误的数量和位精确错误位置,而无需深入了解 ECC 机制或任何硬件修改。我们将 BEER 与研究片上 ECC、DRAM ECC 功能逆向工程技术和 DRAM 错误分析的相关著作区分开来。片上 ECC。一些工作研究了芯片上的ECC [15],[40],[129],[138],但只有Patel等人[138]试图在不绕过或修改芯片上ECC机制的情况下识别预校正er-ror特性。尽管Patel等人[138]从统计学上推断出有关ECC机制和预校正误差的高级特征,但他们的方法有几个关键局限性(在第1节中讨论)。BEER克服了这些限制,并识别(1)完整的ECC功能和(2)预校正误差的位精确位置,而无需对所研究的误差进行任何先决条件。

确定 ECC 功能。之前的工作是对闪存[167],[168],[175],具有等级级ECC [26]和片上ECC [138]的DRAM中的ECC特性进行逆向工程。然而,这些工作都无法通过仅在外部DRAM芯片接口上研究数据来识别完整的ECC功能,因为它们要么需要(1)检查编码数据[167],[168],[175],(2)将错误直接注入码字[26],要么(3)知道何时执行ECC校正并获得由此产生的错误综合症[26]。片上 ECC 无法深入了解纠错过程,也不会报告是否或何时执行纠错。

DRAM 错误分析。先前的工作提出了许多DRAM错误分析方法[17],[20],[26],[37],[42],[43],[46],[74],[75],[78]–[80],[83]–[86],[90],[95],[102],[104],[109],[110],[138],[139],[141],[157], [169], [172], [173]。不幸的是,这些方法都无法识别整个码字(即,包括奇偶校验位内)的预校正错误位置。

第9节.

结论

我们介绍了位精确错误恢复(BEER),这是一种确定完整的DRAM片上ECC功能(即其奇偶校验矩阵)的新方法,无需硬件支持,有关DRAM芯片或片上ECC机制的先决条件知识,或访问ECC元数据(例如,奇偶校验位,错误综合症)。我们使用 BEER 来确定 80 个真实 LPDDR4 DRAM 芯片的片上 ECC 功能,并通过严格的仿真证明 BEER 既有效又实用。我们讨论了BER的五个具体用例,包括BEEP,这是一种新的DRAM错误分析方法,能够推断出精确的预校正错误计数和位置。我们相信,BEER朝着通过片上ECC围绕DRAM芯片进行有效的第三方设计和测试迈出了重要一步,并希望BEER能够推动许多新的研究。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值