【问题标题】:The difference between @(a==1) and @(posedge a)@(a==1) 和@(posedge a) 的区别
【发布时间】:2014-10-14 08:43:45
【问题描述】:

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

@(a==1); 

@(posedge a);

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

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    以下示例 (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) 相同。

    【讨论】:

    • "bit" 只能是 0 或 1。在这种情况下,@(a==1) 等效于 @(a) - 前提是 a 是 1 位。如果 a 超过一位,行为可能会有所不同 - 我没有尝试过这种情况。
    【解决方案2】:

    第一个等待a成为1

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

    【讨论】:

    • 好吧,@(posedge a) 会在从 x/z 转换到 1 时触发,至少在我的模拟器中是这样。
    • @Morgan,是的,我知道这是从 0/x/z 到 1 的过渡。问题是,@(a==1) 或 @(posedge a) 将在从0/x/z 到 1。看起来它们的行为方式相同。
    • @AldoT:是的,它们都会在那一刻触发。但在那之后@(posedge a) 将等待另一个转换0-&gt;1,而@(a==1) 将处于活动状态,直到您使用0 驱动a
    • @Qiu 我猜应该是wait(a==1),直到我们将a 驱动到0
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多