芯片验证为什么那么重要?
IC行业是智力密集、技术密集型的行业,更是高投入、高风险的行业,做一款芯片仅仅是开模的费用就是百万起。
为了保证芯片功能的正确性和完整性,就需要验证工程师给设计或者实现过程提供迭代的关键意见。
验证岗位兼备硬件和软件技能点,对于学历专业相对比较友好,入行之后的进步空间和学习上限仍然很充足。
但是最近芯易君却发现了一个大问题!
不少同学学了几个月,知识点掌握了、工具会用了、项目做过了、代码也能写,但是却根本不会面试!
面试官随机提出的问题,只能含含糊糊答出一部分,根本经不起深问和推敲。
正值“弯道超车”的好时机!大家不妨先刷一波高频、经典的面试题。
IC修真院为大家送上干货!特此整理20道数字IC验证常见面试/笔试题目,并附上参考答案。
01选择题
1. 下列关于代码覆盖率描述错误的是?
A.代码覆盖率包括语句覆盖率
B.代码覆盖率包括条件覆盖率
C.代码覆盖率包括功能覆盖率
D.代码覆盖率到达百分百说明代码bug已消除
2. 关于亚稳态的描述错误的是?
A.多用几级寄存器打拍可以消除亚稳态。
B.亚稳态是极不稳定的,理论上来讲处在亚稳态的时间可以无限长。
C.亚稳态稳定到0或者1,是随机的,与输入没有必然的关系。
D.如果数据传输中不满足触发器的建文时间Tsu和保持时间Th,可能产生亚稳态。
3. Verilog语言中,下面哪些语句不可被综合?
A.#delay语句
B.initial语句
C.always语句
D.用generate语句
4. 下列关于verilog的描述正确的是?
A.Y=a+b; 属于阻塞赋值语句,执行该语句时,先计算 a+b的值,然后更新 y值,在此过程中,不能运行其他语句
B.Generate, for, function语句可综合
C.如果A=1‘b1,B=1`b0,F=A&~B|B&~A||B,则F=1’b1
D.如果A=4‘hb,则^A=1’b1
5. 判断电路是否存在竞争冒险的方法有哪些呢?
A.代数法
B.卡诺图法
C.实验法
D.观察法
答案与解析:
1. CD。解析:代码覆盖率和功能覆盖率是独立的两种覆盖率,代码覆盖率100%只能表明代码经过了充分的执行,但是代码中是否有bug以及bug是否会被发现,取决于验证环境中的监测点是否监测了关键信号以及对这些信号的判断是否正确。
2. A。解析:亚稳态不能被消除,只能降低其对后级电路的影响。
3. A。解析:产生的代码所有综合工具都不支持的结构 time,defparam,$finish,fork,join,initial,delays,UDP,wait。4. ABCD。
5. A。
02简答题
6. 简述UVM的工厂机制
Factory机制也叫工厂机制,其存在的意义就是为了能够方便的替换TB中的实例或者已注册的类型。一般而言,在搭建完TB后,我们如果需要对TB进行更改配置或者相关的类信息,我们可以通过使用factory机制进行覆盖,达到替换的效果,从而大大提高TB的可重用性和灵活性。
要使用factory机制先要进行:
将类注册到factory表中;
创建对象,使用对应的语句 (type_id::create);
编写相应的类对基类进行覆盖。
7. OPP(面向对象)的特性?
封装:通过将一些数据和使用这些数据的方法封装在一个集合里,成为一个类。
继承:允许通过现有类去得到一个新的类,且其可以共享现有类的属性和方法。现有类叫做基类,新类叫做派生类或扩展类。
多态:得到扩展类后,有时我们会使用基类句柄去调用扩展类对象,这时候调用的方法如何准确去判断是想要调用的方法呢?通过对类中方法进行virtual声明,这样当调用基类句柄指向扩展类时,方法会根据对象去识别,调用扩展类的方法,而不是基类中的。而基类和扩展类中方法有着同样的名字,但能够准确调用,叫做多态。
8. 阻塞赋值与非阻塞赋值的区别?
阻塞赋值的操作符号用等号(=)表示,当前语句的赋值阻塞其他语句的赋值;
非阻塞赋值的操作符号用小于等于号(<=)表示,当前语句赋值不阻塞其他语句的赋值。
9. 动态数组和联合数组的区别?
动态数组:其内存空间在运行时才能够确定,使用前需要用new[]进行空间分配。
关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时候使用,类似于hash,通过一个索引值和一个数据组成: bit [63:0] name[bit[63:0]];索引值必须是唯一的。
关联数组可以用来保存稀疏矩阵的元素。当你对一个非常大的地址空间寻址时,该数组只为实际写入的元素分配空间,这种实现方法所需要的空间要小得多。
此外,关联数组有其它灵活的应用,在其它软件语言也有类似的数据存储结构,被称为哈希(Hash)或者词典(Dictionary),可以灵活赋予键值(key)和数值(value)
10. SV中的interface的clock blocking的功能?
Interface是一组接口,用于对信号进行一个封装,捆扎起来。如果像 verilog中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用interface接口进行连接,不仅可以简化代码,而且提高可重用性,除此之外,interface内部提供了其他一些功能,用于测试平台与DUT之间的同步和避免竞争。
Clocking block:在interface内部我们可以定义clocking块,可以使得信号保持同步,对于接口的采样和驱动有详细的设置操作,从而避免TB与 DUT的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。
11. 建立时间和保持时间违例的解决方法?
建立时间违例
时钟路径插入缓冲器;
更换延迟小的触发器;
增加时钟周期。
保持时间违例
优化时钟,让时钟更早到来;
触发器插入缓冲器;
更换延迟大的触发器。
12. 亚稳态是什么,怎么消除?
产生原因:数据传输不满足触发器的建立时间和保持时间
发生场合:主要发生在异步信号检测,跨时钟域信号传输以及复位电路中;
消除办法:
对异步信号进行同步处理;
采用fifo对跨时钟域通信进行数据缓冲设计;
对复位电路采用异步复位,同步释放。
13. 怎么编写测试用例?
主要是编写sequence,然后在body里面根据测试功能要求写相应的激励,然后再通过ref_model和checker判断功能是否实现?
14. 如果有很多测试用例,如何让它们自动执行?
可以写脚本让它们自动执行,例如makefile...
15. fifo的异步与同步
异步fifo:读写时钟不同;
同步fifo:读写时钟相同。
16. 验证的思想
验证就是在设计规范的要求下,对已知功能目标下的DUT进行检查,然而实际的使用场景是设计规范无法全面覆盖的,验证工程师只能在有限的资源与时间下对设计代码进行最大限度的检查以尽可能多地消除流片之后的bug。
17. 代码覆盖率、功能覆盖率和断言覆盖率的区别
代码覆盖率——是针对RTL设计代码的运行完备度的体现,包括行覆盖率、条件覆盖率、FSM覆盖率、跳转覆盖率、分支覆盖率,只要仿真就可以收集,可以看DUT的哪部分代码没有动,如果有一部分代码一直没动看一下是不是case没有写到。
功能覆盖率---与spec比较来发现,design是否行为正确,需要按verification plan来比较进度。用来衡量哪些设计特征已经被测试程序测试过的一个指标
首要的选择是使用更多的种子来运行现有的测试程序;
其次是建立新的约束,只有在确实需要的时候才会求助于定向测试,改进功能覆盖率最简单的方法是仅仅增加仿真时间或者尝试新的随机种子。
验证的目的就是确保设计在实际环境中的行为正确。设计规范里详细说明了设备应该如何运行,而验证计划里则列出了相应的功能应该如何激励、验证和测量
断言覆盖率:用于检查几个信号之间的关系,常用在查找错误,主要是检查时序上的错误,测量断言被触发的频繁程度。
18. sv里面动态数组、关联数组、队列各自的优缺点,应用场景。
【特点】
动态数组:可以在仿真时分配空间或者调整宽度,这样仿真中就可以使用最小的存储空间。
关联数组:用来保存稀疏矩阵的元素,当一个非常大的地址空间进行寻址时,sv只对实际写入的元素分配空间,比定宽数组和动态数组所占用的空间要小得对。
队列:结合了链表和数组的优点,可以在队列的任意位置增加或者删除元素,这类操作在性能上比动态数组小得多,可以通过索引对任意元素进行访问。
【应用场景】
动态数组:随机事务不确定位宽大小;
关联数组:需要建立一个超大容量数组,用关联数组来存放稀疏矩阵的元素;
队列:增加元素或者删除元素方便。
19. 数据类型怎么转换,静态强制类型转换和动态强制转换有什么区别?
静态转换:转换时指定目标类型,并在需要转换的表达式前加上单引号即可;
动态转换:使用函数 $cast
区别:静态类型转换操作不对转换值进行检查,具有一定的危险性;而动态类型转换在运行时将进行检查,如果转换失败会产生运行时错误。