这是代码
module m;
bit x;
initial
begin
fork
begin
wait(x == 1);
wait(x == 0);
end
begin
@(x == 1);
@(x == 0);
end
#10 $display("Timeout");
join_any
disable fork;
end
initial
begin
#5;
x = 1;
// Some other Logical Stuff
x = 0;;
end
endmodule
现在在这段代码中,Timeout将会发生,因为x = 1& x = 0在单个时间步骤中完成。
一种解决方案是在x = 1和1之间提供延迟。 x = 0,然后两个等待都可以正常工作。
是否有其他方法可以在不提供硬编码延迟的情况下工作?
注意: - 对于事件或信号量之类的东西,这个问题可以解决。但我正在寻找编码风格或方法的答案,它可以在不使用事件的情况下工作。
答案 0 :(得分:2)
有几种方法,你可以在这里使用,如事件,信号量,旗帜等。 我在您的代码中添加了一个事件。请在下面的链接中找到修改后的代码 http://www.edaplayground.com/x/Ws3
还有其他方法,例如,
1.分配值" 1"到x,在其声明中
例如,位x = 1;
2.在第二个初始块中一起使用阻塞和非阻塞分配
例如,
initial
begin
#5;
x = 1;
// Some other Logical Stuff
x <= 0; // Add non-blocking assignment
end
end
=&GT;第二个选项不是一个好的编码实践,但它会解决您的问题,因为任务分配都适用于不同的区域。