《1 引言》

1 引言

电路系统在设计、制造以及运行过程中需要进行测试, 以保证其设计要求或正常工作, 它已成为集成电路设计与生产过程的一个重要组成部分。电路存在故障的测试通常称故障检测, 若还要定位故障点, 则称为故障定位或故障诊断[1]。故障定位的困难在于电路的多个节点故障是不可分的, 或者虽可区分但测试矢量复杂[2,3]。为此, 研究在进行组合电路的可测性设计时能使电路可测且故障可定位[4,5]

在逻辑函数的电路可测性设计方面, Reddy最先提出基于Reed-Muller模式的异或门级联的实现方法[1,2]。对有n个变量的逻辑函数, 所设计的电路只需n+4个测试矢量组成的测试集就可检测电路中所有的固定型故障。而且这种测试集是通用的, 这点使得通过逻辑函数的Reed-Muller模式来进行电路的可测性设计, 在理论上非常具有吸引力。例如, 就逻辑函数Reed-Muller模式的不同类型, PPRM, FPRM和GRM等研究了针对单故障和多故障的可测性设计[6]。目前对逻辑函数的可测性设计研究主要涉及故障的检测, 而对故障的定位方面研究较少。为此笔者开展了有关故障定位的研究, 其主要创新之处在于:提出了一种基于逻辑函数Reed-Muller模式的电路可测性设计方案, 给出了进行故障定位的方法与详细实现步骤, 同时该方法可应用于其他相关的可测性设计中。

《2 电路设计》

2 电路设计

《2.1 逻辑函数的表示形式》

2.1 逻辑函数的表示形式

任何一个具有n个变量的组合逻辑函数f均可用如下的Reed-Muller模式表示:

f=A0A1x1*A2x2*Anxn*An+1x1*x2*An+2x1*x3*Atxn-1*xn*Amx1*x2*xn*(1)

其中⊕表示异或运算, xi*{xi,x¯i},i=1,2,,nAj{0,1},j=01,2,,mm=2n-1

若在函数f的Reed-Muller表达式中, 所有变量xi (i=1, 2, …, n) 以原变量 (即xi的形式) 出现, 则称为PPRM形式;若在表达式中一些变量以原变量xi出现, 而另一些变量以求反变量x¯i出现, 则称为FPRM形式;若在表达式中有一些原变量xi和它的求反变量x¯i同时出现, 则称为函数的GRM形式, 如f=x1x5x¯1x4x6x2x3。GRM比FPRM更具一般性, 对同一逻辑函数用这三种形式中的GRM模式所需的项数 (指在表达式中的积项) 是最少的[6,7,8], 下面主要是针对这种模式, 其结果也适用于PPRM和FPRM。

《2.2 电路结构》

2.2 电路结构

对有n个变量x*i (i=1, 2, …, n) 的逻辑函数f, 设它的GRM中积项有m项。对每一积项在f中的位置做如下调整:按变量x1, x2 , …, xn, x¯1, x¯2, …, x¯n出现在积项中的次序, 把变量个数较少的积项排在函数f表达式的左边。例如, 对f=x¯3x1x¯1x¯2x1x3x4x1x2x4, 调整后的形式为f=x1x¯3x¯1x¯2x1x2x4x1x3x4。设f调整后的积项为f1 (x) , f2 (x) , …, fm (x) , 即f = f1 (x) ⊕ f2 (x) ⊕…⊕fm (x) , 且当j<m时积项fj (x) 的变量数少于或等于积项fj+1 (x) 的变量数。 用ANDj来实现fj (x) (j=1, 2, …, m) , 并把原始输入线x1, x2 , …, xn连接到相应的AND门。用多个异或门 (XOR门) 把xi的值求反, 将x¯i连到相应的AND门。在这些AND门中使AND1位于最左边, AND2次之, ANDm位于最右边, 即AND门的排列是有序的。把AND门的输出接到具有m个输入的XOR门树 (简称XOR树) , XOR树的输出即是逻辑函数 f的输出。

《图1》

图1 GRM的电路可测性设计
Fig.1 The testable realization of GRM

图1 GRM的电路可测性设计 Fig.1 The testable realization of GRM   

