1.为什么要在模块级做wrapping?
因为我们芯片越来越大,越来越复杂,如果把full chip当作研究对象去做ATPG的话,tool limit、test time、ATPG效率都难以接受,所以我们必须找到一个自下而上的方法,herical分层技术来实现对full chip的切割测试。在这种方法中,芯片可以分成多个较小的部分hardon_block或内核,可以有效地访问和处理。由于在内核级别生成模式,它导致引脚数量、内存和测试运行时间的减少。也可以并行运行内核。
core wrapping就是方法之一。我们把full chip切割成几十个core,然后在每个core的边界串一些wrapper chain把这个core包起来,实现对core的独立测试,剩下的core和core之间的逻辑就从top层面进行extest测试,因为wrapper链的存在intest测试和extest测试分开且互不影响。通过wrapper chain把每个core隔离测试出完pattern后,再从下往上的做pattern porting/retargeting,最后变成full chip的pattern。
2、工作原理
我们在串wrapper chain时其实就是在一个design里,把与func.input port交互的一些寄存器挑出来串成input wrapper chain,把与func.output port交互的一些寄存器挑出来串成output wrapper chain,剩下的寄存器放到internal chain。
三种工作模式:
-
Scancomp: intest测试且打开CODEC/EDT压缩
-
Wrp_if: intest测试bypass压缩逻辑(防止压缩逻辑出问题)
-
Wrp_of: extest测试
两种wrapper cell类型:
-
Shared wrapper cell(上图白色reg)
-
Dedicated wrapper cell(上图蓝色reg)
两种插入流程:
-
Simple core wrapping flow
-
Maximized reused flow(大芯片)
分为这三类chain:input_wrap_chain、output_wrap_chain、core_chain在内外两种工作模式下的状态:
intest:
extest:
专用和share型wrap_cell的区别:
Dedicated类型是工具自动插到design中的,有两个mux,第一个由shift_en控制选择fun.data还是test.data,第二个由capture_en控制选择func.data还是hold住上一拍的值(func.data直接从mux进入design,不会经过主寄存器,否则被打一拍会改变design的功能)
Shared类型就是复用design里本来就存在的功能寄存器。
如何选取这两类cell:一般设置成auto,让工具根据设计自己去权衡,也可以由于设计特点,设置独有的option
set_wrapper_configuration -classcore_wrapper \
-maximize_reuse enable\
-reuse_threshold N
-depth_threshold M
首先是把maximize_reuse使能起来。那工具在拿到我们的design时会怎么考虑到底是插入一个Dedicated WC还是复用Shared WC;-reuse_threshold N,是指定reuse Shared register的阈值:
假设这里N=2,对于input port A来说,工具会去trace A的fanout,发现能追到两级(<=2)register,那工具就会把这两个寄存器都换成Shared WC;对于input port B来说,工具能trace到三级register(>2),此时工具就会在portB后面插一个Dedicated WC,其他的寄存器就放到core chain上去测试。
-depth_threshold M,是指定port到WC之间的组合逻辑深度:
假设这里M=1,对于portA,它到第一级reg之间有一个与门,组合逻辑深度=1,所以工具会把它后面的register替换成Shared WC,对于portB,组合逻辑深度=2(>1),工具就会选择在portB后面插入一个Dedicated WC.
注意:有一些特殊的port是不能进wrapper chain的,常见的如Clock/Reset/Global test mode/DFT tdr/Power control/Analog control ports/ICL_ports/unconnected pi/po ,必须自主可控约束。
wrapper chain的条数、Dedicated WC的时钟来源(一般采用mini_occ的clk_out)等等。在这个过程中工具会去做一些balance,比如Dedicated WC不能太多,否则面积开销过大,但也不能全都是Shared WC,因为port到Shared WC之间的组合逻辑会被放到extest mode下去测,但我们还是希望尽量提高intest mode的coverage,放到外面还是比intest难测。
3、wrap_chain的时序问题
在intest测试的capture阶段,input wrapper chain需要一直做shift,这时候对于Shared WC来说,它的clock是function下的高频clock,在高频时钟下做shift,两级WC的Q--SI之间的path会天然存在timing violation,这个violation会直接导致后续ATPG后仿出现mismatch,并且function的ac coverage也会有所损失。有两个方法可以解决这个问题:
亡羊补牢法:
也分有没有对相关path设false path,如果设了,那就保证ATPG推pattern时读到这些false path,这时候仿真不会报mismatch;如果没设,就需要在ATPG阶段通过add_capture_masks对相关cell做mask。这两种只是仿真不报错,但coverage还是损失了。
未雨绸缪法:
在设计wrapper cell时就要想到这个问题,M家和S家的工具都是提供了option的,对于S家,有-hold_mux_for_shared_wrapper_cells enable这个option配合scan_enable信号可以改变WC的行为,具体来说:
对于Shared WC,工具在cti,即测试数据端口前面会加上一级mux,由总控dft_scan_SE来选择(capture时scan_SE=0,此时选择hold住当前值),在capture阶段就会一直在回环自己,Q--SI之间的path就不存在了。
对于Dedicated WC,工具不会改变它的结构,但是会改变第一个mux的选择端,也是直接连到总控scan_SE上,在capture时也是loop自己。这样可以从根本上解决coverage损失的问题。
注意:后仿过程中也会出现在AC测试时,hold_cell自身的Q-SI的时序修不干净,只能在atpg时读入false_path(采用set_false_path -through -*SI的规则)