数字 IC 验证 经典笔/面试题目与答案(共129道) 1. 下列关于代码覆盖率描述错误的是:CD A.代码覆盖率包括语句覆盖率 B.代码覆盖率包括条件覆盖率 C.代码覆盖率包括功能覆盖率 D.代码覆盖率到达百分百说明代码 bug 已消除 解析:代码覆盖率和功能覆盖率是独立的两种覆盖率,代码覆盖率100%只能表 明代码经过了充分的执行,但是代码中是否有 bug 以及 bug 是否会被发现,取决于验证环境中的监测点是否监测了关键信号以及对这些信号的判断是否正确。 2. 关于亚稳态的描述错误的是:A A.多用几级寄存器打拍可以消除亚稳态。 B.亚稳态是极不稳定的,理论上来讲处在亚稳态的时间可以无限长。 C.亚稳态稳定到 0 或者 1,是随机的,与输入没有必然的关系。 D.如果数据传输中不满足触发器的建文时间Tsu和保持时间Th,可能产生亚稳态。 解析:亚稳态不能被消除,只能降低其对后级电路的影响。 3. Verilog 语言中,下面哪些语句不可被综合:A A.#delay 语句 B.initial 语句 C.always 语句 D.用 generate 语句 解析:产生的代码所有综合工具都不支持的结构 time,defparam,$finish,fork,join,initial,delays,UDP,wait 4. 下列关于 verilog 的描述正确的是:ABCD 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 A.代数法 B.卡诺图法 C.实验法 D.观察法 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 区别:静态类型转换操作不对转换值进行检查,具有一定的危险性;而动态类型 转换在运行时将进行检查,如果转换失败会产生运行时错误。 20. function 和 task 的区别


2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/18655.html