三、测试模式生成技术: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%,这就不太“真实”。加权随机就是调整这个概率,让它更贴近实际工作场景。
加权随机怎么实现?常见的方法有两种:
- 概率加权:在LFSR后面加一个概率选择器。比如你想让某位出现1的概率是75%,那就用两个LFSR位做与操作(25%概率),或者用两个LFSR位做或操作(75%概率)。
- 权重寄存器:每个输入位配一个权重寄存器,控制它翻转的概率。这种方法更灵活,但面积开销大。
// 加权随机生成示例:让某位出现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基础上加了概率控制。
好了,测试模式生成这块就聊到这儿。记住一句话:没有最好的模式,只有最合适的组合。下次你设计BIST时,不妨试试先伪随机、再加权、最后确定性补刀这个思路。
公众号:蓝海资料掘金营,微信deep3321