【UVM】uvm_barrier

         在SV章节中,对于多个线程的同步除了可以通过semaphore和mailbox来进行,也可以通过fork-join的结构控制语句块来控制整体的运行节奏。然而,对于UVM环境中的多个独立组件,SV的这些方法都受到了作用域的局限。UVM提供了一个新的类uvm_barrier用来对多个组件进行同步协调,同时为了解决组件独立运作的封闭性需要,也定义了新的类uvm_barrier_pool来全局管理这些uvm_barrier对象。这里的uvm_barrier_pool同之前的uvm_event_pool一样,也是基于uvm_object_string_pool的通用参数类来进一步定义的:

typedef uvm_object_string_pool #(uvm_barrier) uvm_barrier_pool;

typedef uvm_object_string_pool #(uvm_event#(uvm_object)) uvm_event_pool;

uvm_barrier可以设置一定的等待阈值(threshold),待有不少于该阈值的进程在等待该对象时,也会触发该事件,同时激活所有正在等待的进程,使得可以继续进行。下面我们给出一个实际用例供用户来参考该类的使用方法:

输出结果:

UVM_INFO @ 0: reporter [RNTST] Running test test1...

UVM_INFO @ 0: uvm_test_top.env [BSYNC] env set b1 threshold 3 at 0 ps

UVM_INFO @ 10000: uvm_test_top.env.c1 [BSYNC] c1 wait for b1 at 10000 ps

UVM_INFO @ 20000: uvm_test_top.env.c2 [BSYNC] c2 wait for b1 at 20000 ps

UVM_INFO @ 50000: uvm_test_top.env [BSYNC] env set b1 threshold 2 at 50000 ps

UVM_INFO @ 50000: uvm_test_top.env.c1 [BSYNC] c1 is activated at 50000 ps

UVM_INFO @ 50000: uvm_test_top.env.c2 [BSYNC] c2 is activated at 50000 ps

从上面这个例子来看,c1和c2的run_phase任务之间需要同步,而同步它们的则是顶层的一个uvm_barrier b1。由于c1、c2和env1都共享该对象,这使得c1和c2可以通过wait_for()来等待激活,而env1则可以设置阈值来调控什么时间来“开阀”。从仿真结果可以看到,在一开始的时候,阈值设置为3,但由于等待该barrier的进程只有2个,无法达到阈值条件,使得两个进程都无法激活。而在env1将b1的阈值调低为2时,则等待该barrier的两个进程都被激活。因此通过set_threshold()和wait_for()这样的方式,可以实现多个组件之间的同步,同时又可以保持各个组件之间的独立性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值