利用LFSR实现自构建测试技术研究

版权申诉
0 下载量 74 浏览量 更新于2024-11-11 收藏 175KB ZIP 举报
资源摘要信息:"线性反馈移位寄存器在内建自测试中的应用" 线性反馈移位寄存器(Linear Feedback Shift Register,简称LFSR)是一种常见的数字序列生成器,广泛应用于数字逻辑设计和集成电路测试中。LFSR特别适合用于生成伪随机数序列,这一特性使其在硬件的内建自测试(Built-In Self Test,简称BIST)中发挥重要作用。内建自测试是一种将测试逻辑集成到电路中的方法,以期能够在不依赖外部测试设备的情况下进行故障检测和诊断。 LFSR的工作原理是通过反馈逻辑从移位寄存器中提取部分位,并将其与移位信号一起输入到寄存器的输入端,从而在每个时钟周期下移位寄存器中的位都会按照一定的规则变化。根据反馈函数的不同,LFSR可以被分为多种类型,如 Fibonacci 型和 Galois 型,每种类型的LFSR在序列生成的性质上有所不同。一个n位的LFSR可以生成2^n-1个非零状态的序列,这种特性使得LFSR非常适合用来生成长周期的伪随机序列。 在内建自测试中,LFSR通常被用作伪随机数生成器,它能够生成测试向量,用于电路的测试。伪随机测试向量具有与真实随机测试向量相似的特性,但生成速度快,且易于控制。通过将生成的测试向量应用于电路中的特定模块,可以检测出该模块是否存在故障。这种方法相比传统的全扫描测试,在成本和测试时间上都有显著优势。 LFSR在内建自测试中的应用依赖于其以下关键特性: 1. 高测试覆盖率:LFSR能够生成较长的测试序列,从而提供高测试覆盖率,降低未检测到的故障的可能性。 2. 易于实现:由于LFSR结构简单,可以很容易地集成到芯片设计中。 3. 高效率:使用LFSR进行测试,可以通过较短的时间内完成对电路功能的验证。 4. 可预测性:LFSR的序列是确定性的,因此可以预测和控制电路的行为。 内建自测试通常包括几个步骤,首先是利用LFSR生成测试向量,然后将这些测试向量应用到电路的特定部分,接着收集电路的输出,最后通过比较预期输出和实际输出来判断电路是否有故障。在故障诊断中,通过分析输出结果和LFSR产生的序列,可以确定故障的性质和位置。 在设计LFSR用于内建自测试时,还需注意以下几点: - LFSR的最大周期和序列的随机性:在选择或设计LFSR时,需要确保其能够生成足够长的周期和随机性高的序列。 - 多重LFSR的组合:为了覆盖更多电路的测试需求,有时会将多个LFSR组合使用,形成更复杂的测试向量生成策略。 - 伪随机测试序列的质量:测试序列的质量直接影响测试的有效性,因此需要精心设计反馈多项式,确保生成高质量的测试序列。 LFSR在内建自测试中的应用是现代集成电路测试领域的一个重要组成部分,随着集成电路复杂度的增加,如何高效地在芯片内部集成测试逻辑成为了业界关注的焦点。通过深入研究LFSR及其在BIST中的应用,可以有效提升芯片的测试效率和可靠性,对提高集成电路产品的质量和生产效率具有重要意义。

def __next_step(self, x, y): if not self.judge_colory: self.__history += 0 else: self.__history += 1 self.color = 1 if self.__history % 2 == 0 else 2 if self.start_ai_game: if self.ai_color == self.color: row,col = self.ai_stage(self.ai_game()[0],self.ai_game()[1]) else: col = round((x-self.__margin*2)/self.__cell_width) row = round((y-self.__margin*2)/self.__cell_width) stage_row = (y-self.__margin)-(self.__cell_width*row+self.__margin) stage_col = (x-self.__margin)-(self.__cell_width*col+self.__margin) if stage_col < stage_row: self.direct= 1 else: self.direct= 0 else: col = round((x - self.__margin * 2) / self.__cell_width) row = round((y - self.__margin * 2) / self.__cell_width) stage_row = (y - self.__margin) - (self.__cell_width * row + self.__margin) stage_col = (x - self.__margin) - (self.__cell_width * col + self.__margin) if stage_col < stage_row: self.direct = 1 else: self.direct= 0 if self.valide(row, col, self.direct): if self.__history % 4 == 0 or (self.__history + 2) % 4 == 0: self.__game_board.drew_turn(2) else: self.__game_board.drew_turn(1) self.add_logic(row, col, self.color) self.__game_board.draw_chess(row, col, self.color, self.direct) if self.judge_owner(row, col, self.color, self.direct): self.__game_board.drew_turn(self.judge_next(self.color)) for i in self.judge_owner(row, col, self.color, self.direct): x,y=self.draw_owner(i) self.__game_board.drew_owner(self.color, y, x) else: self.__game_board.drew_turn(self.color) self.judge_color(row, col, self.color, self.direct) print(self.logic_board_state) if 0 not in self.logic_board_owner: self.__game_board.pop_win(self.judge_winner())

2023-07-14 上传