GRM电路的一般结构如图1所示。为了电路测试的需要, 在其基础上增加了4个控制输入C0, C1, C2和C3, 以及2个与门AND11AND12, 和2个或门OR11OR12, 这4个门的输出节点分别为O1、O2、O3和O4AND11OR11的输入都是C1, C2, C3和所有原始输入xi (i=1, 2, …, n) , AND12OR12的输入都是所有原始输入求反x¯i。在图1和图2中这4个门的输入用粗线表示。当电路正常运行时把C0 , C1 , C2和C3的值赋1。图2给出了实现逻辑函数h=x1x2x3x¯2x3x4的电路。

《图2》

图2 逻辑函数h的电路实现
Fig.2 The circuit realization of function h

图2 逻辑函数h的电路实现 Fig.2 The circuit realization of function h  

控制输入C1, C2C3的连接方法如下:定义矢量V1= (0 0 1) , V2= (0 1 0) , V3= (0 1 1) , 并为XOR树的原始输出节点赋这三个矢量中的一个, 把其余的两个矢量分别赋给该XOR门的两个输入节点, 以此类推, 直至XOR树的每一个原始输入节点都赋了V1, V2, V3中的一个矢量, 参见图3a。图 3a和图3b分别是8个输入的XOR树和XOR门级联的例子。对AND阵列的每一个AND门, 若它的输出节点 (即相应XOR树的输入节点) 被分配的矢量为Vi (i=1, 2, 3) , 则把控制输入Ci (i=1, 2, 3) 连至该AND门作为门的输入节点。

《图3》

图3 XOR门树与XOR门级联
Fig.3 XOR gates tree and XOR gates cascade

图3 XOR门树与XOR门级联 Fig.3 XOR gates tree and XOR gates cascade   

图3可见, 变量数相同时, XOR树电路比XOR门级联有更小的延迟。下面在讨论GRM电路时, 把它分为:输入与控制、AND阵列、XOR树等三部分, 在图2中已用虚线标出。具有n个输入变量的逻辑函数f, 若只考虑电路中节点的固定型故障 (s-a-0或s-a-1, 通常电路中的一些短路故障属于s-a-0, 开路故障属于s-a-1) , 可以得到检测GRM电路的通用测试集。定义n+4维矢量的各分量形式为R= (C0C1C2C3x1x2xn) ;a1= (0 0 0 0 0 0 … 0) , a2= (0 1 1 1 1 1 … 1) , a3= (1 0 0 0 0 0 … 0) ;矢量bi (i=1, 2, …, n) 的分量为C0=0, C1=C2=C3 =1, xi=0, 其他所有分量xj=1 (ji) ;d1= (0 0 1 1 1 1 … 1) , d2= (0 1 0 1 1 1 …1) 。其中T1={a1, a2, a3}可以检测GRM电路输入与控制部分的故障;T2={a2, b1, b2, …, bn}能检测AND阵列的故障;T3={a1, d1, d2}可以检测XOR树的故障。用如上n+5个矢量组成的测试集是电路的通用测试集T=T1T2T3

《3 GRM电路的故障定位》

3 GRM电路的故障定位

若GRM电路发生了一个故障 (s-a-0或s-a-1) , 可依次对电路的三部分即输入与控制、XOR树、AND阵列进行故障定位。

《3.1 输入与控制部分的故障定位》

3.1 输入与控制部分的故障定位

首先对节点C0的故障做定位。令矢量S1= (1 0 0 0 … 0) , S2= (0 0 0 0 … 0) , S1S2中各分量的含义与矢量R相同。对电路的输入节点施加矢量S1, 若节点O4=0, 则节点C0发生了s-a-0故障;其他的故障情况, 即C0发生s-a-1故障、C1, C2, C3和原始输入节点xi 及其求反x¯i 中的一个节点发生 s-a-0或 s-a-1故障时都会使 O4=1。对电路的输入节点施加矢量S2, 若节点O3=1, 则节点C0发生了s-a-1故障;其他故障情况下即C0发生s-a-0故障、C1, C2, C3和原始输入节点xi 及其求反x¯i 中的一个节点发生s-a-0或s-a-1故障时都会使O3=0。

使控制输入C0=0, 此时电路的原始输入xi与其求反x¯i 的值相同。对电路的输入节点施加n+3个矢量 (分量的含义同矢量R) :rc1, rc2, rc3, r1, r2, …, rn。每个矢量中只有一个分量为1, 其他分量全为0。其中rc1的分量C1为1, rc2的分量C2为1, rc3的分量C3为1, ri (i=1, 2, …, n) 的分量xi为1。把节点O2作为观测点, 用矢量rc1对发生在节点C1的s-a-0故障进行定位, 此时矢量rc1会使O2=0;而其他情况, 如节点C1无故障、C1有s-a-1故障、其它节点 (C0除外) 发生故障 (s-a-0或s-a-1) 时, 矢量rc1使O2=1。同理用矢量rc2rc3分别对节点C2C3的s-a-0故障定位;用矢量rj (1≤jn) , 以节点O2作为观测点对发生在原始输入节点xj 的s-a-0故障进行定位, 且以节点O4作为观测点对发生在节点x¯j的s-a-0故障定位。

