DFT下release的sdc主要包括三部分:
1、shift_sdc:
主要是检查scan_chain上寄存器q到si的timing情况;同时还要注意edt_logic和scan_chian之间的时序关系;channel_in/out或者wrap_cell_input/output的接口处的timing;处理的难点也在EDT和chain之间存在半周期收敛,即在shift_mode的时候,一正一负或者一负一正,存在setup只有半周期的slack,hoid的却有一个周期的slack,后期一旦setup出问题,只能降频。
Timing的处理方式:scan_chain上采用eco打拍(场景:跨时钟域时候,Q到si,Tessent工具会自动加lockup_latch_cell(向后借time)处理由于clk_skew过大导致的hold问题,同时还要考虑异步时钟分叉点过早,ocv影响,导致setup窗口被吃掉,对于大于100M的shift来说窗口更小,更危险,所以一般都是单时钟域收敛;对于带IP的模块,考虑ip内部的shift_timing是否和外部一致?ip_chain一般都固定好了,只能ip_chain_family处理;无法和外部同时去clk_domain,工具会报error);(场景:模块的规模可能很大,位置是畸形摆放,根据实际的pr位置来决定是否对链首链尾打拍或者链中间打拍,或者只针对违例的chain打拍)
edt逻辑内解压缩和压缩逻辑打拍(采用reg_cell,而不是lockup_latch_cell);edt到DFT逻辑打拍;latch到edt逻辑打拍;
寄存器和mem之间的打拍:根据项目经验一般对弈mem_clk大于800M的,在bist_data_in处打拍;
特殊情况,有些sram可能支持内部数字寄存器上chain测试,会留有si和so的pin;吃tcd自动上chain,就不要打拍处理了;但是注意有些sram的address_pin不一定能用内部的chain去shift和capture,所以为了提高覆盖率还是需要单独加一些hold_observe_cell去观察。
寄存器的rst,icg_gate,组合逻辑的gate,在shift时候都是确定值,所以不需要check时序;
shift时,没有进chain的寄存器不需要检查时序;
特殊机构:对于某些非wrap或者非partion的模块,模块内部没有OCC切换逻辑,只能用func_clk来驱动,也可以保证模块内部shift_timing收敛,但是从flat角度,即顶层来看,在一块出向量的时候,shif下由于flat dft_test_clk和func_clk的latency不一致,导致时序问题再次出现。解决办法:在模块级直接采用one_clk_Mux的方式,只用dft_test_clk,保证flat下模块级shift_timing完全收敛。但是mux带来的delay相对高频时钟来说很大,后端不一定能接收。
channel_in/out或者wrap_cell_input/output的接口处的timing:
一般channel_in/out分为内外部两部分:模块内指channel_in/out到edt的打拍,一般采取chan_in的第一级和chan_out的最后一级打拍pipie-reg_cell靠近端口排放,其余等距摆放;模块外指chann到Top的复用pad的路径,同样si的第一级和so的最后一级打拍pipie-cell靠近输入输出pad摆放,其他等距摆放。同时模块内的pipecell的时钟树尽可能的短。以上经验可以保证timing收敛更高,以及测试时间成本更小。
wrap_cell_input/output同理上述。
对于test_point(hold_cell型,clk来自dediceta_occ(快慢时钟都是silow_clk),rst来自ijtag_rst)来说:对于控制点,没有timing的影响,因为控制点触发器在捕获周期中捕获自己。 set_case_analysis control_point_en 0 确保:1.源触发器的保持路径不会放松;2.从源触发器到下一个SI引脚的扫描路径也不会放松
如果要在高速测试期间使用观察点observe_reg,那么它们必须满足从数据来源点开始的single_cycle_timing。在STA期间,用作“observe_point_en”的信号将不受约束,以允许STA工具检查这些单元的捕获和转移路径的时间。
如果在高速AC测试期间没有以满足观察点的单周期timing,则必须在ac_ATPG期间禁用该路径,通过使用“add_input_constraints observe_point_en -C0”。
由于sta和pr工具的操作方式不同,在STA期间使用“set_case_analysis”来防止检查给定路径上的计时,这将阻止Place and Route工具在同一路径上fix_timing。在慢速dc期间,这些单元格的保持路径必须满足timing要求,因此,应该使用set_false - setup - to <所有观察点flops>”
特殊:eco_chain的时序:为防止后期eco再次加入func_reg,这些reg进入eco_chian(一般设置多条,每条上有 1-2个dunmmy_reg)上时,需要打拍(latch)缓解hold问题。
如何书写shift_SDC:
creat_clock [get_ports name ] -add -period -waveform -name
set_clock_groups -async -name ijtag -group {ijtag_tck}
set_input_delay -clock ijtag_tck {ijtag_reset ijtag_ue ijtag_ce ijtag_si ijatg_sel }
set_ouput_delay -clock ijtag_tck {ijatg_so}
set_input_delay -clock tessent_virtual_force_pi {dft_scan_en dft_edt_updata *edt_chann_in* *wrapoc_si* }
set_input_delay -clock tessent_virtual_fmeasure_so {*edt_chann_out* *wrapoc_so* }
set_case_ana 1 rst_muxout_pin
set_case_ana 1 {ltest_en dft_scan_en all_test atpg_mode rst_sel} 注释:atpg_mode是icg_ip中mode选择信号,有多种mode选择控制Icg开关,控制功耗;rst_sel也是rst_ip的控制方式选择。
set_case_ana 1 */occ/test_mode_reg/Q
set_case_ana 0 inject_tck_mux_sel
set_false_path *cgc_SFIFT_REG_CLK/*
set_false_path cgc_fast_clock/*
set_multicycle_path -setup 2 -from *tessent_sib*/to_enable_int*
set_multicycle_path -hold 2 -from *tessent_sib*/to_enable_int*
set_multicycle_path -hold 1 -from edt_contro/low_pwr/low_power_hold_reg*
set_multicycle_path -setup 3 -through *edt_scan_out_buf/in -through *edt_scan_in_buf/in
set_multicycle_path -hold 2 -through *edt_scan_out_buf/in -through *edt_scan_in_buf/in
特殊的scan_mode_add的一些特殊信号:set_case_ana
2、dc_capture_sdc:
主要是检查q到D的时序,dc_scan_capture采用slow_clk;存在多个clk_group的(port_clk或者occ_gen_clk);同时存在和功能下相同的clk下的setup multicycle_path可以放松,但是若存在一正一负的情况,setup只有半T,没法放松;难点在于功能下的hold可以放松,但是dc_capture_mode下没法放松。
注意:setup 的timing一定是没有via的;hold_timing_via和func下基本一样多,若tycal or worst下的比func多,则有问题。
如何书写capture_SDC:
creat_clock [get_ports name ] -add -period $slow_period -waveform -name
creat_clock [get_ports ijtag_tck] -add -period 40ns -name ijtag_tck
set_clock_groups -async -name ijtag -group {ijtag_tck}
set_clock_groups -async -name dc_scan_async -group {func_clk bisr_clk div_clk scan_clk}
create_generated_clock [get_pins ] -divde -source -master -name -comb
set_input_delay -clock ijtag_tck {ijtag_reset ijtag_ue ijtag_ce ijtag_si ijatg_sel }
set_ouput_delay -clock ijtag_tck {ijatg_so}
set_multicycle_path -setup 2 -from *tessent_sib*/to_enable_int*
set_multicycle_path -hold 2 -from *tessent_sib*/to_enable_int*
clk来自上述clk_group:
set_multicycle_path -setup 2 -rise_form -rise_to
set_multicycle_path -hold 1 -rise_form -rise_to
set_multicycle_path -setup 2 -fall_from -fall_to
set_multicycle_path -hold 1 -fall_from -fall_to
set_multicycle_path -setup 2 -fall_from -rise_to
set_multicycle_path -hold 1 -fall_from -rise_to
set_multicycle_path -setup 2 -from tessent_virtual_force_pi -to clk
set_multicycle_path -hold 1 -from tessent_virtual_force_pi -to clk
set_multicycle_path -setup 2 -from clk -to tessent_virtual_measure_po
set_multicycle_path -hold 1 -from clk -to tessent_virtual_measure_po
set_input_delay -clock tessent_virtual_force_pi {func_clk bisr_clk dft_scan_clk ijtag_tck bisr_si ijtag_* }
set_input_delay -clock tessent_virtual_fmeasure_so {bisr_so ijtag_so }
set_case_ana 0 dft_scan_en dft_burn_in
set_case_ana 1 ltest_en all_test
set_multicycle_path -setup 2 -from dft_edt_updata dft_pad_reset
set_multicycle_path -hold 1 -from dft_edt_updata dft_pad_reset
set_multicycle_path -hold 1 -from edt_contro/low_pwr/low_power_hold_reg*
set_multicycle_path -setup 3 -through *edt_scan_out_buf/in -through *edt_scan_in_buf/in
set_multicycle_path -hold 2 -through *edt_scan_out_buf/in -through *edt_scan_in_buf/in
set_case_ana 1 */occ/test_mode_reg/Q
特殊的scan_mode_add的一些特殊信号:set_case_ana
3、mbist_func_sdc:
将tessent工具在mbist_gate下吐出来的mbist_sdc和func_sdc merge在一起减小sta_mode的种类,收敛mbist时序。
相当于dft_ac_capture的时序,除带iP的模块,存在bypass_dft_专有高频时钟,需要单独声明async_clk_group在sdc中。
但是容易出现假path,无法辨别是否。
注意:为防止occ_chain_reg时序出现问题,一般ocC的逻辑在pr时摆放在一起,保证occ内部的cts尽可能的短,以至就可以忽略时序问题。
对时序敏感的部分,DFT 会出cell.list抓取报告提供给pr,并指导摆放原则。
对于mem高频时序紧张问题,一般采用pr给的mem_group作为指导文件来分controler来做测试电路。