UVM笔记1

  1. FIFO的类型有两种,一种是上节介绍的uvm_tlm_analysis_fifo,另外一种是uvm_tlm_fifo。这两者的唯一差别在于前者有一个analysis_export端口,并且有一个write函数,而后者没有。(P308)

  2. uvm_component及其派生类变量的实例化,只能在build_phase完成,假如在其他phase实例化一个uvm_component,那么系统会报错。如果是uvm_object的实例化,则可以在任何phase完成,当然也包括build_phase了。(P322)

  3. UVM phase的执行顺序:1)对于整个环境而言,会先执行完所有组件的build_pahse,再依次执行各组件的connect_phase,run_phase... 2)对于各平行的组件,如i_agent和scoreboard,先执行谁的build_phase,执行顺序是按照字典序的,这里的字典序的排序依据new时指定的名字,如i_agent在new时指定的名字为aaa,而scoreboard的名字为bbb,那么将会先执行i_agent的build_phase,3)对于像driver和scoreboard这种非平行组件,若是i_agent的build_phase先执行,则会继续执行其子组件driver,monitor等的build_phase,然后在执行scoreboard的build_phase,反之,则会先执行scoreboard,再执行driver。(P331)

  4. task main_phase(uvm_phase phase),参数phase的作用是什么?因为要便于在任何component的main_phase中都能raise_objection,而要raise_objection则必须通过phase.raise_objection来完成,所以必须将phase作为参数传递到main_phase等任务中。(P360)

  5. uvm_do系列宏是产生transaction的地方,具体做的工作如下代码:(P421)

tr = new("tr"); 
start_item(tr); 
assert(tr.randomize() with {tr.pload.size() == 200;}); 
finish_item(tr);

6. uvm_do系列宏中,其第一个参数除了可以是transaction的指针外,还可以是某个sequence的指针。当第一个参数是transaction时,它调用此sequence的start任务。注意sequence可以嵌套sequence,sequence可以重用,这个功能非常强大。(P428)

7. 多sequence的同步控制:1)如果是简单的2个或者3个sequence的同步控制,可以通过使用全局的事件event完成;2)对于复杂sequence的同步,最好的方式就是使用virtual sequence。从字面上理解,即虚拟的sequence。虚拟的意思就是它根本就不发送transaction,它只是控制其他的sequence,起统一调度的作用。为了使用virtual sequence,一般需要一个virtual sequencer。virtual sequencer里面包含指向其他真实sequencer的指针。

8. 定义的component、object为什么要注册?

注册是把一个直接或者间接派生自 uvm_component/object的类注册到 factory中,只有注册到factory中,才能使用factory机制。

9. factory机制的重载(set_type/inst_override_by_type)是有前提的,并不是任意的类都可以互相重载,必须满足以下几个条件:(P614)

  1. 注册:无论是重载的类还是被重载的,都要在定义时注册到factory机制中。

  2. 工厂机制实例化:被重载的类在实例化时,要使用factory机制式的实例化方式,而不能使用传统的new方式

  3. 重载的类要与被重载的类有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类。

  4. component与object之间互相不能重载。

10. uvm_root的print_topology函数,可以显示出整棵UVM树的拓扑结构,由于UVM树在build_phase执行完成后才完全建立完成,因此,这个函数应该在build_phase之后调用,可以把其放在所有测试用例的基类base_test中。

uvm_top.print_topology();

 11. starting_phase是什么?作用是什么? 

starting_phase是sequence中的一个变量,uvm_phase类型。sequencer自动将phase传给req变量的startiing_phase。(req指向sequencer发送的sequence), starting_phase用来在sequence中控制验证平台的关闭,只有将此要运行的sequence作为sequencer的某动态运行phase的default_sequence时,其starting_phase才不为null。

 if ( starting_phase != null )
        starting_phase.raise_objection(this)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值