利用故障模拟与测试模式序列的组合电路EB测器故障定位算法

需积分: 10 0 下载量 159 浏览量 更新于2024-08-07 收藏 168KB PDF 举报
本文档探讨了一种利用故障模拟和测试模式序列的EB测试器(Error-Bit Tester)对组合逻辑电路进行故障定位的算法。该方法由大阪大学工程学院信息系统工程系的Koji Nakamae、Takashi Ishimura和Hiromu Fujioka三位作者提出。他们针对在实际测试中遇到的问题,提出了一个创新的故障检测和定位策略。 首先,算法的核心步骤是通过并发故障模拟技术。在执行测试模式时,如果EB测试器在某个输出引脚检测到错误,就会生成一个初始故障候选列表。这个列表包含了可能引起错误的内部信号线。同时,通过并行运行的故障模拟,能够获取到每个信号线上的并发故障清单,有助于更精确地确定问题所在。 接下来,算法的关键在于选择信号线进行探针检查。通过对并发故障清单的分析,算法会选择能最大程度缩小故障候选列表的信号线进行进一步的测试。这种方法旨在减少不必要的测试时间,提高定位效率。 在探针操作后,论文提出了一种策略,即生成针对包含探针线作为输出终端的子电路的部分测试模式。这些随机生成的测试模式不仅不会增加波形测量的时间,还能提供额外的信息,帮助排除或确认已知的故障线索。整个测试模式序列包括了最初引发错误的测试模式以及这些随机生成的模式,从而形成一个综合的故障诊断流程。 这篇论文的贡献在于提出了一种结合并发故障模拟、智能探针技术和优化测试模式设计的故障定位方法,这对于高效和准确地识别组合逻辑电路中的故障具有重要意义。这种算法对于电子设计自动化(EDA)工具的改进以及集成电路制造过程的质量控制都有积极的推动作用。研究人员通过实验证明,这种方法在提高故障定位精度的同时,也降低了测试时间和成本,显示出了良好的实用价值。

import time import multiprocessing from proxypool.processors.server import app from proxypool.processors.getter import Getter from proxypool.processors.tester import Tester from proxypool.setting import CYCLE_GETTER, CYCLE_TESTER, API_HOST, API_THREADED, API_PORT, ENABLE_SERVER, \ ENABLE_GETTER, ENABLE_TESTER, IS_WINDOWS from loguru import logger if IS_WINDOWS: multiprocessing.freeze_support() tester_process, getter_process, server_process = None, None, None class Scheduler(): def run_tester(self, cycle=CYCLE_TESTER): if not ENABLE_TESTER: logger.info('tester not enabled, exit') return tester = Tester() loop = 0 while True: logger.debug(f'tester loop {loop} start...') tester.run() loop += 1 time.sleep(cycle) # CYCLE_GETTER=100 def run_getter(self, cycle=CYCLE_GETTER): if not ENABLE_GETTER: logger.info('getter not enabled, exit') return getter = Getter() loop = 0 while True: logger.debug(f'getter loop {loop} start...') getter.run() loop += 1 time.sleep(cycle) def run_server(self): if not ENABLE_SERVER: logger.info('server not enabled, exit') return app.run(host=API_HOST, port=API_PORT, threaded=API_THREADED) def run(self): global tester_process, getter_process, server_process try: logger.info('starting proxypool...') if ENABLE_TESTER: tester_process = multiprocessing.Process(target=self.run_tester) logger.info(f'starting tester, pid {tester_process.pid}...') tester_process.start() if ENABLE_GETTER: getter_process = multiprocessing.Process(target=self.run_getter) logger.info(f'starting getter, pid{getter_process.pid}...') getter_process.start() if ENABLE_SERVER: server_process = multiprocessing.Process(target=self.run_server) logger.info(f'starting server, pid{server_process.pid}...') server_process.start() tester_process.join() getter_process.join() server_process.join() except KeyboardInterrupt: logger.info('received keyboard interrupt signal') tester_process.terminate() getter_process.terminate() server_process.terminate() finally: # must call join method before calling is_alive tester_process.join() getter_process.join() server_process.join() logger.info(f'tester is {"alive" if tester_process.is_alive() else "dead"}') logger.info(f'getter is {"alive" if getter_process.is_alive() else "dead"}') logger.info(f'server is {"alive" if server_process.is_alive() else "dead"}') logger.info('proxy terminated') if name == 'main': scheduler = Scheduler() scheduler.run()给这段代码加注释

2023-06-09 上传