
在一个由微电子学定义的时代,我们如何保证包含数十亿晶体管的设备的可靠性?单独验证每个组件是一项不可能完成的任务,然而一个微小的缺陷就可能导致灾难性的故障。解决方案在于一种强大的抽象,它已成为数字电路测试的基石:单固定型故障模型。该模型将物理缺陷的混乱现实简化为一个可管理且数学上精确的框架,使工程师能够系统地寻找隐藏的缺陷。
本文对这一核心概念进行了全面探讨。首先,在“原理与机制”一章中,我们将剖析模型本身,理解其核心假设和其背后精妙的逻辑。我们将探讨可控性和可观测性这两个故障检测的支柱性关键概念,并介绍用于在电路中追踪错误的专门代数——D-演算。我们还将通过考察故障等效性和冗余性来揭示“故障全集”的结构。随后,“应用与跨学科联系”一章将展示该理论如何付诸实践。我们将看到该模型如何支撑从生成高效测试图形、执行硬件取证到设计能够在最严苛环境中运行的稳健容错系统的方方面面。
我们如何能信任一台由数十亿个组件(如现代微处理器)构成的机器?如果其无数微观导线中哪怕只有一根失效,就可能导致无声的数据损坏或灾难性的系统崩溃。逐一检查每个晶体管是一项不可能完成的任务,是硅时代里一项西西弗斯式的苦役。然而,科学与工程之美在于抽象的力量——创造捕捉复杂现实精髓的简单而强大模型的艺术。对于数字电子世界而言,其中一个最优雅和持久的模型便是单固定型故障模型。
想象一个数字电路,它不是晶体管的海洋,而是一个由导线(或称网络节点)连接的逻辑门网络。每个网络节点都应承载一个信号,即逻辑或。单固定型故障模型做出了一个极为大胆的假设:如果出现缺陷,它将只影响这些网络节点中的一个,且其失效模式极其简单——该网络节点永久“固定”在逻辑(固定于0故障,或s-a-0)或逻辑(固定于1故障,或s-a-1),而无论电路的其余部分试图做什么。
这现实吗?从字面意义上说,不现实。物理制造缺陷可能是一粒微小的尘埃导致两根导线短路,或者一个畸形的晶体管。然而,值得注意的是,简单的固定型模型非常有效。事实证明,针对这些理想化故障的测试能够检测出工厂中发生的真实、复杂的物理缺陷的很高比例。它提供了一种可管理的、数学上精确的方式来推断故障。
首先,我们必须识别所有可能发生故障的位置。在这个模型中,任何唯一的信号路径都是一个潜在的故障点。让我们考虑一个简单的2到1多路复用器(MUX),这是一种常见的数字开关,由几个基本门构成。如果我们追踪其内部接线图——主输入()、门之间的连接以及最终输出()——我们可能会识别出7个不同的网络节点。由于每个网络节点都可能固定于0或固定于1,我们这个简单的MUX就给我们提供了一个包含个可能的固定型故障的“故障列表”,我们可能需要对这些故障进行测试。对于一个真实的芯片,这个列表可能会达到数百万之多,但原理是相同的:我们创建了一个有限的、明确定义的嫌疑列表。现在,搜寻可以开始了。
你如何检测一个深藏在电路内部的故障?你无法直接观察内部。你所能做的就是向电路的输入端施加信号,并观察其输出端的结果。这就是测试的本质,它像一出两幕剧一样展开。要捕获一个故障,你必须首先 kích thích 它做错事,其次,你必须确保这种不当行为能从外部看到。这两个基本概念被称为可控性和可观测性。
让我们想象一下,我们正在测试一个简单的双输入与门,其输入为和,输出为。假设我们怀疑输入固定于0。
第一幕:可控性(激发故障)
要查看是否固定于,我们必须施加一个输入模式——一个测试向量——试图将强制为。如果我们设置,故障门的行为将与正常门完全一样,我们就什么也学不到。将一个网络节点驱动到其假定固定值的相反值的行为称为故障激活或激励。因此,对于我们怀疑的 s-a-0故障,任何测试向量都必须使。这就是可控性条件:我们必须能够“控制”输入,在故障点产生差异。在无故障电路中,将是;在我们的故障电路中,它固定于。我们已经制造了一个错误。
第二幕:可观测性(使错误可见)
我们的错误,即正常电路导线上的'1'与故障电路上的'0'之间的差异,仍然是内部的。为了观察到它,其影响必须通过电路传播到输出。这就是故障传播。对于我们的与门,如果我们将另一个输入设置为,无论是什么,输出都将是( 并且 )。故障的影响将被掩盖。为了让上的错误通过,我们必须将输入设置为其“非控制”值,对于与门来说,这个值是。现在,输出成为上值的直接副本。
输出不同了!测试向量 成功地检测到了 s-a-0 故障。它制造了一个错误(可控性)并将其传播到了一个可观测的输出(可观测性)。从故障点到输出的路径现在是一条敏化路径。通过系统地以这种方式分析所有可能的故障,我们可以找到一组最小的测试向量——在这种情况下是 ——它保证能检测到我们简单与门中的任何单个固定型故障。
一个精心挑选的测试向量通常可以一次性捕获一大批故障。例如,在一个稍微复杂一点的电路中,向量 可能同时测试 s-a-0、 s-a-1 和几个内部故障,因为它恰好同时满足了所有这些故障的可控性和可观测性条件。
随着电路越来越大,对每个输入的“正常”和“故障”行为进行推理变得很麻烦。科学家和工程师们天才地开发了一种特殊的代数来处理这个问题。它允许算法同时“看到”正确和错误的世界。这通常被称为5值逻辑,或D-演算。
该逻辑包括我们熟悉的 、 和 (表示“不知道”或“无关”)。神奇之处在于两个新符号: 和 。
代表差异(Discrepancy),上划线表示其相反的极性。这个简单的表示法功能极其强大。故障检测的过程现在可以用这种新语言重新表述:
激励故障:我们必须在故障位置创建一个或。如果我们怀疑一个网络节点固定于0,我们必须将其无故障值驱动为。这就在该位置产生了对 ,即一个。如果我们怀疑一个固定于1的故障,我们必须将无故障值驱动为,从而产生对 ,即一个。
传播故障:我们必须引导这个或符号通过逻辑门,直到它到达一个主输出。传播的规则内嵌在代数中。例如,如果一个信号进入一个非门会发生什么?正常值()变成,故障值()变成。输出对是 ,也就是。所以,一个非门将翻转为!一个输入为和的与门将输出,但一个输入为和的与门将输出,这显示了故障是如何被掩盖的。这种优雅的演算构成了强大的自动测试图形生成(ATPG)算法的基础。
当我们构建潜在故障列表时,一个自然的问题出现了:所有这些故障真的都不同吗?或者其中一些只是对同一种不良行为的不同描述?这引出了故障等效性和冗余性的概念,它们揭示了“故障全集”内部的深层结构。
故障等效性是指不同的故障在功能上可能是相同的。如果检测一个故障的测试向量集合与检测另一个故障的测试向量集合完全相同,那么这两个故障被认为是等效的。考虑一个由一个与门后跟一个反相器(一个与非门)组成的简单电路。该电路中有10个潜在的固定型故障。但是否有10种独特的行为呢?让我们看看。与门任一输入上的固定于0故障都会导致其输出变为,这又会导致最终的与非门输出为。最终输出上的固定于1故障也会强制其为。从外部看,所有这些故障都产生相同的结果:输出永久固定于。它们是等效的!通过仔细分析每种故障下电路的功能,我们可以将最初的10个故障“缩减”为仅4个不同的等效类。这个过程,称为故障缩减,至关重要。这意味着我们不需要为列表中的每一个故障都生成测试,而只需为每个等效类生成一个测试,从而大大减小了问题的规模。
等效性的规则优美地取决于门的类型。对于一个与门,任何输入上的s-a-0都等效于输出上的s-a-0。但对于一个或门,则是输入上的s-a-1等效于输出上的s-a-1。
如果一个故障没有任何测试向量可以检测到它呢?这样的故障被称为不可检测的,并且是电路逻辑中冗余的结果。考虑布尔函数 。根据布尔代数的一个规则(共识定理),项 实际上是冗余的;该函数等同于 。如果我们构建一个包含冗余项 的门的电路,该门输出上的固定于0故障将无法被检测。因为该项从一开始就不是必需的,所以将其强制为零对最终输出没有影响。这揭示了逻辑设计与物理可测试性之间的迷人联系:设计中的逻辑冗余会导致不可检测的故障,这些故障可能隐藏潜在缺陷,并在未来构成风险。
在完成了所有这些工作——建模故障、生成测试向量和缩减故障列表之后——我们如何知道我们做得好不好?在测试领域,最终的成功衡量标准是故障覆盖率。它就是我们的测试向量能检测到的故障数量与我们考虑的总故障数量之比:
一组测试向量可能在14个可能的故障中检测到12个,从而得到大约 或 的故障覆盖率。对于航空航天或医疗设备等安全关键应用,制造商力求覆盖率尽可能接近100%。
生成一组最小的向量以实现高覆盖率是一项巨大的计算挑战。考虑测试处理器中内存控制器的一部分。为了测试内部一条线上的单个固定于0故障,我们可能会发现逻辑条件要求将8个特定的输入信号设置为固定值。然而,该控制器可能还有13个其他输入(例如,低位地址位),这些输入对于这个特定的测试是无关的。这些是“无关”输入。由于这13个输入中的每一个都可以是或,因此有 个不同的测试向量可以检测这一个单一的故障!ATPG工具的工作就是找到这8192个向量中有效的一个,并为系统中的每一个其他故障都这样做。
因此,源于简化需求的单固定型模型,发展成为一个丰富而强大的框架。它为我们提供了一种谈论错误的语言,一种揭示它们的策略,以及一种衡量我们成功的指标,将验证一个拥有十亿晶体管的芯片这一不可能的任务,转变为一个可处理的、合乎逻辑的追求。
在了解了单固定型故障模型的原理之后,我们可能会觉得它只是一个简洁但或许抽象的理论。事实远非如此。这个简单的模型不仅仅是一个理论构建;它是一个极其通用和强大的透镜,工程师和科学家通过它来观察、质疑并最终确保数字世界的可靠性。它的应用远远超出了简单的学术练习,构成了从制造您手机中的微芯片到设计能够在深空严酷环境中生存的航天器的所有事物的基础。
对可靠性的追求分为两条宏伟的道路。在一条路上,我们是侦探,寻求揭露隐藏的缺陷。这是测试的世界,我们的目标是找出制造不当的芯片,以便将其丢弃。在另一条路上,我们是弹性的建筑师,设计能够承受故障并继续执行任务而不受影响的系统。这是容错的世界。这个不起眼的固定型模型是我们在这两种努力中的共同语言。
想象你有一台复杂的机器,你怀疑其中一个零件可能坏了。你如何找到它?你可以尝试机器能做的每一件事,但这会非常低效。一个更好的方法是设计一个特定的、巧妙的测试——一个问题——迫使坏掉的零件暴露自己。这就是测试生成的精髓。
我们的“机器”是一个数字电路,而一个输入模式就是我们的“问题”。我们的目标是找到能够揭示任何可能的单固定型故障的最小问题集。考虑计算机最简单的构建模块之一,半加器,它将两个比特相加产生一个和(Sum)和一个进位(Carry)。即使是这个微小的电路也有几个潜在的固定型故障。为了测试它,我们不需要应用所有四种可能的输入组合。通过仔细分析,我们发现一组精心挑选的仅三个输入模式就足以检测其输入和输出上的每一个单固定-固定型故障。这是一个美妙的结果!它表明,通过理解电路的逻辑,我们可以比暴力方法高效得多。
当我们考虑某些类型的组件时,这个想法变得更加优雅。一些逻辑门是天生的“说真话者”。异或门(XOR)就是一个典型的例子。它有一个奇妙的特性:如果你翻转它的一个输入,它的输出保证会翻转,无论另一个输入是什么。这意味着如果一个故障发生在异或门的输入上,其影响会直接传播过去。无处可藏。一个由一连串异或门构成的电路,比如奇偶校验器,对于测试工程师来说就变得透明了。开头的故障会沿着整个链条波及到末端,而不需要任何特殊条件来维持它的传播。这种“保证传播”极大地简化了寻找故障的任务,。电路本身的结构告诉我们审问它会有多容易。
固定型模型不仅用于预先创建测试;它也是诊断中不可或缺的工具——一种硬件取证。当一个复杂系统行为异常时,我们可以从症状反向追溯,以惊人的精确度查明原因。
想象一位工程师正在测试一个新的处理器芯片。她发现减法单元有故障。它不产生垃圾信息;它始终计算 ,而不是正确的二进制补码减法 。机器每次都精确地差一!这不是一个随机错误;这是一条线索。对于精通数字逻辑和固定型故障语言的人来说,这条线索直接指向一个单一的罪魁祸首:加法器电路的初始进位输入,它本应为二进制补码运算提供“+1”,肯定被固定在0了。一个高级的算术错误被追溯到一根永久接地的单根导线上。这就像侦探在犯罪现场找到一个决定性的指纹。
同样的诊断能力也适用于具有存储和状态的时序电路。考虑一个设计用来从0计数到11然后复位的同步计数器。在测试过程中,发现它过早复位——它数到10然后跳回0。为什么?复位逻辑被设计用来识别11的二进制模式(1011)并触发复位。它在10(1010)上触发的事实告诉我们复位逻辑到底是如何失效的。仔细分析揭示,唯一可能导致这种行为的单固定型故障是逻辑门的一个特定输入固定于1,这实际上使电路忽略了状态的最后一位。计数器认为1010就是1011!故障通过电路的行为暴露了自己。
我们讨论的简单电路是现代微芯片的原子,而这些微芯片包含数十亿这样的原子。我们怎么可能测试如此庞大复杂的系统?“提出一个巧妙的问题”的方法仍然是基础,但我们需要更强大的策略。
最大的挑战之一是故障可能深藏在电路内部。想象一个64位的纹波进位加法器。进位信号必须像一排倒下的多米诺骨牌一样,从第一位波及到最后一位。在第0位的进位线上的故障,其影响可能会在中间某处被“掩盖”或“阻塞”,永远无法到达在第63位处可观测的输出。故障效应能够幸存整个旅程的概率可能微乎其微。为了解决这个问题,工程师们使用一种名为可测试性设计(DFT)的策略。这个想法简单而深刻:如果你不能轻易看到内部发生了什么,你就修改设计以增加窗户。对于长加法器的情况,这意味着沿着进位链插入特殊的“观测点”,将漫长、不确定的路径分解为一系列短小、可管理的段。通过使用概率论,我们可以计算出所需的最小观测点数量,以保证任何故障都将被以非常高的置信度捕获。我们不只是构建电路;我们构建可测试的电路。
当然,即使有了DFT,为百万门级电路找到正确的测试向量也不是人力所能及的。这就是固定型模型与计算机科学和算法领域联系起来的地方。工程师们开发了复杂的自动测试图形生成(ATPG)程序。这些名为PODEM之类的算法,将我们的侦探工作形式化。它们从一个目标故障开始,然后反向工作:“要看到这个故障,这个门必须是什么值?要得到那个值,它的输入必须是什么?”这一推理链条一直持续到它在电路的主输入端得到一个所需的模式。这是算法搜索在物理问题上的一个美妙应用,使我们能够为复杂程度惊人的芯片生成测试图形。
数字逻辑的格局也在变化。许多现代设备,如现场可编程门阵列(FPGA),不是由固定的门构成的,而是由称为查找表(LUT)的小型可编程存储块构成。例如,一个4输入LUT本质上是一个微小的16位RAM,可以被编程以实现任何逻辑功能。我们的故障模型如何应用于此?LUT中的固定型故障对应于其内部存储单元之一固定于0或1。要测试这一点,我们必须从那个特定的存储位置读取,看它是否产生错误的值。寻址特定存储位置的唯一方法是应用其对应的输入模式。令人惊讶的结论是,要完全测试一个LUT,你必须向它应用每一种可能的输入组合。我们为简单门看到的最小化测试集的巧妙捷径在这里不适用;结构的性质迫使我们进行详尽的测试。
到目前为止,我们已经使用固定型模型来寻找故障。但还有另一个同样重要的应用:构建即使存在故障也能工作的系统。这是容错的领域,它对于那些不允许失败的系统至关重要,例如飞机、医疗设备或卫星。
核心思想是冗余。我们不用一个模块来做关键计算,而是使用三个相同的模块,并让它们对结果进行投票。这被称为三模冗余(TMR)。投票由一个表决器电路完成。如果三个模块中的一个遭受单固定型故障并开始产生不正确的输出,它将被另外两个正确的模块投票否决。整个系统对内部故障浑然不觉,并继续正常运行。
这提供了一个美妙的哲学对比。测试关注的是制造缺陷;我们在工厂测试芯片以剔除坏品。容错关注的是操作性故障——在设备生命周期中可能出现的错误,可能是由磨损或辐射引起的。在第一种情况下,我们想要找到故障。在第二种情况下,我们想要忽略它。类似地,纠错码向数据添加冗余的校验位,以便可以即时检测和纠正传输错误,这是另一种形式的容错。然而,单固定型模型为我们在所有这些情景中推理威胁提供了统一的语言。它是一个简单的概念,不仅赋予我们完善我们数字创造物的力量,还赋予它们在不完美世界中生存的韧性。