对电路的输入节点施加n+3个矢量:tc1, tc2 , tc3 , t1, t2, …, tn , 各矢量的分量含义同矢量R。每一矢量有2个分量的值为0, 其他分量都为1。其中分量C0都为0, 矢量tc1的分量C1=0, tc2的分量C2=0, tc3的分量C3=0, ti (i=1, 2, …, n) 的分量xi为0。把节点O1作为观测点, 分别用矢量tc1, tc2tc3对发生在节点C1, C2C3的s-a-1故障定位, 例如, 节点C1有s-a-1故障时, 矢量tc1使O1=1, 而当节点C1有s-a-0故障及其他节点 (C0除外) 发生故障时, 矢量tc1使O1=0。同理用矢量tj (1≤jn) , 以节点O1作为观测点对原始输入节点xj的s-a-1故障定位, 且以节点O3作为观测点对发生在节点x¯j的s-a-1故障定位。

《3.2 XOR树的故障定位》

3.2 XOR树的故障定位

由于GRM电路的XOR树的输入为AND门阵列的AND门输出, 增加了对XOR树进行故障定位的难度。下面用AB表示在XOR树中从节点A至节点B的路径, 包含AB两个端点 (节点) 。由于XOR树是无扇出电路, 从一个节点A至另一节点B的路径是唯一的。设每一个与门ANDj (j=1, 2, …, m) 的输出节点为Yj, 电路的原始输出 (主输出) 节点为Y, 因此Y1Y, Y2Y, …, YmY都是XOR树中的路径。为XOR树的故障定位设置两张表Tab.1和Tab.2, Tab.1用于存放可能是有故障的节点, Tab.2用于存放无故障节点。

《3.2.1 XOR树s-a-0故障的定位 对XOR树的s-a-0故障定位采用算法1。》

3.2.1 XOR树s-a-0故障的定位 对XOR树的s-a-0故障定位采用算法1。

算法1

Step 1 使控制输入C0=0, C1=C2=C3=1;置Tab.1和Tab.2为空。

Step 2 首先对门AND1, 由于它的输入节点是最少的, 因此可以选择电路的一个输入矢量X1, X1使AND1的输出Y1的值为1, 而使其他与门ANDj (j>1) 的输出Yj的值为0。这里, 选取的X1是把与AND1的输入对应的电路原始输入节点的值取为1, 而把原始输入的其它节点取值为0。例如, 对有6个原始输入x1x6 的GRM电路, 若AND1的输入为x1, x3x4, 则把其输入值取1, 而把x2, x5x6的值取0。

对电路施加矢量X1, 若电路的输出Y=0, 则在XOR树中从节点Y1Y路径上有一个节点发生s-a-0故障, 将路径Y1Y中所有节点写入Tab.1;若电路的输出Y=1, 则节点Y1Y路径上所有节点无故障, 将Y1Y路径上所有节点写入Tab.2。

Step 3 对AND阵列的其他与门ANDj (j≥2) 可进行类似于门AND1的处理, 但此时当选择一个输入矢量Xj使门ANDj的输出Yj =1时, 可能会使多个 (设为k个) 其他与门ANDi (i<j) 的输出Yi=1。下面针对路径YjY进行讨论。

在对路径YjY进行操作时, 若在对Yi (i=1, 2, …, j-1) 进行的操作中路径都无故障, 此时把路径YjY与路径Yj-1Y的交点记为C, 对应C的XOR门输入节点记为AB, 如图4 (a) 所示。设输入矢量Xj会使k个门ANDi (i<j) 的输出Yi=1。当k=0或偶数时, 对被测电路施加矢量Xj, 若电路输出Y=0, 则路径YjB有故障;若Y=1时, 则路径YjB无故障。当k为奇数时则相反, 若Y=1, 则YjB有故障;若Y=0时, 则YjB无故障。若确定了路径YjB有故障, 则转Step 4, 若确定路径YjB无故障, 则对路径Yj+1Y继续进行此步的故障定位操作。

