基于功能测试和结构测试,很大程度上决定了芯片的质量。因为这两个环节就是专门为芯片质量把关而存在的。
功能测试
功能测试是属于前端设计的一个环节,当编码工程师将他那部分代码写完之后,就可以交给验证工程师做功能测试。因为编码工程师是为芯片编写逻辑功能的RTL代码,所以说验证工程师也是基于逻辑功能做的测试。
具体表现为使用testbench来搭建一个测试芯片功能的环境,在这个环境下,我们需要给待测试设计文件(DUT,Design Under Test)激励,然后观测输出与预期对比,判断芯片是否有功能故障。
说到这里大家应该也能明白testbench是一个抽象的概念,实际上它也是由很多个组件组合而成。Generate激励产生器,她就像是子弹;Agent是一个盒儿,将所有的子弹放到这个弹匣中;Drive是驱动,将所有的子弹发射出去给到DUT;之后我们就可以用Monitor监控所有DUT的输出数据,将输出数据投送到Scoreboard比较器中与预期的对比。
那么很巧的是,问题来了,预期的数据怎么到达Scoreboard呢?
其实很简单,我们只要在DUT的位置用一个功能类型相同的模型替换就可以了,这里也叫做refence_model测试模型。对于这种类比模型,我们当然不可能去实现很复杂的功能,只需要使用时钟clk,和initial直接初始赋值来完成就可以。
PS:针对不同复杂度的DUT,验证的搭建也会有所不同。并且上图的组件也不是一个testbench里只会出现一次~
所以对于功能测试来说,可以有很多种,甚至你可以完全不用去理解设计文件的内容,只要观察DUT的输入和输出,就能发现问题,这也是验证策略之一:黑盒测试。根据对DUT的理解,还会有灰盒测试和白盒测试,都是依据验证工程师对DUT理解层次的划分,然后提取各种时钟/复位等测试功能点,进行验证。
结构测试
结构测试很好理解,就是基于电路的结构进行测试,所以说在功能验证完成后,RTL的网表就要综合成门级网表,给到DFT工程师了。因此DFT设计工程师其实并不care电路的功能逻辑(就是不管它起什么作用),只需要去发现电路的物理缺陷就行。
既然要做结构测试,那肯定是要对电路内部结构都能看见并且了解的,所以这里就不存在什么黑盒和灰盒测试了,完完全全的是白盒猜测。
结构测试依靠很多成熟的EDA工具,类似于Synopsys的DFT Complier,西门子Mentor的Tessent等等。通过对电路内部插入一些可扫描单元,实现电路的可控/可观察/可隔离3大特性。
- 可控:对电路内部施加外部激励,能否使之响应;如果内部节点可被驱动为任何值,该节点就是可控的。
- 可观察:能否被外部设备观测到测试点的状态,如果电路内部的取值可以传输到电路的输出端,则称之为该节点可观察。
- 可隔离:通过测试逻辑将测试状态和正常工作状态隔离开,使它们互不干扰,则称为可隔离。
还有不得不提的就是ATPG测试向量生成工具。Snopsys的TetraMAX和西门子Mentor的Fastscan都是为了测试向量生成而生。这个测试向量就好比是功能测试的子弹,结构测试生成的测试向量,最终会在芯片流片完成之后,通过ATE机台施加给芯片,然后测试机台会搜集到芯片给的反应来与预期进行对比。
听起来是不是很耳熟?哈哈哈,测试的精髓就是这儿了~
ATE的反馈其实有两种:①测试pass了,好了大家的努力没有白费,我们的芯片没有我们所建立的故障,因为我们的测试向量没有打到fault,测试向量与输出吻合。②测试fail了,这时候大家眉头紧锁,这只芯片大概是报废了。但先不要放弃,也有可能不是芯片的问题,是不是测试向量错了呢?也有可能啊,虽然几率很小,如果不是测试向量本身的问题话,那就是芯片有缺陷了,毕竟与预期不符,和测试向量的结果产生mismatch了。 通过这种方法,我们就可以筛选出废片了。
功能测试VS结构测试
这两种测试在很多方面的测试方法是很像的,只是基于不同的层面。我暂且先总一些总结:
功能测试 | 结构测试 | |
---|---|---|
透明度 | 黑盒/灰盒/白盒 | 白盒 |
层次 | block/top | block/top |
环境 | testbench | testflow |
对象 | 软件的测试 | 硬件的测试 |
方法 | 施加激励给对象,观测输出与预期对比是否一致 |
测试覆盖率的问题后续再补充~