我正在寻找一种内存测试算法,可以帮助我的团队在生产过程中验证设计和测试(焊接不良,交叉连接地址/数据线,阻抗不匹配,镜像等).
我已经读过,例如March C或类似的是我们祈祷的答案,但我还没有找到一个我们可以借用的算法的实现.
old*_*mer 10
我已经测试了20多年的电路板,今晚是第一次听到这个3月的测试或算法.看着它,让我感到困扰的是看到一个名字应用于常识,好像那个人或团体发明了常识.
无论如何,想想你说要测试的事情.理想地,板级测试是测试焊料和PC板,制造的物品,而不是设计验证和NOT芯片验证.该芯片应该已经过供应商的测试,理想情况下您应该只需要快速功能.在存储器的情况下,虽然通常测试每个位单元,但是时间允许,sram你可能有时间,进入千兆字节的dram,如果你试着测试每个位,你会看到每个板数小时到几天.
因此,您希望理想地摆动每个引脚,基本的功能测试,如填充所有地址0xFFF ...,填充零,填充0x5s填充0xAs.0x6s和0x9s和0xCs和0x3s,如果你是这样的倾向.棋盘,再次使用那些交替模式用0x5s填充每个其他地址,并用0xAs等填写每个其他地址.然后对于串扰,步行和行走零.0x00..001,0×00 ...... 002,为0x00 ... 004,等等.然后0xff..ffe,0xff..ffd等.
这一切都很好,但假设你有工作地址位.如果说所有的地址线被打破最上面的测试会通过.如果只有最不重要的地址位工作,那么所有上述测试都会通过,并且取决于memmory的大小以及如何驱动可能浪费数小时的测试.
您需要知道的另一件事是数据总线的大小.如果这是一个32位处理器但是使用16位数据总线并且你正在进行32位步进测试,那么你花了两倍太多时间只需要走16位而不是32位.或者是64位数据总线32位处理器(平均32位桌面,例如72位内存)你没有涵盖所有友好的位组合.如果你所做的只是内存总线宽度的一半或四分之一,宽内存接口可能无法运行所有数据线.
常见的快速地址测试是用其地址填充内存.您必须在每个地址位置放置一个独特的模式.
以上内容涵盖了大部分明显,不良焊料,提升销,浮球问题.(很多人会只标注这些三月测试显然)如果内存引脚排列支持不同尺寸的回忆,你可能没有打所有的地址位,但有真正地不是任何你可以做的,它可能并不重要,因为把最大尺寸记忆可能涉及焊料,这意味着无论如何都要重新测试电路板.
上面有很多测试,如果你在完整的内存空间中的每个位置编写和运行它们,它可能需要一段时间.减少它的一种简单方法,假设目标是制造测试不在芯片测试中,是使用素数跳过地址.例如,而不是每个内存位置使用每257个内存位置,并使测试完成得更快.2以外的素数通常会摆动每个地址位.对于步行测试,您实际上只需要测试一个内存位置而不是整个内存,这可以加快速度.一个棋盘,两个位置(目标是检查数据总线上的状态变化).
这些低速测试不会覆盖阻抗,这是一个棘手的问题.需要打开向上和向下的内存总线速度旋钮,如果你能,并创造非常低的水平,最好是手工组装的测试,以最大速度推内存总线,一个读或写在每个时钟周期持续,只要你受得了它.如果你在你的处理器(DMA等)处理器或外设无法维持这些利率,那么无论在芯片速度最快的是......嗯最快的,你可以去,你需要得到的东西做的最长运行它可以做的最快的爆发.这不一定涵盖阻抗,如果不在每个电路板的每个迹线上放置示波器,您可能无法完全测试阻抗.快速发展可能会发现更明显的阻抗问题以及大容量电容等问题.
还要注意,进展缓慢非常重要.高速和高容量测试不能覆盖电路板上的噪声,可能有不良的电路板或设计,并且很容易通过所有内存测试.您可能希望进行一些故意慢的测试,例如允许写选通出现故障,如果您对附近的迹线执行测试而不是对内存迹线执行测试则更好.填写内存,稍等一下,读回,看看是否有些写在悄悄.你提到的SRAM,DRAM的缓慢的测试是非常重要的,以确保刷新的工作,或许与别致的图案填充,稍等一会儿,回读,填充独特模式的反转来翻转每一位,等待一段时间,回读.
我大部分时间都放弃了上述大部分测试,并从伪随机测试中获得了很多好处.使用LFSR创建比我想要测试的内存位置数更多的唯一数字,例如,这个16位的数据应该在重复之前产生两个功率16减去两个唯一数字.减号是因为lfsr不会操作或生成全部或全部为零的数字,请在种子时记住这一点.
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);
}
Wikipedia具有lfsr位单元抽头表的链接,这些表在重复各种移位器长度之前产生最大数量的模式.上面的一个工作,但有点无聊,你想要翻转更多的数据位,而不仅仅是移动它们.
使用自己的随机数发生器比使用库中的随机发生器更好.库从一个计算机到另一个计算机从操作系统变为操作系统,从编译器到编译器,以及同一系统上的os或编译器版本.使用您自己的,您将确保测试不会随着时间的推移改变其属性,即使主机系统驱动它.这就是为什么像lfsr这样的好东西,它可能不是一个很好的随机数生成器,用于对抗计算机的纸牌游戏,但是为了在数据总线上用一小段快速执行的代码创建可重复的混乱外观数据模式,它是大.如果没有自制的随机数发生器,我会一起避免基于随机数的测试.
例如,如果您需要执行快速BIST,您可以使用回读的prand数字填充内存,填写相同prand数字的倒数,然后回读.或者首先进行prand测试以清除明显不好的电路板,然后执行March测试,可能除了地址测试之外.或者相反,你每次都可以通过改变种子来执行许多/数千次平移通行证.了解lfsr模式的属性后,您可以选择使用模式中的下一个随机数作为下一次内存传递的种子.或者为了理想,您可以使用第二个lfsr来生成种子,随着时间的推移创建每个可能的种子.
缓存和缓存测试是一场噩梦.芯片上应遵循的规则不是芯片验证测试,也不是设计验证测试,这是制造测试.如果你有数据缓存,并且正在测试ram的另一端你可能自欺欺人,可能需要在读取通过之前执行写入传递次数.理想情况下,您希望缓存打开,以便您的测试快速运行,但希望禁用正在测试的内存区域的缓存.这提醒我,一个常见的错误是仅对执行测试的软件未使用的内存执行所有这些测试(假设该板具有处理器且sram是处理器执行内存),特别是运行该软件从零或低内存,意味着大多数程序花费大部分时间运行的内存区域,没有经过测试,并且程序空间和堆栈之间的中间块(经常使用较少)是最经过测试的,加上没有测试所有地址位,因为你可能会进入堆栈.几乎浪费时间来为像你认为的那样的系统进行任何内存测试?如果你不相信内存来打扰测试它,你就不能相信在那个内存中运行的测试程序的结果.理想情况下,您希望从rom或片上暂存内存执行,以便可以完全测试整个内存总线.几乎浪费时间来为像你认为的那样的系统进行任何内存测试?如果你不相信内存来打扰测试它,你就不能相信在那个内存中运行的测试程序的结果.理想情况下,您希望从rom或片上暂存内存执行,以便可以完全测试整个内存总线.几乎浪费时间来为像你认为的那样的系统进行任何内存测试?如果你不相信内存来打扰测试它,你就不能相信在那个内存中运行的测试程序的结果.理想情况下,您希望从rom或片上暂存内存执行,以便可以完全测试整个内存总线.
ECC内存是另一个噩梦,精心设计的ecc内存和内存控制器将允许您处理所有位,包括ecc标签,允许您测试所有内容以及ecc系统本身,单位和多位错误.如果您没有访问权限,那么即使是正面测试,如果您正在尝试测试芯片内的每一位,那么对于每一行,您需要确保内存测试套件至少打开和关闭所有ecc位对于标签中的每个位,一次以及在一个时间点关闭所有其他位进行测试,并且在每个其他位(不一定在同一时间)开启时关闭.具有分支预测的现代处理器完全有权随意读取任何内存位置,因此,您的测试可能会意外地读取内存位置,故意植入单位错误,导致该位被修复,并且当您的测试到达该位置时,您可能会失败,因为您没有看到预期的单位错误,实际上系统运行正常.奇偶校验类似于ecc并不是那么糟糕.
关于电路板测试的另一个问题是,如果你想测试每个芯片中的每个位以及所有pcb走线和焊点和电缆.查看外围设备或查看处理器本身的指令集(如果你有一个机载)并不需要很长时间,并且发现即使在2ghz时,你可能会看到数百亿年甚至达到第一个芯片的外部引脚(从里到外工作).你不能也不会测试一切,选择低悬的果实,等待用户(希望在内部软件/ bsp开发人员中)找到不可预知的问题,然后为这些特定问题创建新的测试.你可能有完美的行军记忆测试,它仍然不会发现间歇性的sram问题.即使有烧伤我已经看到几个月后部件失效.
最重要的是,没有一种尺寸适合所有解决方案,您必须使用特定电路板/芯片的功能调整常见或流行或个人喜爱的实践,并能够即时调试和创建新测试.您还需要主动强制设计工程师进行测试设计.如果有产品召回,那么你的头(测试工程师)会在他们面前滚动.
对不起,很长的帖子,我希望它对某人有用...