Step 4 若发现一条路径有故障, 则设此故障路径为YtY。通过选取XOR树中的一些路径YjY (j>t) , 并对电路施加多个矢量Xj, 即可确定故障节点。首先考虑到与故障路径YtY相交的路径YjY, 见图4b, 施加矢量Xj, 当k=0或偶数时, 若Y=0, 则CY故障 (YtA无故障) , 若Y=1, 则YtA故障 (CY无故障) ;当k为奇数时, 若Y=1, 则CY故障, 若Y=0, 则YtA故障。其具体步骤见图5。

《图4》

图4 路径相交
Fig.4 The intersect of two paths

图4 路径相交 Fig.4 The intersect of two paths  

《图5》

图5 一个XOR树结构
Fig.5 An example of XOR gates tree

图5 一个XOR树结构 Fig.5 An example of XOR gates tree   

当已确定故障路径为Y1Y时, 对电路施加矢量X2, 若电路输出Y=0则m12Y故障, 节点Y1无故障, 若电路输出Y=1则节点Y1故障, m12Y无故障。若是m12Y故障, 则再用路径Y3Y的矢量X3判定是节点m12还是路径m1234Y故障;若m1234Y有故障, 则用路径Y5YX5判定是节点m1234还是节点Y有故障。因此当路径Y1Y有故障时, 只需用YjY中的一些路径就可确定故障节点, 例如图5中的Y2Y, Y3YY5Y。若确定路径Y1Y无故障, 则故障路径在其他的子树上, 例如当路径Y5Y有故障时, 由于Y1Y无故障, 因此节点Y无故障, 是路径Y5m5678有故障, 此时可对以节点m5678为输出的子树进行处理, 依次选取路径Y6m5678Y7m5678来进行。

在算法进行过程中当发现故障路径时, 将该路径中不在Tab.2中的节点写入表Tab.1;当发现无故障路径时将其写入表Tab.2, 并在表Tab.1除去此路径的节点。确定某一路径有故障, 则使用Setp 4以缩小故障范围, 当表Tab.1中只有一个节点时, 该节点即为故障节点, 算法结束。

《3.2.2 对XOR树s-a-1故障的定位》

3.2.2 对XOR树s-a-1故障的定位

首先确定XOR树是否有s-a-1故障。设零矢量θ为:控制输入C0=C1=C2=C3=0, 电路的所有原始输入节点取值0。在零矢量θ作用下, 若电路的原始输出Y=0, 则XOR树无s-a-1故障;若Y=1, 则XOR树有s-a-1故障。XOR树的s-a-1故障定位与s-a-0故障定位类似, 主要是在算法1中把Y=0改为Y=1, 而把Y=1改为Y=0。每一个与门ANDj仍用前面的方法选取矢量Xj。例如相对应于Setp 2, 在矢量X1的作用下, 若Y=1, 则路径Y1Y有s-a-1故障;若Y=0, 则路径Y1Y无故障, 因为故障s-a-1只可能发生在路径Y1Y或其他路径YiY (2≤im) 。

《3.3 AND阵列的故障定位》

3.3 AND阵列的故障定位

在进行故障定位时, 依次确定门AND1, AND2, …, ANDm是否有故障, 然后对故障节点进行定位。

《3.3.1 AND阵列s-a-0故障的定位》

3.3.1 AND阵列s-a-0故障的定位

对AND门阵列的每一个AND门, 由于每个输入节点的s-a-0故障和门输出节点的s-a-0故障等效, 因此只需把故障定位到AND门。

算法2

Step 1 使控制输入C0=0;置j=1。

Step 2 选取电路的一个输入矢量Zj, 使ANDj的输出Zj的值为1。这里选取Zj时是把对应ANDj输入节点的控制输入Ci (1≤i≤3) 和电路原始输入的值全取1, 其他输入节点值取0 (与算法1中选取矢量Xj类似) 。对被测电路施加矢量Zj, 记电路的输出为f (Zj) , 并计算电路无故障时的输出值g (Zj) 。 若g (Zj) ≠f (Zj) 则ANDj有故障, 算法结束; 若f (Zj) =g (Zj) 则ANDj无故障, 执行Step 3。

Setp 3 置jj+1, 若j<m+1, 转Step2;若j=m+1, 输出所有AND门无s-a-0故障的相关信息, 算法结束。

《3.3.2 对AND阵列s-a-1故障的定位》

3.3.2 对AND阵列s-a-1故障的定位

AND阵列的s-a-1故障主要有AND门的输入节点故障和输出节点故障, 把AND门的输出节点故障作为XOR树的输入节点故障处理, 这里仅考虑AND门输入节点的s-a-1故障。

