在非可合成代码中,有什么区别:
@(a==1);
和
@(posedge a);
他们的行为是否真的相同?
答案 0 :(得分:5)
以下示例(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)
取消阻止。
当一个被认为是比特时,它只能保持0或1,2状态而不是4状态(0,1,x,z)。因此,posedge只能是0 - > 1过渡。在modelsim 10.1中,它不会改变示例的行为。 AldoT(OP)发现@(a==1)
现在与@(a)
的行为相同。
答案 1 :(得分:-2)
第一个等待a
为1
第二个等待a
从0过渡到1。