今天写代码有一个地方理解有点问题,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