fork join_any

本文探讨了在并发编程中遇到的一个问题,即如何正确使用forkjoin_any和disablefork来控制线程执行。作者指出,forkjoin_any会允许任何线程完成时继续执行,而忘记添加disablefork会导致两个线程都执行,从而产生错误的状态判断。通过添加disablefork并在适当位置使用,可以确保一个线程执行完毕后停止其他线程,确保程序的正确流程。
摘要由CSDN通过智能技术生成

今天写代码有一个地方理解有点问题,fork join_any的意思是如果内部任何一个线程完成,程序往下执行,但是没有完成的线程还会继续执行,并不是停止,例如我想写一个行为,信号A持续为高1ms,状态跳转st0->st1,如果A持续时间不足1ms,那么状态不跳转,今天写的时候忘记了加disable fork,导致fork join_any内部的两个先后都执行了,结果状态判断就出错了,我期望的是一个begin end执行完成后另一个就不继续执行了,所以需要加上disable fork

                forever @(posedge A)begin//trigger enter state jump condition
                    enter_lp_mode_time=持续的时间; 
                    fork 
                        if(vif.rstn && vif.ms_active)begin//一些不需要检查的条件
                                 begin
                                 `uvm_info(get_type_name(), $sformatf("wait %d ms time state jump condition meet ", 持续时间), UVM_LOW)
                                 fork
                                     begin 
                                         持续时间(可能是多少ms,也可能是count记到多少,建议学成count比较好,因为内部一些count有不对齐的时候)
                                         exp_ps=st1;
                                         `uvm_info(get_type_name(), "Enter st1 state", UVM_LOW)
                                         //disable fork;//一旦这个线程执行完成,立即停止fork内所有线程,写在里面不管用
                                     end
                                     begin
                                         @(negedge A);
                                         exp_ps=st0;
                                         `uvm_info(get_type_name(), "condition keep time donot enough", UVM_LOW)
                                         //disable fork;//一旦这个线程执行完成,立即停止fork内所有线程,写在里面不管用
                                     end
                                 join_any
                                 disable fork;//写在这里才好用
                                 evt_enter_st1.trigger();
                             end
                        end 
                    join_none
                end
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值