UVM细小知识点梳理(一)

  • run_test

    • run_test语句会自动的创建一个传入类名的实例,并且自动调用其main_phase。
    • 根据类名创建一个类的实例,这是uvm_component_utils宏所带来的结效果,只有在类定义的时候声明了这个宏,才能使用这个功能。
    • 在UVM验证平台中,只要一个类使用uvm_component_utils注册且此例被实例化了,那么这个类的main_phase就会被自动的调用。
    • UVM通过run_test语句实例化了一个脱离了top_tb层次结构的实例,建立了名为uvm_test_top的一个新的层次结构。对于这种脱离了top_tb层次结构,同时又期望在top_tb中对其进行某些操作的实例,UVM引入了config_db机制。
  • UVM要求UVM树最晚在build_phase时段完成,如果build_phase后的某个phase实例化一个component,就会产生错误。实例化工作还可以放在new函数。

  • 如果需要通过config_db传递is_active的值,需要在实例化之前使用config_db语句传递值,所以还是建议在build_phase中进行实例化。

  • driver中设置断点观察执行顺序,结果:new函数==>build_phase。

  • 一个sequence在向sequencer发送transaction前,要先向sequencer发送一个请求,sequencer把这个请求放在一个仲裁队列中,作为sequencer,需要做两件事情,第一:检测仲裁队列里是否有某个sequence发送transaction的请求,第二,检测driver是否申请transaction。

  • driver中的成员变量seq_item_port和sequencer中的成员变量seq_item_export进行连接通信,在driver使用get_next_item得到一个transaction时,sequencer自己保存一个刚刚发送的transaction,当出现sequencer发出了transaction而driver未接收到是,sequencer会把保留的这份transaction再次发送。

  • get_next_item是阻塞的,他会一直等到有新的transaction;而try_next_item是非阻塞的,如果没有新的transaction直接返回null。

  • sequence只需要在某个component的main_phase中使用start函数启动即可。

  • 通过default_phase启动sequence,sequence设置为某个sequencer的某个phase的default_sequence。这样随着phase的执行,sequence会自动执行:

uvm_config_db#(uvm_object_wrapper)::set(this,"i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());
  - 第一个和第二个参数为组成路径。
  - 当在tb中使用是,由于tb不是一个类,无法使用this指针,第一个参数为null,第二个参数就需要使用绝对路径uvm_test_top.*
  -  starting_phase是uvm_sequence指向phase的一个指针,当sequencer在main_phase中启动default_sequence时,sequencer就将phase赋值给sequence中的这个指针,从而满足了starting_phase!= null的这个条件。
  - 可以在sequence中使用start_phase进行提起和撤销objection。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值