2010-09-16 70 views
3

我正在寻找一种内存测试算法,这将有助于我的团队在生产过程中验证设计和测试(坏焊接,交叉连接的地址/数据线,不匹配的阻抗,镜像等)。3月内存测试算法的实现

我读过例如3月C或类似的是我们祈祷的答案,但我还没有找到一个这样的算法的实现,我们可以借。

+1

详细伪这里:http://www.datasheetarchive.com/Indexer/Datasheet-075/DSAE004445.html – 2010-09-16 18:50:05

+0

@belisarius:这正是我所需要的,它的写作和组织很好。不幸的是,许可协议中规定“仅用于MicrochipdsPIC®”,所以它不能与我的i.MX25合法使用... – 2010-09-16 19:47:16

+0

对不起。没有检查:( – 2010-09-16 22:08:47

回答

9

我一直在测试板超过20年,今晚是第一次听到这个3月测试或算法。看着它,让我感到困惑的是,看到一个名字适用于常识,就好像这个人或小组发明了常识一样。

无论如何,想想你说你想测试的东西。理想的电路板级测试是测试焊料和印刷电路板,制造项目,而不是设计验证,而不是芯片验证。该芯片应该由供应商进行测试,并且理想情况下您只需要做一个快速功能。对于存储器来说,虽然无论如何测试每个位单元是很常见的,但是时间允许,sram你可能有时间,进入千兆字节的dram,并且如果你尝试测试每个位,则每个电路板需要几个小时到几天的时间。

所以你想摆动每个引脚的理想,基本的功能测试,如用所有的0xFFF ...填充所有地址,填充零,用0x5填充0xAs填充。 0x6s和0x9s以及0xC和0x3s,如果你这么倾向。棋盘格,再次用这些交替图案填充每个其他地址的0x5s和其他所有与0xAs等,然后串扰行走的人和步行零。 0x00..001,0x00 ... 002,0x00 ... 004等,然后0xff..ffe,0xff..ffd等

这是一切都很好,但假设你有工作地址位。如果说所有的地址线都被破坏了,大部分上述测试都会通过。如果只有最不重要的地址位工作,那么所有上述测试都会通过,并且取决于存储器的大小以及如何驱动可能浪费几个小时的测试。

你需要知道的另一件事是你的数据总线的大小。如果这是一个32位处理器,但是使用16位数据总线,并且您正在进行32位步进测试,则您花费了两次太多时间,只需要走16位而不是32位。或者,64位数据总线32位处理器(例如,72位内存的平均32位桌面),您尚未涵盖所有友好的位组合。如果你所做的只是内存总线宽度的一半或四分之一,宽存储器接口可能无法使用所有的数据线。

一个常见的快速地址测试是用其地址填充内存。你必须在每个地址位置放置一个独特的模式。

以上内容涵盖了大部分明显,不良的焊料,提升的针,浮球问题。 (很多人会明显地将这些三月测试标记出来)如果内存引脚分支支持不同大小的内存,你可能没有达到所有的地址位,但是你没有办法做到这一点,这可能没有关系,因为把最大内存可能涉及焊料,这意味着无论如何都会重新测试电路板。

上面有很多测试,如果您在每个位置编写并运行它们中的每一个,则可能需要一段时间。假设目标是制造测试,而不是在芯片测试中,一种简单的方法是使用素数跳过地址。而不是每个内存位置都使用每257个内存位置,并让您的测试更快完成。除2之外的素数通常会摆动每个地址位。对于步行测试,你只需要测试一个内存位置而不是整个内存,这可以加快速度。棋盘,两个位置(目标是检查数据总线上的状态变化)。

这些低速测试不会覆盖阻抗,但这是一个棘手的问题。如果可以的话,需要在存储器总线速度上上下旋钮,并创建非常低的水平,理想的手动组装测试,以最大速度推动存储器总线,只要你能站立,每个时钟周期都进行读或写操作它。如果你的处理器或者处理器中的外设(dma等)不能支持这些速率,那么无论芯片中最快的事情是什么......以及最快的你可以去,你需要让这件事做最长的运行它可以做的最快的爆发。这不一定会覆盖阻抗,如果不在每个电路板的每个轨迹上放置一个示波器,您可能无法完全测试阻抗。快速发展可能会发现一些更明显的阻抗问题以及大容量电容等问题。全1到全0的棋盘可以帮助地面反弹和大容量电容。

另外请注意,进行缓慢是非常重要的。高速和高容量测试不包括电路板上的噪声,电路板或设计不良,并且可以轻松通过所有内存测试。您可能想要进行一些特意慢的测试,例如允许写入闪烁信号,如果您对附近的痕迹执行测试,但对内存痕迹执行测试则更好。填充内存,稍等一会,再读一遍,看看是否有一些写入隐藏了。你提到了sram,对于dram来说,慢速测试对于确保刷新正在工作很重要,或许填充了独特的模式,稍等片刻,回读一下,用独特模式的倒数来填充每一位,稍等片刻,回读一遍。

我大部分时间都放弃了大部分上述测试,并从伪随机测试中获得了很多里程。使用一个LFSR创建比我想测试的内存位置数量更多的唯一数字,例如,这个16位的数字应该在重复之前产生两个到16的电源减去两个唯一的数字。减二是因为lfsr不会操作或生成全部为1或全为零的数字,请记住这一点。

 
unsigned int fastprand16 (unsigned int prand) 
{ 
    // 16 bit lfsr bits 16,14,13,11 
    if(prand&1) 
    { 
     prand>>=1; 
     prand^=0x0000B400; 
    } 
    else 
    { 
     prand>>=1; 
    } 
    return(prand&0x0000FFFF); 
} 

维基百科已链接lfsr位单元抽头表,在重复各种移位器长度之前产生最大数量的模式。上面的工作但有点无聊,你想要翻转更多的数据位,而不仅仅是移动它们。

使用自己的随机数发生器比使用库中的发生器要好。该库从计算机到计算机,从操作系统到编译器到编译器的操作系统,以及同一系统上的操作系统或编译器的版本。即使主系统驱动,测试也不会随着时间的推移而改变其属性。这就是为什么像lfsr这样的东西很好,它可能不是一个很棒的随机数发生器,用于在计算机上玩纸牌游戏,但为了在数据总线上创建可重复的混沌数据模式并使用一小段快速执行的代码,它就是大。如果没有自制程序随机数发生器,我会一起避免基于随机数发生器的测试。

例如,如果您需要执行快速BIST,例如您可以填充与prand数字回读的内存,填入与相同prand数字相反的内容,回读。或者首先进行一次普查测试,以清除明显不好的电路板,然后执行三月份测试,也许地址测试例外。或者您可以每次执行数千次/每次更改种子的普遍传球。了解你的lfsr模式的属性,你可以选择使用模式中的下一个随机数作为下一次内存传递的种子。或者如果你想成为理想的人,你可以使用第二个lfsr产生种子,随着时间的推移创造出每种可能的种子。

缓存和缓存测试是一场噩梦。在芯片上应该遵循这个规则,这不是芯片验证测试,也不是设计验证测试,这是一个制造测试。如果你打开了数据缓存并正在测试另一侧的RAM,那么你可能会自欺欺人,可能需要在读取通过之前执行写入通过次数。理想情况下,您希望启用缓存,以便您的测试运行速度很快,但希望禁用要测试的内存区域的缓存。这让我想起了一个常见的错误是,只对未被执行测试的软件使用的存储器执行所有这些测试(假设该板卡具有处理器,sram是处理器执行存储器),特别是使该软件运行从零或低内存开始,这意味着大多数程序大部分时间都在运行的内存区域没有经过测试,而程序空间和堆栈之间的中间区块,使用较少的是经过最多测试的,并且不会测试所有地址位,因为你可能会猛击堆栈。几乎浪费时间来做这样的系统的任何内存测试,你不觉得吗?如果你不信任内存来测试它,你就不能相信在那个内存中运行的测试程序的结果。理想情况下,您希望从ROM或片上暂存内存执行,以便可以全面测试整个内存总线。

ECC内存是另一个噩梦,精心设计的ecc内存和内存控制器将允许您处理所有位,包括ecc标签,允许您测试ecc系统本身以及单个和多个位错误。如果你没有访问权,那么即使对于正面的测试,如果你正在努力测试芯片内的每一个位,那么对于每一行你都需要确保一组内存测试打开和关闭至少所有ecc位一次以及标签中的每一位都会在一个时间点关闭所有其他位,然后关闭其他位(不一定在同一时间)。具有分支预测功能的现代处理器完全有权随意读取任何内存位置,因此您的测试可能会意外地通过故意植入的单个位错误读取内存位置,导致该位被修复,并且在您的测试获得时间如果实际系统运行正常,您可能会失败,因为您没有看到预期的单比特错误。奇偶校验与ecc类似,但并不差。

关于电路板测试的另一件事是,如果说你想测试每个芯片的所有位以及所有的PCB走线和焊点和电缆。不需要很长时间来查看外设,或者查看处理器本身的指令集(如果您有一个指令集),并且发现即使在2ghz的情况下,您甚至可能会在数百亿年前查看第一个芯片的外部引脚(从内向外工作)。你不能也不会测试所有的东西,选择低挂的水果,等待用户(希望在家里的软件/ bsp开发者)找到未知的问题,然后为这些特定的问题创建新的测试。你可能有完美的游行内存测试,但它仍然不会发现间歇性的硬盘问题。即使在烧伤的情况下,我也看到零件在几个月后失效。远远超过板/部件的预期婴儿死亡率。底线,没有一种尺寸适合所有解决方案,你必须调整普通或流行或个人最喜欢的做法与特定的电路板/芯片的功能,并能够调试和创建新的测试。您还需要主动强制设计工程师设计测试。如果有产品召回,这是你的头(测试工程师),他们会在他们面前滚动。

很抱歉的长期职位,我希望它是有用的人......

+1

非常感谢分享你的智慧。后期肯定教会了我们很多(尽管我们没有得到我们希望的实现链接)。干杯。 – 2010-09-17 18:18:06