【数字ic自整资料】数字ic验证及UVM常见问题

参考资料:

https://zhuanlan.zhihu.com/p/430482404

https://zhuanlan.zhihu.com/p/439418479

数字IC验证高频面试问题整理(附答案)_数字验证 面试-优快云博客

IC验证面试常问题88道_ic验证面试题-优快云博客

目录

IC验证的流程

SystemVerilog中OOP的三大特性

UVM的优势,为什么要用UVM

如何保证验证的完备性

UVM的工厂机制

为什么interface要用virtual

多线程常用的调度方式

简述在TB中使用interface和clocking blocking的好处

UVM从哪里启动,接口怎么传递到环境中


IC验证的流程

1、理解DUT,根据spec文档划分测试点

2、根据测试点搭建测试平台,编写基础sequence产生事务

3、收集验证覆盖率,功能覆盖率、代码覆盖率、断言覆盖率,根据覆盖率完善验证平台

4、编写测试报告

SystemVerilog中OOP的三大特性

类主要有三个特性:封装、继承、多态。

封装:通过将一些数据和使用这些数据的方法封装在一个集合里,成为一个类。

继承:允许通过现有类去得到一个新的类,且其可以共享现有类的属性和方法。现有类叫做基类,新类叫做派生类或扩展类。

多态:得到扩展类后,有时我们会使用基类句柄去调用扩展类对象,这时候调用的方法如何准确去判断是想要调用的方法呢?通过对类中方法进行virtual声明,这样当调用基类句柄指向扩展类时,方法会根据对象去识别,调用扩展类的方法,而不是基类中的。而基类和扩展类中方法有着同样的名字,但能够准确调用,叫做多态。

UVM的优势,为什么要用UVM

UVM其实就是SV的一个封装,将我们在搭建测试平台过程中的一些重复性和重要的工作进行封装,从而使我们能够快速的搭建一个需要的测试平台,并且可重用性还高。但是UVM又不仅仅是封装。

如何保证验证的完备性

首先不可能百分百完全完备,即遍历所有信号的组合,这既不经济也不现实。

所以只能通过多种验证方法一起验证尽可能减少潜在风险,一般有这些验证流程:ip级验证、子系统级验证、soc级验证,除这些以外,还有upf验证、fpga原型验证等多种手段。

前端每走完一个阶段都需要跟设计以及系统一起review验证功能点,测试用例,以及特殊情况下的波形等。

芯片后端也会做一些检查,像sta、formality、DFM、DRC检查等,也会插入一些DFT逻辑供流片回来测试用。流片归来进行测试,有些bug可以软件规避,有些不能规避,只能重新投片

UVM的工厂机制

Factory机制也叫工厂机制,其存在的意义就是为了能够方便的替换TB中的实例或者已注册的类型。一般而言,在搭建完TB后,我们如果需要对TB进行更改配置或者相关的类信息,我们可以通过使用factory机制进行覆盖,达到替换的效果,从而大大提高TB的可重用性和灵活性。

要使用factory机制先要进行:

1、将类注册到factory表中

2、创建对象,使用对应的语句 (type_id::create)

3、编写相应的类对基类进行覆盖

为什么interface要用virtual

在sv的体系下,interface可以视作一个module,和DUT,TB一样属于static层面。在实际应用中,我们往往会在testbench中将interface中的信号连接到DUT的port上,通过vif.input=i_dut.input这种方式。而当我们想要连接interface的另一端时就会出现问题。因为test是在simulation阶段才通过phase创建UVM出来的,而interface和module一样需要在parse和elaboration阶段就完成创建,这时候我们没办法将interface的另一端连到UVM的component中。此时我们需要有一个interface的instance给component调用,于是就有了virtual interface。如果不加virtual,interface一个static不能被定义在class中。

virtual是interface的指针,将硬件实际电路和软件之间通信起来的虚拟接口。

多线程常用的调度方式

多线程之间同步主要由mailbox、event、 semaphore三种进行一个通信交互。

mailbox邮箱:主要用于两个线程之间的数据通信,通过put函数和 get 函数还有peek函数进行数据的发送和获取。

Event:事件主要用于两个线程之间的一个同步运行,通过事件触发和事件等待进行两个线程间的运行同步。使用@(event)或者 wait(event.trigger)进行等待,->进行触发。

Semaphore:旗语主要是用于对资源访问的一个交互,通过key的获取和返回实现一个线程对资源的一个访问。使用put和 get函数获取返回key。一次可以多个。

简述在TB中使用interface和clocking blocking的好处

Interface是一组接口,用于对信号进行一个封装,捆扎起来。如果像verilog中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用interface接口进行连接,不仅可以简化代码,而且提高可重用性,除此之外,interface内部提供了其他一些功能,用于测试平台与DUT之间的同步和避免竞争。

Clocking block:在interface内部我们可以定义clocking块,可以使得信号保持同步,对于接口的采样vrbg和驱动有详细的设置操作,从而避免TB与 DUT的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。

UVM从哪里启动,接口怎么传递到环境中

在导入uvm_pkg文件时,会自动创建UVM_root所例化的对象UVM_top,UVM顶层的类会提供run_test()方法充当UVM世界的核心角色,通过UVM_top调用run_test()方法.

在环境中输入run_test来启动UVM验证平台,run_test语句会创建一个my_case0的实例,得到正确的test_name

依次执行uvm_test容器中的各个component组件中的phase机制,按照顺序:

1、build-phase(自顶向下构建UVM 树)

2、connet_phase(自低向上连接各个组件)

3、end_of_elaboration_phase(不咋用)

4、start_of_simulation_phase(不咋用)

5、run_phase() objection机制仿真挂起,通过start启动sequence(每个sequence都有一个body任务。当一个sequence启动后,会自动执行sequence的body任务),等到sequence发送完毕则关闭objection,结束run_phase()(UVM_objection提供component和sequence共享的计数器,当所有参与到objection机制中的组件都落下objection时,计数器counter才会清零,才满足run_phase()退出的条件)

6、执行后面的phase

(持续更新ing)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值