等待 SV 中同一时间步的一点变化
Wait for A Bit Change in Same Timestep in SV
这是代码
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
现在在这段代码中,会发生超时,因为 x = 1 & x = 0 是在单个时间步中完成的。
一个解决方案是在 x = 1 和 x = 0 之间提供延迟,这样两个等待都可以正常工作。
有没有其他方法可以在不提供硬编码延迟的情况下工作?
注意:- 有了事件或信号量之类的东西,这个问题就可以解决了。但我正在寻找编码风格或方法方面的答案,它可以在不使用事件的情况下工作。
有几种方法,您可以在这里使用,如事件、信号量、标志等。
我在您的代码中添加了一个事件。请在下面找到修改后的代码 link.
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
=> 第二个选项不是一个好的编码习惯,但它会解决您的问题,因为两个分配语句都适用于不同的区域。
这是代码
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
现在在这段代码中,会发生超时,因为 x = 1 & x = 0 是在单个时间步中完成的。
一个解决方案是在 x = 1 和 x = 0 之间提供延迟,这样两个等待都可以正常工作。
有没有其他方法可以在不提供硬编码延迟的情况下工作?
注意:- 有了事件或信号量之类的东西,这个问题就可以解决了。但我正在寻找编码风格或方法方面的答案,它可以在不使用事件的情况下工作。
有几种方法,您可以在这里使用,如事件、信号量、标志等。
我在您的代码中添加了一个事件。请在下面找到修改后的代码 link.
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
=> 第二个选项不是一个好的编码习惯,但它会解决您的问题,因为两个分配语句都适用于不同的区域。