其他分享
首页 > 其他分享> > IC验证面试之UVM(二)

IC验证面试之UVM(二)

作者:互联网

文章目录

以下为个人答案,水平有限。如有解释不对的地方,欢迎大家评论区留言一起学习交流。
前面的题目连接:《IC验证笔试题之UVM(一)》


4.UVM环境中的通信机制?

使用TLM进行组件之间的通信。优点有一下:

这道题也有可能是在问 config机制。换个角度去考虑,从顶层 set() 传递需要配置的变量、接口或者封装类(把多个变量封装在一个类中),然后底层再通过 get() 获取配置,也是顶层与底层之间的通信。

使用config时注意:

5.UVM中的port、export和imp?

首先我们把事务发起端称为 initiator 端,事务的响应端称为 target 端。

TLM通信的端口按照类型可以分为3种:

注意:

6.UVM中run_phase和main_phase的区别?

main_phase( )是12个分支任务 phase 中的一个,run_phase 的执行贯穿这12个分支 phase。

run_phase( )和 main_phase( )是并行执行的,只有等12个分支phase全部执行完,才开始执行 extract_phase 等后面的phase

run_phase( ) 和 main_phase( )的区别
首先,我知道Objection机制是UVM中唯一可以控制仿真开始和结束的方式。在任务 phase 中,至少有一个任务 phase 要在消耗第一条消耗仿真时间的语句执行之前要挂起 Objection。

注:详细的可以参考张强大佬的《UVM实战-卷1》第五章

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

通过宏 uvm_declare_p_sequencer( base_test_virtual_sequencer ) ,声明了一个 base_test_virtual_sequencer 类型(这里只是举例,根据传递不同的sequencer类型而改变)的变量p_sequencer,通过这个p_sequencer 可以动态的索引到 base_test_virtual_sequencer 中声明的各个 sequencer 的句柄和变量。

PS,这里扩展一下:
首先,继承于 uvm_sequence 的类中本身就有一个成员变量 m_sequencer(m_sequencer 的类型为 uvm_sequencer_base ),是 sequence 在启动后所使用的sequencer的指针。因为在启动时,在顶层test中会调用 my_sequence.start(my_sequencer),将 my_sequence 挂载在 my_sequencer 上,这样在底层可以通过m_sequencer做一些操作。
通过调用宏 uvm_declare_p_sequencer(SEQUENCER),UVM会做先定义一个 p_sequencer 变量,然后做 $cast(p-sequencer,m_sequencer)的动态转换,这样最后在顶层 TEST 中将 sequence 挂载到 virtual sequencer 上时,sequence 就可以通过变量 p_sequencer 访问到 virtual sequencer 内部定义的各个 sequencer 句柄和变量了。

8.UVM中工厂覆盖机制和callback的区别?

工厂覆盖(override)是通过创建一个继承于原有类型的覆盖类型,将原有类型来修改和替换

优点:

回调(uvm_callback)是为了提高验证平台的代码复用性,也可以用来构建测试用例。

优点:

UVM中添加回调的步骤:

下面是对照例码:

class cb1 extends uvm_callback;//定义回调类
    virtual function void do_trans(edata d);
endclass
class cb2 extends cb1; 
    function void do_trans(edata d);
endclass
class comp1 extends uvm_component;
    `uvm_register_cb(comp1,cb1);//将回调函数cb1与comp1绑定,可以防止调用出错
    edata d;
  `uvm_do_callback(comp1 , cb1 , do_trans(d))//插入回调cb1 
endclass
class env extends uvm_env;
comp1 comp1;
cb1 m_cb1;
cb2 m_cb2;
    m_cb1 = new("m_cb1");
    m_cb2 = new("m_cb2");
    c1 = comp1::type_id::create("c1",this);
    uvm_callbacks #(comp1)::add(c1,m_cb1);
    uvm_callbacks #(comp1)::add(c1,m_cb2);//因为cb2是cb1的子类,调用cb2之前,会调用cb1 
    //在绑定回调函数时,绑定了父类cb1,就不用绑定子类cb2
endclass

标签:sequence,面试,cb1,UVM,sequencer,phase,IC,uvm
来源: https://blog.csdn.net/SummerXRT/article/details/118724810