原创 [转]ATPG之提高覆盖率,debug,STIL

2011-3-15 14:10 9052 9 9 分类: 消费电子

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bb2hh.blogbus.com/logs/60256218.html


说明:如需转载,请注明作者 出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指 正,讨论!!

在一个设计中如果reset同时做同步和异步复位。
或者reset作为数据输入会产生C26问题。
如下

会产生C26警告:

覆盖率(同tetramax中)如下:

处理方式1,通过在scan模式下将reset屏蔽掉:

不会产生C26警告

覆盖率(同tetramax)会降低:

处理方式2,将产生问题的信号设置称无效状态的常量:
set_dft_signal -view exist -port rst_n -type Constant -active 1
生成stil文件后,删除掉stil中procedure包含F{reset = 1}的句子。
tetramx中设置set_drc allow_unstable_set_resets.
覆盖率(scan)和最开始的情况一样。
但是tetramax中的覆盖率会提高.



版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bb2hh.blogbus.com/logs/60237492.html


说明:如需转载,请注明作者 出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指 正,讨论!!

ATPG debug要熟悉工具的一些功能。

STIL文件中定义的各种procedure与dft测试原理的对照。

一般shift过程之前有一个force Pi的过程。
由上图可以知道最主要的过程就是shift和capture,所以在自动向量生成过程中
最常见而必要解决的错误是shift错误和capture错误。

为了便于分析这些错误,TetraMAX提供了几个常见的视图,这些视图可以对照上图分析。
1.test_setup视图:主要用于查看分析在test_setup阶段出现的error

2.load_unload视图:主要用于分析查看load_unload阶段的问题

3.shift视图,主要用于分析查看shift阶段出现的问题

4.clock cone,clock off, clock on视图,主要用于查看和分析capture阶段出现的问题。

5.constraint视图:主要用于分析查看在fore pi以及其他约束情况下出现的error

常见ATPG rules错误分析。
1.scan chain blockage.(S1)
具体原因是因为clk或者reset,set或者数据不确定(x状态),导致数据无法向后传输。
如:reset没声明,或者reset在shift状态下没有稳定

scan的一些端口没有声明或者不稳定:

数据端口不稳定:

S1问题可以通过修改spf文件或者修改scan脚本解决。另外一些pad库也会导致这个问题。
2.Bidirectional Contention Problem(Z4)
这个问题一般发生在test_setup状态,由于双向总线上要求输入输出以及输出驱动至少有一个处于Z状态才算稳定,
所以在test_setup状态一些信号的初始化没有设置好,容易导致冲突:
如下:

这个问题可以修改spf文件的test_setup procedure,将双向的io force成z状态
3.bidi bus driver enable affected by scan cell(Z9)
这个问题的原因是因为总线的使能信号受到scan cell的影响,导致使能信号不稳定。
如下:

如果是顶层pad,可以将这个警告忽略不计。
或者可以加入MUX在测试模式下固定其为输入或者为输出。
或者调整工具的contention检查(set_contention bus -capture),让工具只检测clock前后的冲突
通常一些Z问题是因为io和输出驱动没有一个在Z状态(初始化或者在运行过程中)。

常见ATPG faults分析
1.AN - atpg untestable - notdetected
这个是由于一些TCS导致或者黑盒子的blockage或者latch不透明,导致观测端无法观测数据。
如:constraint引起的AN:

如:latch不透明引起的AN

lath引起的AN可以通过run_justification调整
2.UB-undetectable-blocked
UT-undetectable-tied
由于constraint导致的无法检测问题


版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bb2hh.blogbus.com/logs/60233278.html


说明:如需转载,请注明作者 出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指 正,讨论!!

stil文件是atpg的基础,用好atpg工具当然要熟悉stil格式。

下面是基本说明:)

