Verilog @(a==1)和@(posedge a)之间的差

Verilog @(a==1)和@(posedge a)之间的差,verilog,system-verilog,Verilog,System Verilog,在不可合成代码中,以下代码之间的区别是什么: @(a==1); 及 它们的行为实际上是一样的吗?第一个等待a成为1 第二个等待a从0转换为1。下面的示例()显示它们不一样: module test; logic a = 1'b0; initial begin #100ns a <= 1'b1; #100ns a <= 1'b0; #100ns a <= 1'b1; #1000ns $finish; end initial

在不可合成代码中,以下代码之间的区别是什么:

@(a==1); 


它们的行为实际上是一样的吗?

第一个等待
a
成为
1

第二个等待
a
从0转换为1。

下面的示例()显示它们不一样:

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
@(posedge a)
在从x/z/0到1的真正转换中取消阻止。
@(a==1)
在更改之前或之后的更改中为true时取消阻止

一点
当一个ID声明为位时,它只能保存0或1,2状态而不是4状态(0,1,x,z)。因此,posedge只能是0->1转换。在modelsim 10.1中,它不会改变示例的行为。(OP)观察到
@(a==1)
现在的行为与
@(a)

相同,@(posedge a)将在从x/z转换到1时触发,至少在我的模拟器中是这样。@Morgan,是的,我知道它是用于从0/x/z转换到1的。问题是,当从0/x/z转换到1时,@(a==1)或@(posedge a)将触发。看起来他们的行为是一样的。@AldoT:是的,他们都会在那一刻触发。但是在那之后,
@(posedge a)
将等待另一个转换
0->1
,而
@(a==1)
将一直处于活动状态,直到你用
0
驱动
a
。@Qiu我想应该是
等待(a==1)
直到我们将
a
驱动到
0
“位”只能是0或1。在这种情况下,
@(a==1)
相当于
@(a)
——前提是a是1位。如果a超过一位,行为可能会有所不同-我还没有尝试过这个案例。
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)