通信同步(uvm_event、uvm_barrier 、uvm_callback)— UVM

前言

UVM需要解决组件之间的线程同步问题。SV中可以用event、semaphore和mailbox进行线程同步,但是考虑到UVM组件的封闭性原则,不推荐采用层次索引的形式来索引公共的event或者semaphore,UVM通过如下的类来达到组件之间的同步:

  • 两个组件之间的同步:uvm_event,uvm_event_pool 和 uvm_event_callback
  • 多个组件之间的同步:uvm_barrier ,uvm_barrier_pool

1. uvm_event

不同组件可以共享一个uvm_event,这不需要通过跨层次传递uvm_event对象句柄来实现共享,该共享方式是通过uvm_event_pool 这个全局资源池来实现的。

uvm_event_pool 资源池是uvm_object_string_pool #(T)的子类,它可以生成和获取通过字符串来索引的uvm_event对象。

通过全局资源池(唯一的),环境中任何组件都可以从资源池获取共享的对象句柄,这样就避免了组件之间的互相依赖。

e1 = uvm_event_pool::get_global("实例名");//获取句柄
//有的话就会返回这个句柄,没有的话就会先创建一个e1句柄

uvm_event类与event相比,区别在于

  • event被 -> 触发后,会触发使用@等待该事件的对象;uvm_event通过trigger()来触发,会触发wait_trigger()等待该事件的对象;
  • 如果要再次等待事件触发,event只需要再次用 -> 来触发,而uvm_event需要先通过reset()方法重置初始状态,再使用trigger()来触发;
  • event无法携带更多的信息,而uvm_event可以通过trigger(T data=null)的可选参数,将伴随触发的数据对象都写入到该触发事件中,而等待该事件的对象可以通过方法wait_trigger_data(output T data)来获取事件触发时写入的数据对象;
  • event触发时无法直接触发回调函数,而uvm_event可以通过add_callback(uvm_event_callback cb,bit append = 1)函数来添加回调函数;
  • event无法直接获取等待它的进程数目,而uvm_event可以通过get_num_waiters()来获取等待它的进程数目。

uvm_evevt 的总结:

  • 组件之间常规的数据流向是通过TLM通信方法实现的,比如sequencer与driver之间,或者monitor与scoreboard之间;

  • 如果uvm_object和uvm_component或者uvm_object与uvm_object对象之间如果要发生同步,此时无法通过TLM完成数据传输,因为TLM传输必须是在组件与组件之间(uvm_object无法例化端口)

    例如需要在sequence与sequence之间进行同步,或者sequence与drive之间同步,就需要借助uvm_event


2. uvm_barrier

  • uvm_barrier可以对多个组件之间进行同步协调,通过uvm_barrier_pool来全局管理这些uvm_barrier对象。
  • uvm_barrier_pool继承与uvm_object_string_pool #(T) ;
  • uvm_barrier可以uvm_barrier::set_threshold()设置一定的等待阈值,当有不少于该阈值的进程在等待该对象时,才会触发该事件爱你,同时激活所有正在等待uvm_barrier::wait_for()的进程,使其可以继续进行。
//在底层
uvm_barrier b1;
b1 = uvm_barrier_pool::get_global("b1");
b1.wait_for();//等待激活
...
//在顶层
uvm_barrier b1;
...
b1 = uvm_barrier_pool::get_global("b1");
b1.set_threshold(3);//当wait_for()的线程到达3时,所有等待线程继续

3. uvm_callback

uvm提供覆盖机制(override)来修改和替换,除了覆盖机制,也可以采用callback为用户添加自定义的新方法。

class cb1 extends uvm_callback;//定义回调类
    virtual function void do_trans(edata d);
endclass

class cb2 extends cb1; 
    virtual 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))//插入cb 
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(cp1,m_cb2);//因为cb2是cb1的子类,调用cb2之前,会调用cb1 
    //在绑定回调函数时,绑定了父类cb1,就不用绑定子类cb2
endclass

步骤:

  • 定义回调类,继承于 uvm_callback ;
  • `uvm_register_cb(目的类,回调类) ,绑定回调类和组件;
  • `uvm_do_callback(目的类,回调类 ,回调函数) ,在类中插入回调函数;
  • 例化callback对象(cb1和cb2)通过uvm_callbacks #(T,CB)类的静态方法 add( ) 来添加成对的uvm_object对象和callback对象;
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UVM_CB_TRACE_ON是一个编译选项,用于在UVM日志中打印出callback的跟踪信息。当编译时带上UVM_CB_TRACE_ON宏时,UVM库会在日志中记录callback的相关信息。 此外,UVM库还提供了其他一些命令行参数来跟踪资源库的存取信息。例如,UVM_CONFIG_DB_TRACE用于跟踪uvm_config_db的存取操作,UVM_RESOURCE_DB_TRACE用于跟踪uvm_resource_db的存取操作。通过在仿真命令中添加这些参数,可以在日志中打印出对资源库的存取信息。 因此,UVM_CB_TRACE_ON是一个用于在UVM日志中打印callback跟踪信息的编译选项。同时,UVM还提供了其他选项来跟踪资源库的存取信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [UVM环境debug的正确开启方式](https://blog.csdn.net/W1Z1Q/article/details/131488517)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【数字IC前端】UVM常见问题系列](https://blog.csdn.net/ultra777/article/details/106673859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值