热度 9| |
1. DFT准备:
一、定义测试协议
1.set_dft_signal:
功能:用来指定输入输出端口为DFT信号。
选项:
view ---有两种类型,一种是existing_dft,一种是spec。所谓existing_dft,就是告诉工具,这个port已经被用作某种类型的DFT信号了,此时扫描链已经插入了。所谓spec,就是告诉工具,下面指定的port将被用做某种类型的DFT信号。
type---用于指定DFT信号的类型,包括:Reset,Constant,TestMode,TestData,ScanDataIn,ScanDataOut,ScanMasterClock,ScanSlaveClock等。
port---用于指定规则适用的端口。
active_state---用于指定Reset,ScanEnable,TestMode,Constant是高电平有效,还是低电平有效。
timing---用于指定ScanClock的波形。
例子:
set_dft_signal -view existing_dft -type ScanClock -timing {45 55} -port Clk
set_dft_signal -view existing_dft -type Reset -active_state 0 -port Reset
2. create_test_protocol:
功能:根据当前设计指定的规则,比如set_dft_signal,set_scan_path,set_scan_configuration。来创建测试协议。
选项:infer_clock,infer_asynth。如果先前没有对clock和异步信号进行指定,可以由DFT Compiler自己去判断哪个是clock,哪个是异步信号。(不推荐)。
创建完测试协议后,可以通过write_test_protocol -output XXX.SPF命令将其输出到文件,该文件的格式是SPIL格式。
二、DFT的设计规则检查
dft_drc:对先前指定的规则检查test DRC
三、对RTL test DRC的检查
需要理解各种violation,主要的violation有三种。
第一种是阻止扫描链的插入违例。主要的原因有:时钟不可控,latch在时钟周期开始的时候就使能,异步控制信号处于有效的状态。
第二种是阻止采样数据的违例。主要的原因有:时钟信号作为寄存器的数据输入端,黑盒产生的信号控制时钟端或者异步控制端,源寄存器在目的寄存器获取数据之前又采样了新的数据,三态总线冲突。
第三种就是影响fault覆盖率的违例。比如时钟作为数据,多个时钟驱动一个寄存器,以及黑盒。
2. 扫描单元替换(scan replacement):
所谓scan replacement,顾名思意就是在设计中用扫描单元替代非扫描单元。如果设计是以RTL形式给出的,则在RTL综合成门级网表的过程中自动插入扫描单元。如果设计是以门级网表给出来的,则专门做一次扫描替换。
流程:1.选择扫描链的策略---> 2.test DRC检查---> 3.带扫描链的综合
在做扫描链之前,还需要考虑下面问题:
1 .根据目前设计的格式,选择插入扫描链的流程。
如果是RTL或者未优化的门级设计,则采用test-ready Compile,如果是优化的门级设计,采用constraint-optimized插入方式。test-ready Compile包括逻辑优化和扫描链插入。采用的命令就是 compile -scan。优点就是流程简单,能够得到更好时序和面积。注意test-ready Compile只是将单元替代,并没有将扫描单元连接来。
2.找出扫描替代的障碍。
障碍有很多种啊,比如本身工艺库就不提供扫描单元,或者某些寄存器找不到相对应的扫描单元,或者设计本身有dont_touch属性或者scan_element属性为false等等。(set_scan_element truefalse [get_cells ADA])扫描链类型本身有带mux的寄存器,LSSD,clocked SD。具体选择那一个要考虑到工艺库和本身的设计,一般采用带mux的寄存器。有两种方式来设置扫描链的类型,一种就是设计test_default_scan_style变量。设置的方法跟tcl设置变量的方法一样,默认的是multiplexed_flip_flop。另一种设置的方式是set_scan_configuration -style来设置。
(tips:如何查看typical库中是否有扫描单元呢。
get_pins typical/*/* -filter "signal_type==test_scan_in")
在插入扫描链的过程中,可以指定扫描单元。使用的命令是set_scan_register_type。选项有-exact和-type,如果使用了exact选项,则在后面的优化过程中(compile -increment)仍然会保留只使用type列表中的扫描单元。(注意DC命令中类似的命令就是set_register_type)。
下面说说constraint-optimized的扫描链插入流程。包括插入扫描链,根据约束优化扫描逻辑,修正DRC错误。对于这种流程,输入可以是优化后的门级网表,可以不包含扫描单元,也可以包含扫描单元。这里需要用到的命令有:
set_drc_configuration
preview_dft.
3. pre-scan的test DRC
1.test DRC的流程
很简单,只要注意到只有在创建test_protocol之后才可能test DRC检查。
2.test DRC后时序单元的分类
分为两类,一类是有违例的,一类是没有违例的,需要对违例的时序单元进行违例排除。
3.模型的违例
黑盒违例:在链接库中找不到该cell。需要查看链接库是不是没有给全。DFTC会将黑盒看成一个时序单元。latch违例:DFTC找不到带扫描链的latch,就会把latch当成黑盒来处理。
4.设置时序的属性
两种strobe协议:一种是strobe_after_clock,一种是strobe_before_clock。默认是strobe_after_clock的。几个时序属性:test_default_period:定义测试周期,如果测试仪和被测芯片允许,可以设更小的值,默认是100ns。test_default_delay:定义输入延时,缺省值为5。test_default_bidir_delay:定义双向端口的时序。test_default_strobe:定义探测点的位置test_default_strobe_width:定义探测的宽度,默认为0。
5.创建测试协议
使用的命令就是create_test_protocol的方法。
6.屏蔽DRC错误
DRC错误按照严重程度可以分为:error,warning,ignore。可以使用set_dft_drc_rules来对某种错误进行降低或者升级处理,使用的方法就是set_dft_drc_rules -error XXX -cells YYY。如果要恢复到默认的等级,可以使用reset_dft_drc_rules。如果要查看DRC错误的等级,可以使用report_dft_drc_rules。
4. 构建test design
准备好设计之后,就可以考虑构建test design。
1.DFT规格的指定。
1.1 扫描链的构建
利用set_scan_configuration来对全局的scan chain进行配置。比如扫描链的类型,长度,个数等等信息。利用set_dft_signal来对指定test port管脚。这些都是全局性的配置。
除了对全局性的scan chain进行配置之外,也可以对某个特定的scan path进行配置。
利用set_scan_path来对scan path进行配置,这条命令可以对scan chain命名,指定扫描链的长度等等,功能很强大。option很多,建议看看man文档,这里挑几个常用的来说明。
<1> exact_length:指定某个扫描链的长度。例如:
set_scan_path chain_name1 -exact_length 10
如果要对整个扫描链设置长度。使用set_scan_configuration -exact_length来设置。
<2>complete trulefalse :指定当前的扫描链是否完备,如果完备,则insert_dft不会添加新的scan cell来balance 扫描链,否则就可以添加。
如何控制routing order呢?可以通过set_scan_path的-ordering_list选项来指定顺序。
一般扫描单元有两个输出,一个是scan_out,一个是其反相scan_out_inverted,DFT会根据时序选择一个好的,如果要改变默认的行为,可以将变量test_disable_find_best_scan_out置为true。
如何对扫描链进行重新连线呢?一般DFT为了优化设计,会进行下面的处理:会对扫描单元做单独的优化来满足时序等信息,如果插入的扫描单元不满足test DRC,会在insert_dft的时候,将其还原成原先的非扫描结构的形式。
如果不考虑优化来连接扫描链呢?这又叫做快速扫描链综合,比如在top层做扫描链,底层的扫描链都已经优化好了,在顶层只需要将其连接起来就可以了。又比如不想在logic综合中优化,而是放在后面的物理设计中优化,也可以先直接将扫描链先连接起来。可以使用命令set_scan_replacement -none_scan none_scan_cell_list -multiplexed_flip_flop scan_cell。
注意上面的命令的option必须成对出现,而且scan_cell只能有一个。
1.2 扫描信号的构建
如何抑制某些时序单元的scan替代呢?使用set_scan_element -false cell_list来实现。
如何对三态信号进行处理呢?为了防止出现bus竞争和bus漂移,DFT会在scan_shift的时候保证只有一个drive。DFT会自动判断内部的三态逻辑是否满足一个drive有效的要求,如果不满足,会自动在内部添加逻辑来满足要求。如果设计的逻辑本身已经加入了此种逻辑,则可以使用命令让DFT不用加入该disable逻辑。使用的命令是set_dft_configuration -fix_bus disable。如果采用bottom-up的方式来插入扫描链,需要注意在底层可以将fix_bus disable掉,但顶层需要将其enable。
如何对双向端口进行处理呢?同上面处理三态的方法一样,如果设计本身就包含处理的模块,那么可以使用set_dft_configuration -fix_bidirectional false。同理,DFT也提供了对特定的双向端口处理和全局的双向端口处理的命令。对特定的双向端口处理,可以使用set_auto_element的命令。
如何控制lock-up element的插入?如果相邻的时序cell是由不同的时钟来驱动的,那么DFT会默认在cell之间插入一个lock-up element。可以通过set_scan_configuration -add_lockup truelfalse来指定,也可以通过选项 -lockup_type latchflip_flop来选择插入的lock-up element的类型。
1.3 测试时钟的构建
需要特别注意的是多时钟的构建,DFT在默认的时候是为每个时钟域创建一个scan chain,当然可以使用set_scan_configuration -clock_mixing mixing_clocks就允许多个时钟域的信号位于同一个扫描链上。
还有就是内部时钟。默认情况下DFT在处理的时候会将所有内部时钟都由顶层定义的test clock来驱动。可以通过设置set_scan_configuration的-internal_clocks multi选项来将其当作不同的时钟,这样如果没有mixing的化,将会创建出两条扫描链,如果mixing的化,将会加入lock-up单元。
2.post_scan DRC的检查。
5. Report和Output File
1.preview_dft
功能:在做inser_dft之前查测试点的信息,扫描链的信息。根据这些信息来确定所加的dft 规格是否完备。
一般是在规则写完并进行dft_drc之后,用此命令查看信息。最常用的就是默认的不带任何option的preview_dft,下面是一个preview_dft的报告。
****************************************
Preview_dft report
For : 'Insert_dft' command
Design : clk
Version: X-2005.09-SP4
Date : Fri Dec 12 09:55:48 2008
****************************************
Number of chains: 1
Scan methodology: full_scan
Scan style. multiplexed_flip_flop
Clock domain: mix_clocks
Scan enable: scan_en (no hookup pin)
Scan chain '1' (data_in[0] --> data_out[0]) contains 31 cells
************ Test Point Plan Report ************
Total number of test points : 1
Number of Autofix test points: 1
Number of Wrapper test points: 0
Number of test modes : 1
Number of test point enables : 0
Number of data sources : 1
Number of data sinks : 0
**************************************************
Dft signals:
TestData: clk_in (no hookup pin)
TestMode: test_en (no hookup pin)
最常用的还有preview_dft show all和preview_dft -test_points all
2.insert_dft
功能:将非扫描的触发器用扫描的触发器替代,添加额外的逻辑来提高fc(需启动autofix),执行增量编译来修复timing和DRC错误。
3.dft_drc -coverage_estimate
功能:执行DRC检查和测试覆盖率的分析,在insert_dft命令之后执行。下面是一个报告。
In mode: Internal_scan...
Design has scan chains in this mode
Design is scan routed
Post-DFT DRC enabled
Information: Starting test design rule checking. (TEST-222)
Loading test protocol
...basic checks...
...basic sequential cell checks...
...checking vector rules...
...checking clock rules...
...checking scan chain rules...
...checking scan compression rules...
...checking X-state rules...
...checking tristate rules...
...extracting scan details...
-----------------------------------------------------------------
DRC Report
Total violations: 0
-----------------------------------------------------------------
Test Design rule checking did not find violations
-----------------------------------------------------------------
Sequential Cell Report
0 out of 31 sequential cells have violations
-----------------------------------------------------------------
SEQUENTIAL CELLS WITHOUT VIOLATIONS * 31 cells are valid scan cells
Information: Test design rule checking completed. (TEST-123)
Running test coverage estimation...
1394 faults were added to fault list.
ATPG performed for stuck fault model using internal pattern source.
----------------------------------------------------------
#patterns #faults #ATPG faults test process stored detect/active red/au/abort coverage cpu time
--------- ------------- ------------ -------- --------
Begin deterministic ATPG:
#uncollapsed_faults=1099,
abort_limit=10... 0 1098 1 0/0/0 99.35% 0.02 0 1 0 0/0/0 99.42% 0.03
Pattern Summary Report
-----------------------------------------------
#internal patterns 0
-----------------------------------------------
Uncollapsed Stuck Fault Summary Report
-----------------------------------------------
fault class code #faults
------------------------------ ---- ---------
Detected DT 1372 Possibly detected PT 0 Undetectable UD 14 ATPG untestable AU
8 Not detected ND 0
test coverage 99.42%
-----------------------------------------------
Information:
The test coverage above may be inferior than the real test coverage
with customized protocol and test simulation library.
4.report_scan_configuration
功能:报告scan的配置信息
****************************************
Report : Scan configuration
Design : clk
Version: X-2005.09-SP4
Date : Fri Dec 12 12:47:49 2008
****************************************
========================================
TEST MODE: all_dft
VIEW : Specification
========================================
Chain count: 1
Scan Style. Multiplexed flip-flop
Maximum scan chain length: Undefined
Physical Partitioning: Horizontal
Replace: True
Preserve multibit segments: True
Clock mixing: Mix clocks
Internal clocks: none
Add lockup: TrueLockup
type: latchInsert
terminal lockup: False
Create dedicated scan out ports: False
Shared scan in: 0
Bidirectional mode: No bidirectional type
Minimize Hold Time Violations: False
Maximum Addtional Wire Length (%): Undefined
Test Clocks by System Clocks: False
Hierarchical Isolation: False
Multiple Scan Enable: Disable
Pipeline Scan Enable: Disable
Voltage Mixing: False
5.report_dft_signal
功能:报告由set_dft_signal设置的内容项,可以分成-view spec和-view existing_dft分着报
6.report_scan_path
功能:报告由set_scan_path指定的path和insert_dft插入的scan path。
选项:-view当指定spec的时候,报告set_scan_path指定的路径,当指定为existing_dft的时候,报告由insert_dft插入的scan path.
-chain指定报告的具体chain,如要报告所有的chain,使用all。
-cell报告指定chain的cell。
总结:
==========================================================
#write out scan reports
report_scan_configuration > reports/scan_config
report_dft_signal -view existing_dft > reports/dft_signals
report_scan_path -view existing_dft -chain all > reports/scan_chains
report_scan_path -view existing_dft -cell all > reports/scan_cells
#write out netlist and spf file for Tetramax
change_names -rules verilog -hier
set test_stil_netlist_format verilog
write -format ddc -hierarchy -output mapped_scan/RISC_CORE.ddc
write -f verilog -h -o tmax/RISC_CORE_SCAN.v
write_test_protocol -o tmax/RISC_CORE_SCAN.spf
==========================================================
6. DFT基本流程:
加入 Scan-Chain 的标准流程流程图:
Step 1: Scan Ready Synopsys
在读入使用者的设计电路后, 下 compile -scan 指令: 程序会帮我们把电路中, 所有的 register 都置换成 Scan Flip Flop. Step
Step 2: Set ATE Configuration
这步骤的设定, 可以在 command mode 中指定, 也可以写在 synopsys_dc.setup 档中.主要是在设定将来 ATE 使用时, Timing 的规范.
test_default_period = 100
test_default_delay = 5
test_default_bidir_delay = 55
test_default_strobe = 95
test_default_strobe_width = 0
接着再把电路中, 会用到的 Test clock 作一个宣告.
create_test_clock –p 100 –w {45 55} clk_RTZ
create_test_clock –p 100 –w {40 20} clk_RTZ
Step 3: Pre Scan Check
check_test 指令:软件先帮我们简查之前的设定有无问题.
Step 4: Scan Specification
接着我们可以设定软件帮我们合成时, 要用多少 Scan-Chain, Scan-Chain 的 in, out port 的指定, Scan-Chain 的接法.
set_scan_configuration -chain_count 1
create_test_clock -period 100 -waveform. {40, 60} find(port, "CLK")
set_scan_signal test_scan_in -port "HRS"
set_scan_signal test_scan_out -port "SPEAKER_OUT"
set_scan_signal test_scan_enable -port "TEST_SE"
Step 5: Scan Preview
在此步骤前, Scan-Chain 都尚未被合成出来, 所以我们可以先预览合成结果, 觉得满意后, 再令软件把测试电路加入. 要预览合成结果, 使用preview_scan -show 或 preview_scan -script. 可以产生,可再利用 script
Step 6: Scan Chain Synthesis
这步骤就正试把测试电路合成进去,使用insert_scan 指令.
Step 7: Post-Scan Check
测试电路合成后, 有可能会再产生新的 violation, 所以我们还要再使用一次 check_test 指令, 如果有问题再将之解决掉.
Step 8: Estimate Test coverage
如果都没问题, 我们就可以来评估目前加入测试电路后, Fault Coverage 有多少. 用 estimate_test_coverage 指令. 如果 Coverage 不高, 看看是否有设了哪些 Constraints, 使得 Test Pattern 受到限 制或是之前是不是有 violations, 使得某些 register 没有加入 Scan-Chain 中.
Step 9: Save for TetraMAX
接着我们就可以把档案存起来, 交给 TetraMAX 来产生 Test Patterns 了. 需要存的档为合成后的.V 档, 和测试的设定档(STIL Protocol File) .SPF
wirte –hierarchy –format verilog –output ore_syn.v
wirte_test_protocol –format stil –out core.spf
7. DFT脚本示例(转载):
set WORK_DIR /usr/dc09/dc_scan
set target_library {fsa0a_c_sc_tc.db}
set link_library {* fsa0a_c_sc_tc.db}
set symbol_library {fsa0a_c_sc.sdb}
read_verilog $WORK_DIR/code/counter.v
current_design counter
link
remove_attribute [get_cells fsa0a_c_sc_tc/QDFZRBN] dont_use
remove_attribute [get_cells fsa0a_c_sc_tc/QDFZRBP] dont_use
remove_attribute [get_cells fsa0a_c_sc_tc/QDFZRBS] dont_use
remove_attribute [get_cells fsa0a_c_sc_tc/QDFZRBT] dont_use
set auto_wire_load_selection true
set_max_transition 0.2 counter
set_drive 2 [all_inputs]
#set_driving_cell -lib_cell QDFFRBN -pin Q -library fsa0a_c_sc_tc [get_ports
rst_n]
set_fanout_load 3 [all_outputs]
create_clock -name "clk" -period 10 -waveform. { 0 5 } [get_ports clk]
set_clock_uncertainty -setup 0.1 clk
set_clock_uncertainty -hold 0.1 clk
set_input_delay -max 2 -clock clk [all_inputs]
set_input_delay -min 0.1 -clock clk [all_inputs]
set_dont_touch_network [get_clocks clk]
set test_default_scan_style multiplexed_flip_flop
set test_default_delay 0
set test_default_bidir_delay 0
set test_default_strobe 90
set test_default_period 100
check_scan
compile -scan
insert_scan
check_scan
report_test -scan_path
estimate_test_coverage
write -format verilog -hier -o $WORK_DIR/netlist/counter_scan.v
write_test_protocol -format stil -o $WORK_DIR/netlist/counter_scan.spf