STIL 1.0 {
Extension Design P2000.5;
}
Header {
Title " TetraMAX (TM) 2000.05-i000622_173054 STIL output";
Date "Wed Dec 31 17:21:05 1999";
History { }
}
Signals {
CLK In; RSTB In; SDI2 In; SDI1 In; INC In; SCAN In; HACKIN In; si4 In;
six In; D0 InOut; D1 InOut; D2 InOut; D3 InOut; SDO2 Out; COUT Out;
HACKOUT Out; so4 Out; sox Out;
}
SignalGroups {
_pi = 'D0 + D1 + D2 + D3 + CLK + RSTB + SDI2 + SDI1 + INC +
SCAN + HACKIN + si4 + six';
_default_Clk1_Timing_ = 'RSTB';
_io = 'D0 + D1 + D2 + D3' { WFCMap 0X->0; WFCMap 1X->1; WFCMap
ZX->Z; WFCMap NX->N; }
_po = 'SDO2 + COUT + D0 + D1 + D2 + D3 + HACKOUT + so4 + sox';
_default_In_Timing_ = 'D0 + D1 + D2 + D3 + CLK + RSTB + SDI2 +
SDI1 + INC + SCAN + HACKIN + si4 + six';
_default_Out_Timing_ = 'SDO2 + COUT + D0 + D1 + D2 + D3 + HACKOUT
+ so4 + sox';
_default_Clk0_Timing_ = 'CLK';
}
ScanStructures {
// Uncomment and modify the following to suit your design
// ScanChain chain_name { ScanIn chain_input_name; ScanOut chain_output_name; }
}
Timing {
WaveformTable _default_WFT_ {
Period '100ns';
Waveforms {
_default_In_Timing_ { 0 { '0ns' D; } }
_default_In_Timing_ { 1 { '0ns' U; } }
_default_In_Timing_ { Z { '0ns' Z; } }
_default_In_Timing_ { N { '0ns' N; } }
_default_Clk0_Timing_ { P { '0ns' D; '50ns' U; '80ns' D; } }
_default_Clk1_Timing_ { P { '0ns' U; '50ns' D; '80ns' U; } }
_default_Out_Timing_ { X { '0ns' X; } }
_default_Out_Timing_ { H { '0ns' X; '40ns' H; } }
_default_Out_Timing_ { T { '0ns' X; '40ns' T; } }
_default_Out_Timing_ { L { '0ns' X; '40ns' L; } }
}
}
}
PatternBurst _burst_ { PatList {
_pattern_ {
}
}}
PatternExec {
PatternBurst _burst_;
}
Procedures {
capture_CLK {
W _default_WFT_;
forcePI: V { _pi=\r13 # ; _po=\j \r9 X ; }
measurePO: V { _po=\r9 # ; }
pulse: V { CLK=P; _po=\j \r9 X ; }
}
capture_RSTB {
W _default_WFT_;
forcePI: V { _pi=\r13 # ; _po=\j \r9 X ; }
measurePO: V { _po=\r9 # ; }
pulse: V { RSTB=P; _po=\j \r9 X ; }
}
capture {
W _default_WFT_;
forcePI: V { _pi=\r13 # ; _po=\j \r9 X ; }
measurePO: V { _po=\r9 # ; }
}

// Uncomment and modify the following to suit your design
// PRE_CLOCK_MEASURE Procedures {
// load_unload {
// W _default_WFT_;
// C { test_so=X; test_si=0; test_si2=0; test_so2=X; clk=0; tclk=0; reset=1; test_se=1; }
// Shift { W _default_WFT_;
// V { _si=#; _so=#; CLK = P; }
// }
// }
// TMAX GENERATED POST_CLOCK_MEASURE (Closer to DFTCompiler Procedures {
// load_unload {
// W _default_WFT_;
// C { test_si=0; test_si2=0; clk=0; tclk=0; reset=1; test_se=1; }
// V { _so=##; }
// Shift { W _default_WFT_;
// V { _si=##; _so=##; clk=P; }
// }
}
MacroDefs {
test_setup {
W _default_WFT_;
V { CLK=0; RSTB=1; }
}
}

开始版本和头不用说。
1.定义设计的信号,即那些是输入信号,哪些是输出信号,那些信号是输入输出。
eg.
Signals {
CLK In; RSTB In; SDI2 In; SDI1 In; INC In; SCAN In; HACKIN In; si4 In;
six In; D0 InOut; D1 InOut; D2 InOut; D3 InOut; SDO2 Out; COUT Out;
HACKOUT Out; so4 Out; sox Out;
}

2.定义信号组:
_in = input pins
_out = output pins
_io = bidirectional pins
_pi = inputs + bidirectional pins
_po = outputs + bidirectional pins
_si = scan chain inputs
_so = scan chain outputs
设置时钟的信号组
eg.
SignalGroups {
_pi = 'D0 + D1 + D2 + D3 + CLK + RSTB + SDI2 + SDI1 + INC' ;
_io = 'D0 + D1 + D2 + D3' ;
_po = 'SDO2 + COUT + D0 + D1 + D2 + D3 + HACKOUT + so4 + sox';
_default_Clk0_Timing_ = 'CLK';
}
3.定义扫描链结构
eg.
ScanStructures {
ScanChain "c1" { ScanIn SDI2; ScanOut SDO2; }
ScanChain "c2" { ScanIn SDI1; ScanOut D1; }
ScanChain "c3" { ScanIn DIN; ScanOut YABX; }
ScanChain "c4" { ScanIn "IRQ[4]"; ScanOut XYZ; }
}
对于双向io还有额外参数WFCMap设置多状态情况下的值
4.定义信号组各种状态的时序
如时钟周期,输入0,1,z,n。输出h,l,t,x。
其中0,表示输入0;1,表示输入1;z,表示输入关闭,n,表示输入未知。
h,表示输入出为高,l,表示输出为低;t表示输出关闭,x表示输出无操作
P表示脉冲,D表示强制为低,U表示强制为高
eg.如下,定义了输入的0,1,N,Z的时序以及Clock,reset的脉冲波形,输出的H,L,T,X波形。
Timing {
WaveformTable _default_WFT_ {
Period '100ns';
Waveforms {
_default_In_Timing_ { 0 { '0ns' D; } }
_default_In_Timing_ { 1 { '0ns' U; } }
_default_In_Timing_ { Z { '0ns' Z; } }
_default_In_Timing_ { N { '0ns' N; } }
_default_Clk0_Timing_ { P { '0ns' D; '50ns' U; '80ns' D; } }
_default_Clk1_Timing_ { P { '0ns' U; '50ns' D; '80ns' U; } }
_default_Out_Timing_ { X { '0ns' X; } }
_default_Out_Timing_ { H { '0ns' X; '40ns' H; } }
_default_Out_Timing_ { T { '0ns' X; '40ns' T; } }
_default_Out_Timing_ { L { '0ns' X; '40ns' L; } }
}
}
}
5.定义各种操作的时序,如:
capture_RSTB {
W _default_WFT_;
forcePI: V { _pi=\r13 # ; _po=\j \r9 X ; }
measurePO: V { _po=\r9 # ; }
pulse: V { RSTB=P; _po=\j \r9 X ; }
}
由于atpg是基于周期的,所以一个向量V即可表示一个周期 ,另外F表示force,force信号为固定值;C表示condition,满足某一条件,向下进行。
定义了一个capture_RSTB的操作,这个操作使用_default_WFT_定义的x信号组的状态时序,包含3个周期
第一个周期forcePI操作,#表示输入,\r表示重复,\j表示连接。所以第一周期表示信号组_pi输入13个数据,信号组_po的每个信号在原来的值基础上连接上一个x
第二个周期measurePo操作,_po得到9个输出.
第三个周期pulse操作,产生RSTB脉冲,信号组_po重新连接上9个x

WFT : waveform table, 在timing procedure 定义
调用WFT时,用W来引用
F:表示force signal
V:表示一个cycle,例如,"rst"=1, "clk"=P
C:表示一个条件的判断conditional

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条