atpg pattern generate flow introduction(at speed)

###接着是at speed 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_current_mode edt_at_speed
import_scan_mode edt_mode -fast_capture_mode on

与stuck at 类似不过这次fast_capture_mode on让tessent import configuration setting from tcd_scan

set_output_mask on

output 不要做fault detect process

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里面体现

下面是控制pattern power的选项可以不设置
set_edt_power_controller shift -constant_chains enable -repeat_fill none
set_power_control capture on -switching_threshold_percentage 16 -rejection_threshold_percentage 22
set_clock_restriction on

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_timing_exceptions_handling -ALLOW_Invalid_pin_names on
read_sdc xxx.sdc
如果设计当中有multicycle path 等path_exception 产生pattern前需要读sdc。(最好命令是cell对cell的) 否则工具按照默认一周期产生的pattern。 到时候gatesim仿真就过不去了。
如果pr有一些dft path 修不下去,在做后仿的atpg时候可以手动给endpoint false path 。 让pattern 过这段逻辑时候toggle慢一些。 代价可能是pattern count大,coverage 降低和仿真慢

set_system_mode analysis

set_fault_type TRansition

设置transition fault for at speed mode

report_procedures
report_clocks
report_core_instance
report_statistics -detail

set_xclock_handling x
set_external_capture_options -pll_cycles 8 [lindex [get_timeplate_list] 0]

设置第一个capture clock cycle edges 从8开始 具体可以查ug

create_pattern

创建pattern
report_procedures
report_power_metrics

report_scan_volume
report_statistics -detail
report_nonscan_cell
report_environment
做最后的check

最后把at speed pattern 写出来。这个时候就不写chain pattern了。 因为chain pattern是慢速test clock 下作的

write_pattern as_para_scan.v -verilog -parallel -scan -replace

write_pattern as_serial_scan.v -verilog -serial -scan -replace
同样你可以分段写出来
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
}

好了这就是at speed atpg 过程
如果是要WGL pattern
write_patterns xx/xx/xx/xx/pattern.wgl -Wgl -serial -patterns_sets scan -replace

1 个赞