IC验证面试-UVM/SV 11-20

11. 声明和例化有什么区别

声明是声明一个变量,其中保存类对象的句柄

例化是通过构造函数,创建对象,分配内存空间,并将声明的句柄指向这段内存空间,虽然sv中可以在声明对象的同时例化对象,但是不建议如此,一般是在块语句之外声明类对象,在块语句内例化对象,可以控制对象的实例化顺序。

12. 什么是uvm_config_db?它的作用是什么?

uvm_config_db配置数据支持在测试平台的不同组件之间共享配置参数,任何测试平台都可以配置参数,其他组件可以从配置数据库访问这些参数,而无需知道其在层次结构中的位置,比如,测试平台顶层可以通过uvm_config_db存储virtual interface句柄,然后任何uvm_driver,uvm_monitor组件都可以查询uvm_config_db,以此获取virtual interface的句柄,并将其用于实际的接口信号。

13. parent机制的好处

(1)对于phase机制的调度有很大的好处

(2)parent机制可以帮助componment找到它的儿子和父亲

(3)对于connect phase,可以利用parent进行连接(自下向上)

(4)对于build phase,可以利用parent进行连接(自上向下)

14. instance override和type override之间有什么区别?

顾名思义,type override 适用于该组件类型所在层级结构中的所有实例,instance override仅覆盖类的特定实例,即该组件在UVM组件层次结构中的位置,由于只有UVM组件类具有层次结构,因此只有组件类能进行instance override,而seuqence(UVM object)只能进行type override。

15. 请你总结UVM port的使用步骤

首先主动方定义port接口,主动方将port接口new起来,承载方实现put函数,承载方定义export接口,承载方将export接口new起来,在env中实现二者的连接,注意一定是主动方连接承载方,主动方调用put函数发送transaction,承载方处理transaction。

16. 什么是形式验证?

形式验证分为两种,一种是等价性验证,是指从功能上对综合后的网表进行验证,以功能验证后的HDL设计为参考,对比综合后的网表功能,检验是否在功能在存在等价性,保证综合后没有改变原先HDL描述的功能,另一种是模型检查,是从数学上完备的验证电路的实现方案确实实现了电路设计所描述的功能,建立数学模型进行检查设计。

17. 覆盖率驱动验证(CVD coverage driven verification)

覆盖率驱动验证的方法最重要的特点就是基于随机激励的产生,随机激励生成是提高效率的最主要的原动力,覆盖率驱动验证方法学把下面几个概念和技术融合到了一块:事务级验证,约束随机激励产生,自动化结果比较,覆盖率统计分析和直接测试,事务级验证允许在一个更高的抽象层次来创建验证环境,约束随机激励产生可以获取更高的效率,为生成验证场景和自动化结果比较提供了充分的保证,设计能够在各种随机的情况下被验证,覆盖率统计也是必须的,若没有了覆盖率统计,就没有办法清晰的分析哪个场景被随机生成过,直接测试也是必须的,因为最终不能所有场景都能随机生成。

18. sequence的启动方式有几种?

(1)隐含模式:隐含模式就是利用config_db方式去启动,是在某个componment中(比如env,agent)的build phase中使用隐含模式

uvm_config_db#(uvm_object_wrapper)::set(this,"*.seqr.main_phase","default_sequence",transaction_sequence::get_type());

将定义好的sequence设置到指定好的sequencer的main_phase上去,前两个参数帮助我们找到sequencer的main phase,我们去看里面的default sequence是否被设置,如果设置了就启动第四个参数的default sequence的body函数。

(2)显示模式:直接调用sequence的start函数

在某个componment中(比如drv sequencer)的main phase,seq.strat(env.m_agent.seqr)

19. UVM中sequence要去调用sequencer中的东西,怎么调用?

通过宏`uvm_declear_p_sequencer(virtual sequencer),声明了一个virtual sequencer类型的变量p_sequencer,通过这个p_sequencer可以动态索引到virtual sequencer中声明的各个sequencer的句柄和变量。

其实UVM中本身就有一个成员变量m_sequencer(m_sequencer的类型为uvm_sequencer_base),

是sequence在启动后使用的sequencer的指针,因为在启动时,在顶层test中会 调用my_sequence.start(my_sequencer),将my_sequence挂载到my_sequencer上,这样在底层可以通过m_sequencer做一些操作,通过宏调用`uvm_declear_p_sequencer(virtual sequencer),UVM会先定义一个p_sequencer变量,然后$cast(p_sequencer,m_sequencer)的动态转换,这样最后在顶层test中将sequencer挂载到virtual sequencer上时,sequence就可以通过变量p_sequencer访问到virtual sequencer内部定义的各个sequencer句柄和变量了。

20. UVM平台中,用例仿真是怎么开始又是怎么停止的?

phase的启动通过在顶层或测试用例中调用run_test()任务,该任务会首先创建test top,然后调用所有的phase,开始仿真,在遇到最后一个组件的drop objection时,结束仿真。

  • 4
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值