- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种存储器测试算法,可以帮助我的团队在生产过程中验证设计和测试(不良焊接,地址/数据线交叉连接,阻抗不匹配,镜像等)。
我读过例如3月C或类似的答案是我们祈祷的答案,但是我还没有找到一种我们可以借用的算法的实现。
最佳答案
我已经对板进行了20多年的测试,并且今晚是第一次听到3月的测试或算法。看着它,让我感到困扰的是,看到一个应用于常识的名称,好像那个人或团体发明了常识一样。
无论如何,请考虑一下您说要测试的内容。理想情况下,板级测试是测试焊料和线路板,制造项目,不进行设计验证以及不进行芯片验证。该芯片应该已经由供应商测试过,理想情况下,您只需要执行快速功能即可。对于存储器而言,尽管无论如何还是要测试每个位单元是很普遍的,只要时间允许,就可以抽空,进入千兆字节的dram,如果尝试测试每个位,则每板需要花费数小时至数天的时间。
因此,您希望理想地摆动每个引脚,基本的功能测试,例如用0xFFF ...填充所有地址,用0填充,用0x5s填充用0xAs填充。 0x6s和0x9s以及0xCs和0x3s(如果您这样倾斜)。棋盘格,再用那些交替的模式,每个其他地址都填充0x5,每个其他地址都填充0xA,依此类推。然后,对相隔的步数和步零进行串扰。 0x00..001、0x00 ... 002、0x00 ... 004等,然后是0xff..ffe,0xff..ffd等。
很好,但是假设您有工作地址位。如果说所有地址线都断了,那么上面的大多数测试都将通过。如果只有最低有效地址位起作用,则以上所有测试都会通过,并且取决于内存的大小以及您如何进行测试,这可能会浪费数小时。
您需要知道的另一件事是数据总线的大小。如果这是32位处理器,但使用16位数据总线,而您正在执行32位步行测试,则您花费了太多时间,只需要步行16位而不是32位。或者在64位数据总线上32位处理器(例如,平均32位台式机具有72位内存)没有涵盖所有友好的位组合。如果您所做的只是内存总线宽度的一半或四分之一,那么宽内存接口(interface)可能不会占用所有数据线。
常见的快速地址测试是使用其地址填充内存。实际上,您必须在每个地址位置中放置一个唯一的模式。
以上内容涵盖了大多数明显的,不良的焊锡,提起的销钉,浮球的问题。 (许多人显然只是将这些标签标记为3月的测试)。如果内存引脚支持不同大小的内存,您可能并没有击中所有地址位,但实际上您无能为力,这并不重要,因为放置最大大小的内存可能涉及焊料,这意味着无论如何都要对板进行重新测试。
上面有很多测试,如果您在整个内存空间的每个位置上编写并运行每个测试,则可能需要一段时间。假设目标不是制造测试而不是芯片测试,一种简单的减少方法是使用质数跳过地址。而不是每个内存位置都使用257个内存位置,例如,让您的测试更快地完成。除2以外的质数通常会摆动每个地址位。对于步行式测试,您实际上只需要测试一个内存位置而不是整个内存,就可以加快速度。棋盘格,两个位置(检查数据总线上状态变化的目标)。
这些低速测试虽然不能覆盖阻抗,但这是一个棘手的问题。如果可能的话,需要调高和调低内存总线速度的旋钮,并创建非常低的水平,理想的手工组装测试,以最大速度插入内存总线,只要您能站立,每个时钟周期的读或写操作都应持续进行它。如果您的处理器或处理器中的外围设备(dma等)无法维持这些速率,那么无论芯片中最快的东西是什么……您可以走的最快,并且您需要使该东西执行最长的运行时间。它可以做的最快的爆发。那不一定会覆盖阻抗,如果不在每个电路板的每条走线上放一个示波器,就可能无法完全测试阻抗。快速发展可能会发现更多明显的阻抗问题以及大容量电容之类的问题。全为零的棋盘格也可能有助于接地反弹和体电容。
另请注意,变慢非常重要。高速和高容量测试不能掩盖板上的噪声,可能会损坏板子或设计,并很容易通过所有内存测试。您可能希望进行一些故意降低速度的测试,例如,允许写入选通信号出现毛刺,如果对附近的迹线(而不是内存迹线)执行测试,则可能会更好。填充内存,稍等片刻,将其读回,看看是否有写的内容被窃听。您提到了sram,对于dram,缓慢的测试对于确保刷新有效很重要,也许填充独特的模式,稍等片刻,读回,用独特图案的反面填充以翻转每一位,稍等片刻,然后回读。
我大部分时候放弃了上面的大多数测试,并且从伪随机测试中获得了很多 yield 。使用创建比我要测试的存储位置数更多的唯一数字的LFSR,例如,此16位1应当产生2的幂乘以16减去两个唯一数,然后重复。负二是因为lfsr不会对数字进行运算或生成全1或全0的数字,因此在播种时请记住这一点。
unsigned int fastprand16(unsigned int prand)
{
//16位lfsr位16,14,13,11
如果(prand&1)
{
品牌>> = 1;
prand ^ = 0x0000B400;
}
别的
{
品牌>> = 1;
}
return(prand&0x0000FFFF);
}
Wikipedia具有lfsr位单元抽头表的链接,这些表可在重复各种移位器长度之前产生最大数量的模式。上面的一个有效,但您想要翻转更多的数据位而不仅仅是移位它们有点无聊。
与使用库中的随机数相比,使用自己的随机数更好。库从计算机到计算机,从操作系统到操作系统,从编译器到编译器,以及同一系统上os或编译器的版本变化。您可以使用自己的方法来确保测试不会随时间改变其属性,即使驱动该测试的主机系统会改变它的属性。这就是为什么像lfsr这样的东西很好的原因,它可能不是一个很棒的随机数生成器,用于与计算机打牌游戏,但是对于在数据总线上创建少量具有快速执行代码的可重复的困惑外观数据模式,它是伟大的。没有自制的随机化器,我将避免基于随机化器的测试。
例如,如果您需要执行快速BIST,则可以用回读的品号填充内存,用相同的品号的倒数填充,然后回读。或先执行总体测试,以清除明显损坏的电路板,然后执行三月测试,但地址测试除外。或者相反,您可以执行很多次数千次prand pass,每次都更改种子。了解lfsr模式的属性后,您可以选择使用模式中的下一个随机数作为下一次传递内存的种子。或者,理想情况下,您可以使用第二个lfsr来产生种子,随着时间的推移创建所有可能的种子。
缓存和缓存测试是一场噩梦。在芯片上应该遵循的规则是,这既不是芯片验证测试,也不是设计验证测试,这是制造测试。如果您拥有数据高速缓存并在另一侧测试ram,则您可能在自欺欺人,可能需要在读取通过之前执行写入通过次数。理想情况下,您希望启用缓存,以便您的测试能够快速运行,但要禁用被测内存区域的缓存。这使我想起了一个常见的错误,即仅在执行测试的软件未使用的内存上执行所有这些测试(假设此板具有处理器,并且内存是处理器执行内存),尤其是要运行该软件从零或低内存开始,这意味着大多数程序花费大部分时间运行的内存区域未经过测试,并且程序空间和堆栈之间的中间块(测试使用频率较低)是测试最多的,并且不测试所有地址位,因为您可能会猛烈地进入堆栈。您几乎不浪费时间去为这样的系统进行任何内存测试吗?如果您不信任该内存以进行测试,那么您将无法信任该内存中运行的测试程序的结果。理想情况下,您要从ROM或片上暂存存储器执行,以便可以完全测试整个存储器总线。
ECC内存是另一个噩梦,精心设计的ecc内存和内存 Controller 将使您能够处理包括ecc标记在内的所有位,从而使您能够测试所有内容以及ecc系统本身,单位和多位错误。如果您没有访问权限,那么即使是进行肯定的测试,如果您想尝试测试芯片内的每个位,那么对于每一行,您都需要确保存储器测试套件至少打开和关闭所有ecc位对标签中的每个位进行一次测试,然后在所有其他位在一个时间点关闭时对其进行测试,然后在其他每个位(不必同时)处于打开状态时对其进行测试。具有分支预测功能的现代处理器完全有权随意读取任何内存位置,因此您的测试可能会意外地读取带有故意植入的单个位错误的内存位置,从而导致该位被修复,并且在测试获得时碰到那个位置,您可能会失败,因为您没有看到预期的单位错误,而实际上系统运行正常。奇偶校验与ecc类似,但还不错。
关于电路板测试的另一件事是,如果要说您要测试每个芯片中的每个位以及所有PCB迹线,焊点和电缆。查看外围设备或查看处理器本身的指令集(如果您有一个板上的指令)并花很长时间,就会发现即使以2 GHz的速度运行,您甚至可能要花几百亿年的时间才能达到极限。第一个芯片的外部引脚(从内到外)。您不能也不会进行所有测试,只能摘下低落的果实,等待用户(希望是内部软件/bsp开发人员)发现无法预料的问题,然后针对这些特定问题创建新的测试。您可能进行了完美的行军内存测试,但仍然找不到间歇性的内存问题。即使烧伤了,我也看到零件在几个月后失效。远远超出了电路板/部件的预期婴儿死亡率。
底线是,没有一种适合所有解决方案的尺寸,您必须利用特定板卡/芯片的功能调整常见,流行或个人喜爱的做法,并能够即时调试和创建新测试。您还需要积极主动地迫使设计工程师进行测试设计。如果有产品召回,则是您的头(测试工程师)会在他们的脑海中滚动。
对不起,很长的帖子,我希望它对某人有用。
关于algorithm - March内存测试算法的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3729544/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!