###接着是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