【发布时间】:2014-10-14 08:43:45
【问题描述】:
在不可合成的代码中,有什么区别:
@(a==1);
和
@(posedge a);
他们的行为实际上是一样的吗?
【问题讨论】:
在不可合成的代码中,有什么区别:
@(a==1);
和
@(posedge a);
他们的行为实际上是一样的吗?
【问题讨论】:
以下示例 (on EDA Playground) 表明它们并不相同:
module test;
logic a = 1'b0;
initial begin
#100ns a <= 1'b1;
#100ns a <= 1'b0;
#100ns a <= 1'b1;
#1000ns $finish;
end
initial begin
@(a == 1'b1)
$display("%t : a == 1 (1) %b",$realtime, a);
@(a == 1'b1)
$display("%t : a == 1 (2) %b",$realtime, a);
@(a == 1'b1)
$display("%t : a == 1 (3) %b",$realtime, a);
end
initial begin
@(posedge a)
$display("%t : posedge a (1)",$realtime);
@(posedge a)
$display("%t : posedge a (2)",$realtime);
@(posedge a)
$display("%t : posedge a (3)",$realtime);
end
endmodule
显示的内容
100 : posedge a (1)
100 : a == 1 (1) 1
200 : a == 1 (2) 0
300 : a == 1 (3) 1
300 : posedge a (2)
@(posedge a) 在从 x/z/0 到 1 的真正转换时解除阻塞。@(a == 1) 在更改之前或之后的更改为 true 时解除阻塞。
当一个被声明为位时,它只能保存 0 或 1,2-state 而不是 4-state (0,1,x,z)。因此posedge只能是0 -> 1的过渡。在 modelsim 10.1 中,它不会改变示例的行为。 AldoT (OP) 观察到 @(a==1) 现在的行为与 @(a) 相同。
【讨论】:
@(a==1) 等效于 @(a) - 前提是 a 是 1 位。如果 a 超过一位,行为可能会有所不同 - 我没有尝试过这种情况。
第一个等待a成为1
第二个等待a从0转换到1。
【讨论】:
@(posedge a) 将等待另一个转换0->1,而@(a==1) 将处于活动状态,直到您使用0 驱动a。
wait(a==1),直到我们将a 驱动到0。