Tessent scan & ATPG(2) ATPG basic flow

ATPG 的基本步骤

在这里插入图片描述

DFT lib

一般vendor会提供
也可使用 tessent 的libcomp工具 将simulation lib转化为 DFT lib
什么是 simulation lib ? 是仿真专用的库吗? 那仿真和综合 布局布线为什么要分开来?

black boxes

存在一些block 不需要做scan chain的 就可以定义为black box;
在这里插入图片描述

#example
add_black_boxed -module core
#改变black box 的输出行为
add_black_boxes -instances /instA -pin Aout Z
#恢复原始的模型
delete_black_boxes -module core
#or
delete_black_boxes -ALL
# report
report_black_boxes -ALL
ATPG setup

在此之前 你需要准备好 已经插入扫描链的门级网表. 以及DFT library.
同样存在两个 flow ,区别在于其输入的文件不同

  1. legacy flow
    需要 test procedure 文件以及 setup文件即dofile(包含扫描链插入工具导出的setup信息,插入到设计中的test structure信息以及时钟和控制信号的定义).
  2. TSDB flow
    其输入为tessent 工具专用的数据库结构
procedure 文件

主要是 测试的具体流程 每个动作发生的周期等信息;主要分下面几个部分:
timeplates:
定义test cycle的时序,就是下面每一个具体操作的周期.
test_setup: 一个初始化,就是将设计切换到test mode
load_unload/shift : 定义如何在一个scan group中load unload 我们的扫描链.
capture : 一般会有专门的定义.不是必须的,默认不在procedure文件中表达
从下图也可看出 整个test procedure所要描述的东西:
在这里插入图片描述

example

在这里插入图片描述

#example 对应上图的时序 
timeplate tp1 =
    force_pi 0;
    measure_po 10; #measure po 是在10ns 也就是 这是pre_clock 的measure
    pulse Clk 20 10; #20-30ns 是clock处于on状态的时间 也就是时钟的高电平的持续时间是10ns.
    period 50;#时钟周期是50ns
 end
 #定义procedure 每个步骤都会执行 force pulse 的操作. 都会调用 template 的单周期的配置.
procedure test_setup = #可见此单个procedure中 有两个 cycle  每个cycle 在无其他force 的情况下 应该与 timeplate 中的配置一致.
timeplate tp1 ;
cycle =
    force Clk 0 ; #force clk为0 
    force ScanEn 0;
    pulse Clk ; # 没有参数 怎么pulse 按timeplate的?
end;
cycle =
 pulse Clk;
end

procedure load_unload =
    scan_group grp1 ;
    timeplate tp1 ;
    cycle = 
        force Clk 0;
        force ScanEn 1;
    end ;
    apply shift 2;#调用shift 的procedure 两次
end ;

procedure shift =
    scan_group grp1 ;
    timeplate tp1 ;
    cycle =
        force_sci;
        measure_sco;
        pulse Clk ;
    end
end;

procedure capture =
scan_group grp1;
timeplate tp1;
    cycle =
        force ScanEn 0;
        force_pi;
        measure_po;
        pulse_capture_clk;
    end;
end;

下面再单独详细的介绍每一个部分;

1. timeplate

在这里插入图片描述

timeplate 定义的是一个周期内的信号变化,以及测试的操作.是和ATE (自动测试设备)的cycle强相关的; 所以timeplate内的操作并不是随便设置的 需要和测试工程师沟通. timeplate定义的数量 也和ATE机台的限制,也要结合设计的需求去设计.

两个经常用到的statement:

  1. pulse 后面有两个参数 一是脉冲发生时间,一是脉冲持续时间.像上例中没有 时间标注的 怎么理解.
  2. force 强制赋值non-return 的输入. 后边也有参数 为强制赋值的周期坐标.
2. force_sci & measure_soc

在 shift 的操作中 使用force_sci 和 measure_sco
指定数据输入和测试输出的时间点. 默认force_pi和force_sci measure_po和measure_sco 在cycle内发生的时间点是一样的,只是一个在shift 阶段一个在capture 阶段.

在这里插入图片描述

如图所示, 0ns force_sci
10ns measure_sco
20ns pulse shiftclk
(老师只是嘴上说,没有参数 如何判断timing point)

Dofile
example
#里面只要是 scan chain 的相关信息
proc tessent_scan_common {} {
add_clcoks 0 clk
}
proc tessent_scan_unwrapped_mode{}{
add_scan_groups grp1 results/pipe_scan.testproc
#定义scanchain 的分组 以及其使用的tesproc文件
add_scan_chains chain grp1 {/ts_si[1]}{/ts_so[1]} 
#添加 设计中已经存在的scan chain 到我们定义的scan group 中 并说明 scan chain 的输入输出.
tessent_scan_common
}
proc tessent_scan_setup {{mode unwrapped}}{
switch -exact -$mode{
    unwrapped {tessent_scan_unwrapped_mode}
    default{
        display_message -error "invalid scan mode: $mode"
        }
    }
}

tcl中的proc 过程, 类似C 中的函数, proc add{x y}{expr x + x+ x+y} 第一个中括号是参数列表 第二个中括号是具体的执行内容.

Dofile 中对scan chain 的定义

也就是说 工具在 ATPG 的DRC 阶段 会借助Dofile 和test procedure文件中的定义 对scan chain 进行trace;

默认情况下 是从scan chain的输出 往前trace,为scan cell 进行排序也是从后往前.

