发 帖  
原厂入驻New
[问答]

如何对IDDQ进行测试?

99 端口 计数器 电源
分享
如何对IDDQ进行测试
0
2021-5-11 06:52:50   评论 分享淘帖 邀请回答
1个回答
  在此例中,将2000个测试向量发送至必须用恒定2V加电的CMOS IC。此例将使用一个阈值电平,而且1μA及以下的静态电流将被认为是合格电流。无需保存实际的测量值,所以将只检查260X的箝位状态。为确保生产吞吐量符合要求,必须尽快完成测量,最好在1秒以内。测量仪器必须发送一个通过/失效指示至数字测试系统。
  方案:开发TSP脚本用于创建“IddqTest(smu, ndevices, nvectors)函数”。此脚本的一部分被列在下面。此脚本可以用测试脚本生成器查看、编辑、装载和运行。由于无法获得实际的“数字测试系统”,因而使用IDDQ测量与测试向量应用同步的触发线路进行环绕测试以评估函数的速度性能。260X的输入触发线路连至其输出触发线路。在此条件下,260X能以每秒约2500个向量的速率执行IDDQ测试。
  函数定义如下。除了这里示出的以外,实际脚本包括更多注释。注释用双横线(--)标识。函数中声明了几个局部变量。所有变量都是全局的,除非显式声明为局部变量。此函数在执行实际测试前要进行一些仪器初始化设置。此设置包括设定2V源电平和1μA箝位极限,选择电压感测模式以及配置触发线路。例子中使用了本地(2线)电压感测。可以直接将其改为远端(4线)感测。
  function IddqTest(smu, ndevices, nvectors)
  -- 传递参数:
  -- 源测量单元是用于测试的SMU(A或B)
  -- ndevices是待测IC的数量
  -- nvectors是Iddq测试序列用到的向量数量
  -- 默认smua,如果未指定SMU。
  if smu == nil then smu = smua end
  -- ***** 声明并初始化临时变量*****
  -- 保存“等待触发信号”布尔状态的变量
  local l_sot_received
  local l_trig_received
  -- 放弃测试标记(布尔型)
  local l_abort_test
  -- 保存定时信息的变量
  local l_start_time, l_stop_time, l_elapsed_time
  -- 计数器变量
  local l_i, l_nvectors_remaining
  -- 用于模拟器件机械手分级的表格
  local l_bins = {0,0} -- 全部分级初始设置为0
  -- *************** 执行260X的初始化设置***************
  smu.reset() -- 将SMU重置为缺省设置
  smu.source.func = smu.OUTPUT_DCVOLTS -- 源DCV
  smu.source.rangev = 2 -- 将自动选择6V量程
  smu.source.levelv = 2 -- 源2V
  smu.source.limiti = 1E-6 -- 电流箝位设为1uA
  smu.sense = smu.SENSE_LOCAL -- 用smu.SENSE_REMOTE进行4线感测
  -- 配置数字I/O端口
  digio.writeprotect = 0 -- 全部比特撤销保护
  digio.writeport(30) -- 将2、3、4和5比特/行设置为高
  digio.writeprotect = 30 -- 触发线路2、3、4和5写保护
  -- 配置触发线路2(输入SOT)
  digio.trigger.mode = digio.TRIG_FALLING -- 检测下降沿
  digio.trigger.clear() -- 清除“锁存”触发信号
  -- 配置触发线路3(输出EOT)
  digio.trigger.mode = digio.TRIG_FALLING -- 输出TTL低电平脉冲
  digio.trigger.pulsewidth = 10E-6 -- 确保最小脉冲
  -- 配置触发线路4(在设置了测试向量时输入TRIG)
  digio.trigger.mode = digio.TRIG_FALLING -- 检测下降沿
  digio.trigger.clear() -- 清除“锁存”触发信号
  -- 配置触发线路5(在完成IDDQ测量后输出TRIG)
  digio.trigger.mode = digio.TRIG_FALLING -- 输出TTL低电平脉冲
  digio.trigger.pulsewidth = 10E-6 -- 确保最小脉冲
  -- 清除错误队列
  errorqueue.clear()
  -- ************************* 执行测试*************************
  -- 在前面板显示一些状态信息
  display.clear()
  display.setcursor (1,1)
  display.settext(“ Test In Progress”)
  display.setcursor (2,1)
  display.settext(“ Testing ”。.tostring(ndevices)。。“ Parts”)
  timer.reset()
  l_start_time = timer.measure.t()
  for l_i = 1, ndevices do
  -- 等待SOT指示器件准备好进行测试;10ms后超时
  l_sot_received = digio.trigger.wait(0.01)
  -- 打开SMU输出;等到测试完成
  smu.source.output = smu.OUTPUT_ON
  -- 初始化中断标记和向量计数器
  l_abort_test = false
  l_nvectors_remaining = nvectors
  digio.trigger.clear() -- 清除全部“锁存”触发信号
  -- 重复测试直至不再有测试向量或测试失败
  while (l_nvectors_remaining 》0) and not (l_abort_test) do
  -- 等待来自数字测试系统的触发信号;10ms后超时
  l_trig_received = digio.trigger.wait(10E-3)
  -- 如需建立时间,delay(0.0005)在这里插入延时
  -- 检查箝位状态;返回布尔值真或假
  l_incompliance = smu.source.compliance
  -- 如果源在箝位状态,那么器件损坏并且中断测试
  if l_incompliance then
  digio.writeport(32) --写失效模式至DIO
  l_bins = l_bins+1 -- “分级”器件
  l_abort_test = true -- 将中断测试标记置为真并退出循环
  else -- 否则,器件仍然是好的,所以继续测试
  digio.trigger.assert() -- 输出触发信号至“数字测试系统”
  l_nvectors_remaining = l_nvectors_remaining – 1 -- 新计数
  end --if语句
  -- 如果测试不中断,那么器件是好的
  if not (l_abort_test) then
  digio.writeport(64) -- 写通过模式至DIO
  l_bins = l_bins+1 -- “分级”器件
  end --if语句
  --关闭SMU输出
  smu.source.output = smu.OUTPUT_OFF
  -- 输出EOT触发信号
  digio.trigger.assert()
  -- 清除分级码(将全部撤销保护的比特置为零)
  delay(0.0001) -- 清除分级码之前延迟的单位为秒
  digio.writeport(0)
  end --for语句
  l_stop_time = timer.measure.t()
  l_elapsed_time = l_stop_time - l_start_time
  -- 在260X前面板显示吞吐率和最终分级结果
  display.clear()
  display.setcursor (1,1)
  display.settext(“Parts per sec = ”。.tostring(ndevices / l_elapsed_time))
  display.setcursor(2,1)
  display.settext(“Bin Count: Good= ”。.l_bins。。“ Bad= ”。.l_bins)
  -- 将速度与分级结果写至输出队列以供PC主机读取
  print(“Elapsed time = ”。.l_elapsed_time.。“ sec”)
  print(“Parts per sec = ”。.tostring(ndevices / l_elapsed_time))
  print(“Bin Count: Good Parts: ”。.l_bins。。“ Bad Parts: ”。.l_bins)
  end --IddqTest函数
  用测试脚本生成器或者其它应用执行示例的IDDQ测试脚本仅创建了函数,不执行任何测试。执行IDDQ测试需要调用IddqTest()函数。例如,为了用2000个测试向量测试100个器件,系统控制器必须发送指令“IddqTest(smua, 100, 2000)”。
  作为对函数调用的响应,260X等待外部数字测试系统对每个DUT的开始测试(SOT)触发信号。260X收到SOT信号后,打开SMU输出并等待数字测试系统的触发信号。数字测试系统向IC输入端施加测试向量,然后发送一个触发信号至260X。260X接到触发信号后,等待一个预定的建立时间,然后检查其箝位状态。如果不在箝位状态,那么这项IDDQ测试通过,而且260X输出一个触发信号至数字测试系统并进入循环等着下一个施加的测试向量。此过程持续进行直至完成全部测试向量或者260X进入箝位状态。如果成功通过全部测试向量,260X就向其DIO端口写入十进制数64表明通过了数字测试系统。表元素“l_bins”加1用于模拟器件的分级。然后,260X输出测试结束(EOT)触发信号至数字测试系统,表明已完成DUT的IDDQ测试序列。
  如果260X进入箝位状态,那么IDDQ测试失败。在单项测试失败时,260X采用“立即”分级方案,这意味着260X会立即向数字测试系统写一个失效位模式(十进制数32),中断剩余的测试序列,然后输出EOT触发信号至数字测试系统。在输出了失效模式后,表元素“l_bins”加1用于模拟分级过程。在260X通过写十进制数0至DIO端口来发送EOT触发信号后,260X等待一个预定的时间间隔就会清除通过/失效位模式。如果有更多的DUT要测试,260X进入循环并等待下一个SOT触发信号。当完成全部测试后,在260X前面板会显示吞吐率和分级结果;吞吐率和分级结果也会打印至输出队列以供系统控制器读取。
2021-5-11 15:03:52 评论

举报

只有小组成员才能发言,加入小组>>

2384个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表