![]() |
1
13
我已经测试了超过20年的板,今晚是第一次听到这个三月测试或算法。看着它,当我看到一个名字应用于常识时,我很不安,好像这个人或团体发明了常识。 不管怎样,想想你说要测试的东西。理想情况下,板级测试是测试焊料和PCB板、制造项目,而不是设计验证,也不是芯片验证。芯片应该已经过测试的供应商,你应该只需要做一个理想的快速功能。在内存的情况下,尽管测试每个位单元是很常见的,但如果时间允许,sram你可能有时间,进入千兆字节的dram,如果你尝试测试每个位,你会看到每个板上有几个小时到几天的时间。 所以你想在理想情况下摆动每个管脚,基本的功能测试,比如用1填充所有地址0xFFF…,用0填充,用0x5s填充,用0xAs填充。0x6s、0x9s、0xCs和0x3s,如果您愿意的话。棋盘格,同样是那些交替的模式,每隔一个地址填充0x5s,每隔一个地址填充0xAs,等等,然后对于串扰,填充走1和走0。0x00..001、0x00…002、0x00…004等,然后0xff..ffe、0xff..ffd等。 这一切都很好,但假设你有工作地址位。如果说所有的地址线都断了,那么上面的大多数测试都会通过。如果只有最低有效地址位起作用,那么上述所有测试都将通过,这取决于内存的大小以及您如何驱动可能浪费数小时的测试。 您需要知道的另一件事是数据总线的大小。如果这是一个32位处理器,但使用16位数据总线,而您正在进行32位步行测试,那么您只需步行16位(而不是32位)就要花费两倍的时间。或者32位处理器上的64位数据总线(例如,具有72位内存的平均32位桌面),您还没有涵盖所有友好的位组合。如果您所做的只是内存总线宽度的一半或四分之一,那么宽内存接口可能不会使用所有的数据线。 一个常见的快速地址测试是用地址填充内存。你必须在每个地址的位置加入一个独特的模式。 以上涵盖了大部分明目张胆,焊锡不良,提针,浮球的问题。(许多人只是将这些标记为三月测试显然)如果内存引脚支持不同大小的内存,你可能没有击中所有的地址位,但你真的没有什么可以做的,这可能无关紧要,因为把最大大小的内存可能涉及焊料,这意味着板重新测试无论如何。
这些低速测试不会涵盖阻抗,但这是一个棘手的。如果可以的话,需要上下调节内存总线的速度,并创建非常低级别的、理想的手工组装测试,以最大速度推动内存总线,只要你能忍受,每个时钟周期都要读或写。如果你的处理器或处理器中的外设(dma等)无法维持这些速率,那么不管芯片中最快的东西是什么…好吧,你可以走得最快,你需要让那东西做它能做的最长的运行,最快的爆发。这不一定包括阻抗,你可能无法完全测试阻抗没有把范围内的每一个跟踪每一块板。快走可能会发现一些更明显的阻抗问题,以及体积电容等。一个棋盘与所有的一到所有的零可能有助于地面反弹和体积电容以及。
我已经在很大程度上放弃了上面的大部分测试,并从伪随机测试中获得了很多里程数。使用一个LFSR,它创建的唯一数比我要测试的内存位置数多,例如,这个16位的1应该在重复之前产生2到16的幂减去2个唯一数。减2是因为lfsr不会操作或生成所有1或所有0的数字,所以在播种时请记住这一点。 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位单元抽头表的链接,这些抽头在重复不同的移位器长度之前产生最大数量的模式。上面的一个工作,但有点无聊你想翻转更多的数据位,而不仅仅是移动它们。 使用你自己的随机化器比使用图书馆的随机化器要好。从一台计算机到另一台计算机,从一个操作系统到另一个操作系统,从一个编译器到另一个编译器,从同一系统上的操作系统或编译器版本,库都会发生变化。使用您自己的测试,您将确保测试不会随着时间的推移而改变其属性,即使驱动它的主机系统会这样做。这就是为什么像lfsr这样的东西是好的,它可能不是一个伟大的随机数发生器,用于对计算机进行纸牌游戏,但是对于在数据总线上用一点点快速执行的代码创建可重复的混沌数据模式,它是伟大的。如果没有自制的随机化器,我将避免所有基于随机化器的测试。
缓存和缓存测试是一场噩梦。片上测试应该遵循这样的规则:这不是芯片验证测试,也不是设计验证测试,这是制造测试。如果你有数据缓存,并在它的另一边测试ram,你可能是自欺欺人,可能需要在读通过之前执行写通过次数。理想情况下,您希望打开高速缓存以便测试快速运行,但希望禁用被测内存区域的高速缓存。这提醒我,一个常见的错误是只在执行测试的软件没有使用的内存上执行所有这些测试(假设这个板有一个处理器,sram是处理器的执行内存),特别是让软件从零内存或低内存运行,这意味着大多数程序占用的内存区域最多它们的时间运行没有经过测试,而位于程序空间和堆栈之间的块(使用频率较低)是测试最多的块,另外没有测试所有的地址位,因为您可能会猛击堆栈。对这样的系统进行内存测试简直是浪费时间,你不这么认为吗?如果你不相信内存会费心去测试它,你就不能相信在内存中运行的测试程序的结果。理想情况下,您希望从rom或片上暂存存储器执行,这样就可以完全测试整个内存总线。 ECC内存是另一个噩梦,设计良好的ECC内存和内存控制器将允许您寻址所有位,包括ECC标签,允许您测试一切以及ECC系统本身,单位和多位错误。如果您没有访问权限,那么即使是阳性测试,如果您正费心尝试测试芯片内的每一位,那么对于每一行,您需要确保内存测试套件至少打开和关闭所有ecc位一次,对于标签中的每一位,它在一个时间点与所有其他位一起测试,和关闭与其他每一位(不一定在同一时间)开。具有分支预测功能的现代处理器完全有权随意读取任何内存位置,因此您的测试可能会意外地读取带有故意植入的单个位错误的内存位置,从而导致该位被修复,当您的测试到达该位置时,您可能会失败,因为您没有看到预期的单位错误,而实际上系统运行正常。奇偶校验与ecc相似,只是没有ecc那么糟糕。
抱歉发了这么长的帖子,我希望它对某人有用。。。 |
![]() |
mg610 · 如何开始C++单元测试 2 年前 |
![]() |
vidhu · 无URL的自动化测试 2 年前 |
![]() |
Aessandro · js开关站单元测试[关闭] 6 年前 |
![]() |
AntoineLB · 断言后期工作Django 6 年前 |
|
ravikant · Selenium脚本不工作异常 6 年前 |