Dofile 中的 clock 和control信号的定义

两种定义的方法

  1. 使用analyze_control_signals 去自动识别(识别每一个时序单元(DFF,latch,RAM,ROM,等)上所有控制信号(包括 clock,set,reset,read_control,write_control等)),他trace 的全都是普通的组合逻辑门,也就是说不一定完全符合你的额要求.

  2. 使用 add_clock是 去手动添加.
    在这里插入图片描述

add_clocks 中clock 的off状态 决定了cycle中的leading edge.

add_clock 0 /CLkA
#参数1 为clock 的off state, 参数2,Clk4 为时钟引脚;

时钟从off state 到on state 的转变 叫leading edge;

DC scan insertion flow

如果使用DC 去插扫描链, 如何走ATPG的flow
在这里插入图片描述

使用 stil2mgc 指令将SNPS STIL文件转化为 Dofile 和 procedure文件,再走下面的flow.

stil2mgc -stil cpucore.stp -tpf cpucore.tpf -dofile cpucore.do

ATPG process

setup -> design_rule check -> configure ATPG -> Generate Patterns -> save Results

1. setup
set_context patterns -scan #设置Tessent shell context
read_verilog #读入 scan inserted 的网表
read_cell_library ../libs/adk.atpg #读入ATPG的库
set_current_design #指定设计的顶层
add_black_boxes -auto #根据需要添加 blackbox
analyze_control_signals -auto_fix # 定义时钟 和控制信号
add_input_constraints control -C0 #设置测试的输入约束
# add_input_cons的优先级是没有 testprocedure中的高的,
# C-type的constraints 
# C0  CT0 有什么区别??;
dofile atpg_setup.dofile #定义scan chain 读入test_procedure文件
2. DRC

主要是 逻辑DRC的检查 验证setup 以及设计是否为ATPG 做好准备;

check_design_rules
#当DRC的检查通过之后 Tessen 会将mode从setup 转为analyze

常见的DRCs 有

  1. RAM rules A rules
  2. CLock rules C rules
  3. Data rules D rules 数据的稳定性
  4. extra rules E rules 设计中 潜在的风险
  5. EDT finder rules
  6. Flattening rules (包含 Fn FP FG rules 包括线网 引脚和门上的DR)
  7. General rules (扫描链和设计中其他定义的矛盾);
  8. Procedure Rules P rules
  9. scanability rules S rules
    10.sacn chain trace rules
    etc.
    报告会以 设计规则分类的方式 报出来 如:C1-1 C1 是DRC的类型 - 1是 第几次出现;
3. configuring ATPG

一般会在配置的时候 配置为指定的block 或者instance 添加或者减少 fault的种类
或者设置一个指定的fault 模型;

4. Generate Pattern 生成pattern
create_patterns
# 这条命令会干啥?
#首先 本职工作是生成pattern
# 其次 它会帮助你 分析当前的设计 通过打开一些选项 帮助你修复一些DRC的问题
# 在没有 add_fualts 的指定下 工具默认是吧所有的fault 分析进去 生成pattern
#会将 运行时间 当前生成的pattern的数量 (没记错的话 是64个64个的Generate) 以及当前的覆盖率等信息 打印在控制台上.
5. save results

flattened model 对应的是Hierarchical model 扁平化的模型还是层次化的模型

对于pattern 而言 最好将其ASICII binary以及PATDB的格式的数据库都存下来,方便复现.
verilog的test bench 用于基于时序的仿真和验证
WGL STIL 是用于机台测试的文件;

write_pattern <filename> <format_switch> -replace
# 用于之后使用tessent diagnosis去做诊断,将扁平模型保存下来
write_flat_model <file_name> -replace

Faults Coverage & Transcripts

Faults

刚才说了 ATPG工具会将所有的fault model读进去 去生成pattern , 那这些Fault model又是怎么来的呢?
在test pattern 的generation之前 工具会对设计进行学习,将fault的location (这里的location一般是指对于门级模型来说的是在其内部还是外部,内部就上升到版图中的潜在fault),设计中总的faults 的数量,以及特殊的fault的种类;
当然你也可以选择性的手动去添加fault location ,将fault location 添加到fault list 中或者从fault list中排除某些fault location.
从而组成我们的fault universe

fault location

默认 fault 会定位在 库模型的输入输出端口.他和verilog的门的端口是匹配的,
也就是说 设计中faults 的数量取决于设计中 standard cells的数量.
在这里插入图片描述

如果把 set_internal_fault on 打开的话 会将标准单元在拆成基本的门,对于基本门的输入,输出也会设置fault site.
在这里插入图片描述

使用add faults 指定fault universe
add_faults -all # 自动将所有的faults 加进去
/core/cpu/ix342/Y -pin # 以某个pin为条件 添加单个的fault site for both state1 and 0
/core/cpu/alu32* -instanc # 以实例的名字为条件 为所有与名字匹配的instance添加fault site
/bus_ctr/tsd/*/EN -pin -Stuck 0 # 筛选符合条件的pin 添加 stuck at 0 的fault site
-clock_domain  /clk_ctr/clock001 #为匹配的clock domain 添加fault site点;

add_nofault #的用法与add_fault是类似

fault sampling 抽样

如果只是try run的话 可以先用sampling 跑一下.

set_fault_sampling 10 # 10%的fault 去出pattern; 是随机去挑选的;
add_faults -all
  • 12
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺脆兵兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值