1、DFT需要定义signoff sdc
DFT(SCAN、MBIST、JTAG等)在测试模式下的电路结构、时钟路径、数据通路与功能模式完全不同,因此必须依靠专门的DFT sdc约束,才能正确的分析DFT相关时序:
(1)测试时钟(scan shift clock、ijtag clock等)通常是低速的异步时钟,与功能的normal时钟域相互隔离;
(2)扫描移位过程(shift)、扫描捕获(capture)过程和MBIST测试过程中,数据路径和时序要求存在较大差异性;
(3)若不做DFT signoff,测试时就会出现setup/hold 时序违例,导致测试向量失效和缺陷漏测;
(4)DFT SDC是ATPG流程中生成合理测试向量的前提,也是后端PR流程中优化测试逻辑的依据;
2、mbist timeplate
在DFT的mbist测试过程中的基本数据通路为:BAP ----> Mbist controller ----> mbist interface ----> memory,各个功能模块的功能为:
(1)BAP
a. 接收来自TAP的控制指令;
b. 下发配置信息:选择哪个待测memory,使用什么算法,是否全速测试,是否处于诊断模式等;
c. 下发启动信号:start、reset、bist_en;
d. 回收测试结果:done、go、故障信息;
整个BAP在ijtag_tck的驱动下进行工作,同时产生了两路时钟分支,一路去到了Mbist controller,另一路去到了Mbist interface。
(2)Mbist controller
a. 接受BAP下发的指令;
b. 内部的状态机跑March算法;
c. 产生地址、数据、片选、读写使能等控制信号;
d. 回读memory数据并比较;
e. 输出done、go、故障信息;
整个controller在ijtag_tck和bist_clk的驱动下工作。
(3)Mbist interface
a. 做功能模式和测试模式的MUX切换;
b. 把controller输出的地址、数据和控制信号送给memory;
c. 把memory的读出数据传回controller比较;
d. 隔离功能逻辑,防止测试时相互干扰;
整个controller在ijtag_tck和bist_clk的驱动下工作。
因此,mbist的时序场景等效于:先在ijtag时钟的驱动下完成配置信息的加载,接着在bist时钟的驱动下完成算法的执行;最后在ijtag时钟的驱动下将比较结果和debug信息移位到ijtag_tdo进行观察。
此时ijtag的时序场景和scanshift的场景是不一样的,所以需要在mbist mode下再看一遍;而bist clock的时序场景有一部分是和scanhscap的场景重合,剩下的场景是关于memory本身的,这是需要看的。总的来说,时序收敛的难度体现在与memory本身有交互的path上。
下面将介绍mbist的约束文件应该怎么定义。注意:该约束文件是在子系统层级完成的。
(1)先定义所有的与mbist测试相关的function时钟,以此来cover所有memory的路径时序;虽然 scanhscap过程涉及的高速接口不参与mbist测试过程,但是mbist模式的时序收敛更快,能更快的发现接口时序问题,于是仍然定义了针对input ports和output ports的virtual clock,直接follow hscap中的约束就行。
################################################################################################################################
# 1. define mbist function clock, clock is for Q ---> D path. because OCC is not inserted, so design has not high speed reg(free running)
############################################################################################
# 1.1. 800M
create_clock -name func_i_crm2mem_mmu_aclk_800M -period 1.25 -waveform { 0 0.625 } [get_ports i_crm2mem_mmu_aclk]
create_clock -name tessent_virtual_input_output_800M -period 1.25 -waveform { 0 0.625 }
############################################################################################
############################################################################################
# 1.2. 50M
create_clock -name func_i_pad2mem_sd_emmc_jtag_tck_50M -period 20 -waveform { 0 10 } [get_ports i_pad2mem_sd_emmc_jtag_tck]
create_clock -name tessent_virtual_input_output_50M -period 20 -waveform { 0 10 }
############################################################################################
############################################################################################
# 1.3. 600M
create_clock -name func_i_crm2mem_src_600M_clk_600M -period 1.66 -waveform { 0 0.83 } [get_ports i_crm2mem_src_600M_clk]
create_clock -name tessent_virtual_input_output_600M -period 1.66 -waveform { 0 0.83 }
############################################################################################
############################################################################################
# 1.4. 100M
create_generated_clock -name func_i_crm2mem_src_600M_clk_u_duse_div6 -source [get_ports i_crm2mem_src_600M_clk] -edges { 1 7 13 } -add -master_clock [get_clocks func_i_crm2mem_src_600M_clk_600M] [get_pins u_duse_subsys_crm/u_duse_div6/clk_top_pll_div_apb_src_inst/clk_div_reg/Q]
create_clock -name tessent_virtual_input_output_100M -period 10 -waveform { 0 5 }
############################################################################################
############################################################################################
# 1.5. 200M
create_generated_clock -name func_i_crm2mem_src_600M_clk_u_duse_div3 -source [get_ports i_crm2mem_src_600M_clk] -edges { 1 4 7 } -add -master_clock [get_clocks func_i_crm2mem_src_600M_clk_600M] [get_pins u_duse_subsys_crm/u_duse_div3/clk_odd_div_inst/clk_out_reg/Q]
create_clock -name tessent_virtual_input_output_200M -period 5 -waveform { 0 2.5 }
############################################################################################
############################################################################################
# 1.6. scan_cr_clk
create_generated_clock -name dft_top_scan_cr_clk_100M -source [get_pins u_duse_subsys_crm/u_duse_div6/clk_top_pll_div_apb_src_inst/clk_div_reg/Q] -edges {1 2 3} -add -master_clock [get_clocks func_i_crm2mem_src_600M_clk_u_duse_div6] [get_pins u_ufs_top_wrapper/mem_subsystem_occedt_tessent_occ_mem_subsystem_scan_cr_clk_inst/tessent_persistent_cell_clock_out_mux/Z]
############################################################################################
############################################################################################
# 1.7. u_duse_div3
create_generated_clock -name dft_top_u_duse_div3_200M -source [get_pins u_duse_subsys_crm/u_duse_div3/clk_odd_div_inst/clk_out_reg/Q] -edges {1 2 3} -add -master_clock [get_clocks func_i_crm2mem_src_600M_clk_u_duse_div3] [get_pins u_duse_subsys_crm/mem_subsystem_occedt_tessent_occ_mem_subsystem_u_duse_div3_inst/tessent_persistent_cell_clock_out_mux/Z]
############################################################################################
################################################################################################################################
(2) 再定义所有的与mbist测试不相关的function时钟,这里只需要保证避免出现unclocked register的warning就行;
################################################################################################################################
# 2. define nombist function clock, clock is for Q ---> D path. because OCC is not inserted, so design has not high speed reg(free running)
########################################################################################

&spm=1001.2101.3001.5002&articleId=159488108&d=1&t=3&u=5b12df35f53d4cb2b4003d0795b5c5b9)
809

被折叠的 条评论
为什么被折叠?



