背景介绍,crg模块中由于时间结构复杂,在DFT scan 时通常只有pll_chain 及 occ_chain,没有core_chain,使在DC test下coverage比较低,只测量了pll硬核的faults。
随着工艺制程的进步,需要对crg中其余逻辑也上chain,进而提高test coverage。
具体代码实现上有多种方法,如下是思路分享:
在DC下所有reg的ck pin 需要来自shift_capture_clk,此时需要对reg ck pin 之前增加mux,I0来自func原始连接,I1来自shift_capture_clk,S端可以来自人为添加的tdr方便控制。在ijtag/scan/atpg_dc时控制时钟来自shift_capture_clk,常见添加mux位置在pll的output,分频电路的output等。
在scan_sitich阶段,将occ单独成chain,pll单独成chain。其余均为core_chain。具体命令可用create_scan_chain_family命令区分,下面贴出了该命令后面可加的options。
create_scan_chain_family family_name
{ -include_elements obj_spec | -ordered_elements obj_spec }
[ -edt_instances obj_spec |
{-ssh_instance obj_spec [-ssh_chain_groups ssh_chain_group_list]} |
{-si_connections obj_spec -so_connections obj_spec }]
[ -si_associated_ports obj_spec -so_associated_ports obj_spec ]
[ -attribute_set_for_chain_assembly { attribute_list } ]
[ -single_attribute_set_chains { on | off } ]
[ -single_class_chains { on | off } ]
[ -single_clock_domain_chains { on | off }]
[ -single_clock_edge_chains { on | off } ]
[ -single_power_domain_chains { on | off } ]
[ -single_cluster_chains { on | off } ]
[ -single_wrapper_type_chains { On | Off }]
[ -port_index_start_value integer ]
[ -port_scalar_index_modifier integer ]
[ -chain_length { integer | unlimited }]
[ -chain_count { integer | unlimited }]
[ -si_port_format format ]
[ -so_port_format format ]
[ -si_timing { leading_edge | trailing_edge | any_edge } ]
[ -so_timing { leading_edge | trailing_edge | any_edge } ]
[ -lockup_cell_type { latch | flop }]
[ -si_lockup_cell_type { latch | flop }]
[ -so_lockup_cell_type { latch | flop }]
[ -unused_edt_pin_handling { auto | insert_pipelining_flop | tie_compactor_input }]
[ -si_pipelining { wrapper_chains_only | all_chains | off }]
[ -si_pipelining_type {non_scan_flop | holding_scan_flop}]
至此,crg模块中该上chain的应该都上了。但在AC下的bypass逻辑还没加。AC或者func下,crg中reg不能随意toggle,因为是对clk和rst进行控制的。
bypass逻辑思路:AC下我们只需要occ在chain上,让FF_reg能产生cap pulse。因此此时需要将pllchain、corechain bypass。在pllchain、corechain 的最后一个scancell后加mux,I1和scancell连接,I0连接一个bypass寄存器,S由tdr控制,Z还是原始连接。通过配置tdr的值,选择chain通或者被bypass。注意的是,这个bypass寄存器在AC or func 也连接到EDT或者SSN上,可能路径比较远,因此需要在bypass寄存器后插入一个latch方便timing收敛。
以上只是思路,实现方式需要结合是否有EDT/SSN[有的话是否有scan_signal_bypass]来定。
欢迎大家优化思路,批评指正。