@(a == 1)和@(posedge a)之间的区别

时间:2014-10-14 08:43:45

标签: verilog system-verilog

在非可合成代码中,有什么区别:

@(a==1); 

@(posedge a);

他们的行为是否真的相同?

2 个答案:

答案 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)

第一个等待a1

第二个等待a从0过渡到1。