算法3

Step 1 使控制输入C0=0;置j=1。

Step 2 对电路AND阵列的门ANDj, 依次确定其输入节点ui (i=1, 2, …, Kj, Kj为输入节点数) 和输出节点Yj的s-a-1故障, 置i=1。

Step 3 对门ANDj的输入节点ui, 生成矢量Ui, 使该节点ui值为0, 而使门ANDj的其他输入节点uj值为1, 对ANDj未使用的其他控制输入Ci (1≤i≤3) 值和原始输入值为0。施加矢量Ui, 记电路的输出为f (Ui) , 并计算电路无故障时的输出值g (Ui) 。 若f (Ui) =g (Ui) , 则ANDj的节点ui无故障, 执行Setp 4。若f (Ui) ≠g (Ui) , 则ANDj的输入节点ui或输出节点Yj有故障。由于在算法1中已对节点Yj的故障情况做了处理。若节点Yj有故障, ui就无s-a-1故障, 执行Step 4;若节点Yj无故障, ui就有s-a-1故障, 输出相关的故障信息, 算法结束。

Step 4 置ii+1, 若iKj , 转Step 3;若i>Kj , 执行Step 5。

Step 5 置jj+1, 若jm, 转Step 2;若j>m, 则所有AND门的输入节点无s-a-1故障。输出相关信息, 算法结束。

算法2和算法3说明:

1) 算法2中的矢量Zj和算法3中的矢量Ui有相同的性质, 都使所有门ANDs (s>j) 的输出Ys=0, 以及对AND阵列中的与门按AND1, AND2, …, ANDm的次序操作, 保证了算法的有效性。

2) 算法3中对无故障电路输出g (Ui) 的计算, 可根据逻辑函数GRM模式中每一积项的表达形式, 模拟计算在矢量Ui下每个门ANDk (1≤kj) 无故障时的输出值Yk 。若Yk中等于1的个数为偶数或0, 则电路输出Y=0, 为奇数时Y=1。算法2中g (Zj) 的计算与此类似。

3) 在算法2和算法3中, 对控制输入C1, C2C3的扇出分支节点, 可作为AND阵列中AND门的输入节点进行故障定位。

在具体进行故障定位时, 可首先对被测电路施加测试集T, 若发现电路有故障 (本文假定只发生一个故障s-a-0或s-a-1) , 再做故障定位。在做定位时, 若用电路每部分的测试集T1, T2T3能将故障确定于输入与控制、AND阵列、XOR树中的一个部分, 则只需对相应的部分进行, 否则首先对电路的输入与控制部分进行故障定位;然后对XOR树及AND阵列部分做故障定位。

《3.4 实验结果》

3.4 实验结果

已将如上故障定位方法用C++ 语言在586计算机 (Pentium4, 1.5 GHZ) 上实现, 实验时电路结构采用电路描述语言 (CDL) 描述;然后生成检测电路故障的测试集T;对电路依次设置每一节点的s-a-0或s-a-1故障, 并由算法来进行定位。选取了15个逻辑布尔函数, 变量最多的一个函数有19个变量, 25项积项, 图2所示电路是实验时选取积项数最少的一个。结果表明:故障定位准确率均为100%;对GRM电路节点的s-a-0或s-a-1故障进行定位所需的平均时间<2 min;随着电路规模的增大, 故障定位时间会有所增加。

《4 结论》

4 结论

在数字电路的可测性设计中, 研究逻辑函数电路可测性的实现具有实用价值, 逻辑函数的GRM形式可以使用AND阵列和XOR门树结构来实现, 用本文方法所得的电路是完全可故障定位的。此外, a. 本文采用增加三个控制输入C1, C2C3的方法, 在于减少GRM电路的测试集规模, 否则电路测试集规模会较大[6]。关于不使用控制输入并能得到规模较小的测试集的设计方法正在研究中。b. 对控制输入C0的故障定位, 在文中仅讨论了扇出源的情形, 但对其区分扇出源与扇出分支节点的故障, 也是可进行定位的。c.XOR门级联是XOR树的特殊情形, 因此在电路设计时可以用XOR门级联代替XOR树, 并不需要使用控制输入C1, C2C3, 可直接应用文中方法对故障做定位, 但整个电路的延迟比使用XOR树结构时要大一些。今后将在如何用较少的元件来实现电路的可测性、更有效的测试方法等方面做进一步研究。