【问题标题】:Software memory testing for bus failures总线故障的软件内存测试
【发布时间】:2013-12-17 08:11:05
【问题描述】:

我有一块带有很多闪存芯片的电路板,其中一些显示出间歇性故障。标准内存测试没有显示任何具体的问题解决方案,除了某些芯片在机械和热应力下间歇性失效。

怀疑实际连接而不是闪存单元本身,我正在寻找一种方法来测试并行总线的地址或数据引脚错误。

有一些内存测试,但它们更适用于 RAM 而不是闪存 (http://www.ganssle.com/testingram.htm)。具体来说,并行闪存具有一系列总线写入来写入每个值;写入/验证失败很容易是写入操作,它可能是总线上的任何引脚。

欢迎提出想法...

【问题讨论】:

    标签: testing embedded bus flash-memory industrial


    【解决方案1】:

    典型的内存测试就是为了做到这一点。对于 0xAA、0x55、0xFF、0x00 测试,我更喜欢伪随机化器(使用 lfsr 确定性)。这允许在两次通过(反向重复)中进行地址总线测试和数据总线测试。我说的是典型的摆动数据位和地址位各自的状态并改变信号及其邻居的状态。撞击 ram 会产生热应力或其他应力,您无法快速写入闪存,因此您无法真正实现快速的写入/读取周期。

    Flash 会产生另一个问题,即先写然后读回不是很有趣,您想在几小时、几天、几周后写回读回,以确定该部件是否实际保存数据。

    当您说热或应力时,您的意思是仅在高于 X 度的时间内它会失效,或者您的意思是由于热应力,它在事件发生后一直被破坏。机械方面也是如此,在振动或承受机械应力时,零件会失效,但当消除该应力时,一切正常,或者机械应力造成了永久性损坏,可以在压力下检测到与否。

    现在,尽管您无法进行快速的写入/读取周期,但您可以通过大量读取来惩罚闪存。我已经通过不断地读取一个块或位置看到了读取干扰问题。不一定是你有时间为每个位置做的事情,但你可能会用伪随机模式填充内存并专注于一个位置一段时间(几分钟,几十分钟),如果你有一个你知道的部分是坏的看看这是否加速了问题的检测,以及是否有任何位置可以工作或只有某些地方可以工作。然后另一件事是重复读取所有位置数小时/数天,或者让它静置数小时/天/周,然后在不擦除或写入的情况下进行读取,看看它是否丢失了任何东西。

    不幸的是,您可能知道每个新的失败案例都有自己的研究项目和新测试的开发。

    【讨论】:

    • 故障是间歇性的,到目前为止,当机械应力停止时,故障就停止了。
    • 至少在使用标准内存测试技巧之一的失败期间,您可以尝试识别失败的连接,如果您同时有一个错误的地址位和一个错误的数据位,或者其他同时故障的组合,除了“它坏了”之外,更难确定其他任何东西。具有良好地址位的多个数据位很容易确定坏数据位通道,同样可以确定单个地址位...您可能知道所有这些但不确定您在追求什么...
    【解决方案2】:

    测试内存的第一步是数据总线测试0 0 0 0 0 0 0 • 在这个测试中,数据总线接线正确测试到0 0 0 0 0 0 0 确认处理器放置在数据总线上的值0 0 0 0 0 0 0 被另一端的存储设备正确接收0 0 0 0 0 0 00 0 0 0 0 0 0 • 一个明显的测试方法是写入所有可能的0 0 0 0 0 0 0 数据值并验证0 0 0 0 0 0 0 • 每个位都可以独立测试• 进行走1s 测试,写入表中给出的第一个数据值,通过读回验证,写入第二个值,验证等等。 • 当您到达表格末尾时,测试完成

    【讨论】:

      【解决方案3】:

      在链接的文章中,Jack Ganssle 说:“对于这个 [测试] 以及所有其他 RAM 测试算法来说,关键在于在执行读取测试之前将模式写入所有 RAM。”

      由于读取应该与写入隔离,因此测试闪存更容易。在系统没有压力的情况下执行测试的写作部分。然后在系统承受压力的情况下执行读取部分。通过在足够多的错误情况下记录地址、期望值和实际值,您应该能够确定错误的来源。

      如果系统在执行上述操作时从未出现故障,那么您可以在压力下执行整个测试。出现的任何错误很可能是写入错误。

      【讨论】:

        【解决方案4】:

        我决定设计一种内存模式,我认为我可以从中推断出数据和地址错误。这个概念是使用显着不同的值作为可能的读取错误的关键指标。这个概念也是一次检测一个引脚上的故障。

        测试将仅从底部和顶部地址交替读取(0x000000 和 0x3FFFFF - 我的芯片有 22 条地址线)。在这些位置,我将分别放置 0xFF 和 0x00(字节宽)。这个想法是翻转所有地址和数据线,看看会发生什么。 (闪存中所有其他值至少有 3 位不同于 0x00 和 0xFF)

        有 44 个地址,单个引脚故障可能会将我发送到错误的地址。在每个地址中放置 22 个值中的一个来表示 22 个地址引脚中的哪一个被翻转。每一个都是 2 位互不相同,3 位与 00 和 FF 不同。 (我尝试了 3 位彼此不同,但 8 位只能得到 14 个值)

                07,0B,0D,0E,16,1A,1C,1F,25,29,2C,
                2F,34,38,3D,3E,43,49,4A,4F,52,58
        

        剩下的地址我放了一个很好的模式,六个值 33,55,66,99,AA,CC。 (与所有其他值不同 3 位)value(address) = nicePattern[ sum of bits set in address % 6];

        我对此进行了测试,并统计收集了 100 次与机械应力同步的间歇性故障事件。

        • 可检测到单位错误
        • 可推断出双位错误(可通过频繁的单位错误组合来解释)
        • 3 位或更多位错误(通常不确定)

        尽管有些芯片有 3 个失效引脚,但 70% 的事件是单比特的(它们通常不会同时失效)

        测试组现在使用它来确定哪些特定连接失败。

        【讨论】:

          猜你喜欢
          • 2010-10-04
          • 1970-01-01
          • 1970-01-01
          • 2017-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多