atpg pattern generate flow introduction(stuck at)

紧接上一步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