alphavor_jay的个人空间 https://blog.eetop.cn/840234 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Tips For DFT Compiler

热度 9已有 26221 次阅读| 2012-7-17 14:35 |个人分类:DFT Compiler

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

5

点赞

刚表态过的朋友 (5 人)

发表评论 评论 (12 个评论)

回复 saberhp 2012-7-23 15:46
我想请问一下,关于set_dft_signal -view existing_dft -type Reset -active_state 0 -port Reset这个命令从什么地方确定Reset为异步复位端口的啊?
回复 voliety 2013-5-4 19:54
很全很给力
回复 fat先生 2020-12-15 09:49
感谢分享
回复 Kingwhale 2022-5-27 16:59
mark
回复 dfhappyforever 2022-6-6 14:39
mark一下
回复 icyember 2022-6-14 14:22
mark一下~
回复 wts13588035346 2022-10-11 17:16
mark1111111
回复 yss_pku 2024-10-29 14:49
  

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 8

    粉丝
  • 0

    好友
  • 27

    获赞
  • 52

    评论
  • 2673

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 00:24 , Processed in 0.031705 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部