紧接上一步scan flow introduction 。下来我们开始atpg pattern create
###首先是stuck at fault pattern
set_context patterns -scan
设置atpg pattern context
set_tsdb_output_directory …/tsdb_outdir
不解释
read_cell_library xxx.mdt
read_verilog xxx/mem -interface_only -exclude_from_file_dictionary
read_core_description xx/xx/xx/*.lvlib
和前面的flow一样
read_design $design_name -design_id gate -verbose
读scan chain 后的netlist 进来
set_module_matching_options -suffix_pattern_list {_[0-9]+.*} -regexp
set_current_design $design_name
和做scan chain时候一样
set_design_level chip
设置design level 前面flow也解释过了
set_current_mode edt_stuck_at
自己命名一个mode
import_scan_mode edt_mode
上一次穿scan chain add 的mode添加进来 ,让tessent import configuration setting from tcd_scan.
默认是slow mode 如果加-fast_capture_mode on 就是at_speed configuration, 我们这个是slow pattern
add_black_box -auto
set_static_dft_signal_values memory_bypass_en 1
set_static_dft_signal_values tck_occ_en 1
设置dft_signal value. 这个设置的value会在pattern里面体现
report_dft_signals
不解释
add_nofaults -instance { inst_clock_gen/rst inst_clock_gen/cgu }
为了提高coverage 没有上chain的不要添加fault
set_output_mask on
output 不要做fault detect process
add_input_constraints -slow_pad -bidi_only
report_input_constraints -slow_pad -bidi_only
除了scan 用到的boundary pad 都设置X 不观测
source xxxx/xxx/tdr_ctrl.pdl
用proc 控制tdr 来把tdr multiplexing 设置1 (如果第一步加tdr加了multiplexing的话) 把一些pll该设置定值的设置, 其实就是可以理解为手写的一部分控制pattern pdl
大概就这样
iProcsForModule design_name
iTopProc ctrl_pll_proc { } {
iWrite pll_tdr_inst.sel 0b1
iApply
…
iRunLoop -time 10us
iApply
}
下来该设置setup procedure. 就是scan 测试一开始时候就要进行的操作,这个操作先于所有pattern
set_procfile_name xxx/xxx/scan.setup.proc
scan.setup.proc 里面大概就这样
set time scale 1 ps;
set strobe_window time 10000000;
//以test clock 周期24M为例
timeplate tp =
force_pi 0 ;
measure_po 10400; // 1/4 周期
pulse_clock 20800 31200; // 1/4 占空比
period 41600; 步进长度一个周期
end;
procedure setup_proc =
timeplate tp;
cycle =
force DFT_MODE 0;
force RESET 0;
pulse TEST_CLOCK_AUL_PORT;
end;
cycle =
end;
cycle =
end; // 走两个步进长度
cycle =
force DFT_MODE 1;
pulse TEST_CLOCK_AUL_PORT;
end;
cycle =
forece RESET 1;
pulse TEST_CLOCK_AUL_PORT;
end;
cycle =
pulse TEST_CLOCK_AUL_PORT;
end;
end;
// 复位dft reset 完成setup 操作 期间需要test_clock 参与
add_clock 0 PLL_REF_CLK -PEriod 41.6ns -PULSE_Always
PLL ref clock always toggle
set_system_mode analysis
report_procedures
切换analysis mode 报告procedure
add_fault -all
添加所有fault (stuck at fault 包含在内做slow capture 测试) 具体有哪些fault可以查tessent ug
set_xclock_handling x
report_clock
report_core_instances
report_edt_configuration
report_statistics
做create_pattern 前的最后检查
create_patterns
create patterns
set_relevant_coverage -exclude AU.TC
set_relevant_coverage -exclude AU.PC
tie cell和 constant pin value 不care不包含在coverage里
report_statistics -detail
report_procedures
report_scan_volume
report_nonscan_cell
report_environment
做create pattern后的check
最后把scan chain parallel serial pattern 都写出来
write_pattern para_scan.v -verilog -parallel -scan -replace
write_pattern para_chain.v -verilog -parallel -chain -replace
write_pattern serial_scan.v -verilog -serial -scan -replace
write_pattern serial_chain.v -verilog -serial -chain -replace
为了提高仿真速度也可以把scan& chain 的 parallel serial pattern分段写出来
也可一段一段写比如
for {set a 0 } {$a < 5} {incr a} {
set start [expr $a*100]
set end [expr ($a+1)*100-1]
write_pattern para_scan_${a}.v -verilog -parallel -scan -replace -start $start -end $end
}
这样比如5个pattern.v一组写100个出来。 提前要做好测试设置好最后的上限比如500个要超过最后的上限。否则写的pattern少了可不行。 create_pattern log可以看pattern 个数
parallel pattern 个数会比serial多
好了这就是stuck at atpg flow
如果是要WGL pattern
write_patterns xx/xx/xx/xx/pattern.wgl -Wgl -serial -patterns_sets scan -replace