三、测试模式生成技术:LFSR原理、伪随机测试模式、加权随机模式

好,咱们进入测试模式生成这块。说白了,就是怎么给芯片灌测试向量。你想想看,一个芯片几百万个门,总不能一个个手动写测试向量吧?那得写到猴年马月去。所以,我们需要一种自动生成测试向量的方法。

我个人习惯把测试模式生成分成三大类:确定性测试伪随机测试加权随机测试。今天重点聊后两种,因为它们在BIST里用得最多。

3.1 LFSR原理——伪随机序列的“心脏”

LFSR,全称Linear Feedback Shift Register,线性反馈移位寄存器。名字挺长,其实原理不复杂。就是一个移位寄存器,加上一些异或门反馈。

我刚开始接触LFSR时,觉得这东西挺神奇的。你给它一个初始值(种子),它就能一直产生看起来随机的序列。而且这个序列是确定的——只要种子和反馈多项式一样,序列就完全一样。这就是“伪随机”的由来。

核心要点:LFSR的本质是一个有限状态机。它的状态数取决于寄存器的位数。一个n位的LFSR,最多有2ⁿ-1个非零状态(全零状态是死循环,要避免)。

反馈多项式决定了LFSR的“跳跃”路径。比如多项式 x³ + x + 1,对应的抽头位置就是第3位和第1位。嗯,这里要注意:多项式的次数就是寄存器的位数。

// 一个3位LFSR的Verilog实现示例
module lfsr_3bit (
    input clk,
    input rst_n,
    input [2:0] seed,
    output reg [2:0] lfsr_out
);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        lfsr_out <= seed;  // 加载种子
    else begin
        // 反馈多项式: x^3 + x + 1
        // 抽头: bit2 和 bit0
        lfsr_out[0] <= lfsr_out[2];
        lfsr_out[1] <= lfsr_out[0];
        lfsr_out[2] <= lfsr_out[1] ^ lfsr_out[2];
    end
end

endmodule

我在项目中遇到过一个问题:种子选不好,LFSR的覆盖率会很低。比如种子选成全1,那序列就卡在某个循环里出不来。后来我学乖了,种子一般选一个非零的随机数,最好是质数相关的。

3.2 伪随机测试模式——性价比之王

伪随机测试模式,就是用LFSR生成的序列直接当测试向量。为什么叫“伪随机”?因为它是确定的,但统计特性上接近真随机。

说白了,你给芯片灌一串0101...的序列,看它能不能正常工作。伪随机测试的好处是:

  • 生成简单:一个LFSR搞定,面积开销小
  • 覆盖率高:对于组合逻辑,伪随机序列能覆盖大部分故障
  • 可重复:同样的种子,同样的序列,调试方便

但伪随机也有短板。我记得有一次做项目,芯片里有个128位的比较器。伪随机序列跑了100万个向量,那个比较器的“相等”分支死活测不到。为什么?因为两个128位数相等的概率是2⁻¹²⁸,伪随机序列要跑到猴年马月才能撞上一次。

我的经验:伪随机测试适合覆盖“常见”故障。对于“稀有”故障,比如某个特定组合才触发的bug,伪随机基本无能为力。这时候就需要加权随机或者确定性测试来补位。

伪随机测试的另一个问题是:序列长度。一个n位的LFSR,最大序列长度是2ⁿ-1。如果n=16,那就是65535个向量。对于小设计够用了,但对于大设计,你可能需要多个LFSR或者更长的序列。

3.3 加权随机模式——精准打击

加权随机模式,说白了就是给LFSR的输出加个“权重”。让某些位出现1的概率更高,某些位出现0的概率更高。

你想想看,如果某个节点在正常工作时,90%的时间是0,10%的时间是1。那伪随机测试里,它出现1的概率是50%,这就不太“真实”。加权随机就是调整这个概率,让它更贴近实际工作场景。

加权随机怎么实现?常见的方法有两种:

  1. 概率加权:在LFSR后面加一个概率选择器。比如你想让某位出现1的概率是75%,那就用两个LFSR位做与操作(25%概率),或者用两个LFSR位做或操作(75%概率)。
  2. 权重寄存器:每个输入位配一个权重寄存器,控制它翻转的概率。这种方法更灵活,但面积开销大。
// 加权随机生成示例:让某位出现1的概率为75%
// 使用两个LFSR位做或操作
wire lfsr_bit1, lfsr_bit2;
assign weighted_bit = lfsr_bit1 | lfsr_bit2;  // 75%概率为1

// 让某位出现1的概率为25%
assign weighted_bit = lfsr_bit1 & lfsr_bit2;   // 25%概率为1

我曾经在一个项目中用过加权随机。那个芯片有个状态机,某个状态只在特定条件下才进入。伪随机测试跑了半天,那个状态覆盖率一直是0。后来我加了加权随机,把进入那个状态的条件概率调高到30%,结果跑了5000个向量就覆盖到了。

注意:加权随机不是万能的。权重设得太高,会让测试向量“偏科”,反而漏掉其他故障。我建议权重调整幅度不要超过20%,否则容易顾此失彼。

3.4 三种模式的对比与选择

好,咱们把三种模式放在一起看看:

模式 优点 缺点 适用场景
确定性测试 覆盖率100%,针对性强 生成复杂,存储量大 关键路径、特定故障
伪随机测试 生成简单,面积小 稀有故障覆盖率低 常规测试、大面积覆盖
加权随机测试 可调概率,灵活 需要额外硬件,设计复杂 特定概率场景、状态机测试

我个人习惯的做法是:先用伪随机跑一遍,看看覆盖率。如果覆盖率不够,再针对低覆盖率区域加加权随机。最后,如果还有漏网之鱼,就用确定性测试补刀。这样既省面积,又保证覆盖率。

嗯,这里要提醒一句:不要迷信任何一种模式。我见过有人只用伪随机,结果芯片流片回来有bug;也见过有人只用确定性测试,结果测试时间长得离谱。最好的方案是组合使用,取长补短。

3.5 知识体系总览

下面这张图是我画的测试模式生成技术的知识结构,帮你理清思路:

测试模式生成技术知识体系 测试模式生成 LFSR原理 伪随机测试模式 加权随机模式 移位寄存器 + 异或反馈 反馈多项式决定序列 种子选择影响覆盖率 生成简单,面积小 覆盖率高(组合逻辑) 稀有故障覆盖率低 概率加权(与/或操作) 权重寄存器控制翻转 灵活但面积开销大 组合使用:伪随机 → 加权随机 → 确定性测试 取长补短,平衡覆盖率和测试时间

这张图把三种模式的关系和特点都画出来了。你可以看到,LFSR是伪随机和加权随机的基础。伪随机是“原汁原味”的LFSR输出,加权随机则是在LFSR基础上加了概率控制。

好了,测试模式生成这块就聊到这儿。记住一句话:没有最好的模式,只有最合适的组合。下次你设计BIST时,不妨试试先伪随机、再加权、最后确定性补刀这个思路。


公众号:蓝海资料掘金营,微信deep3321