【问题标题】:always block with no sensitivity list - $display not executed总是在没有敏感度列表的情况下阻塞 - $display 未执行
【发布时间】:2020-06-20 15:07:28
【问题描述】:

当我运行以下 Verilog 代码时出现错误:

警告:@* 未发现任何敏感信息,因此它永远不会触发。

module main;
  
  reg b;
  always @(*) begin
    
    $display("entered always block/n");
  end
  
endmodule

有人可以详细说明一下吗?有什么方法可以在没有“敏感列表”的情况下使用$display

【问题讨论】:

    标签: verilog digital-design


    【解决方案1】:

    您的模拟器正确地警告您异常情况。 $display 语句将永远不会被执行。因此,它是无用的代码。

    隐含的敏感度列表(@*)意味着只有在某些信号(如b)改变值时才会输入它,并且它用于@内某些表达式的右侧(RHS) 987654325@。问题是您的块内没有任何信号。请参阅 IEEE Std 1800-2017,第 9.4.2.2 节 隐式事件表达式列表

    如果您将b 添加到您的简单示例中,如果b 有任何更改,将触发always 块:

    module main;
      
      reg b;
      always @(*) begin
        $display("entered always block and b=%b", b);
      end
    
    initial begin
        b=0;
        #50 $finish;
    end
    
    always #5 b = ~b;
        
    endmodule
    

    输出:

    entered always block and b=0
    entered always block and b=1
    entered always block and b=0
    entered always block and b=1
    entered always block and b=0
    entered always block and b=1
    entered always block and b=0
    entered always block and b=1
    entered always block and b=0
    entered always block and b=1
    

    edaplayground 上的可运​​行示例。

    【讨论】:

      【解决方案2】:

      always 构造引入了无限循环的程序代码序列。它必须至少有一个程序阻塞结构,否则它会进入一个无限的零延迟循环。这会阻止执行其他任何操作。

      always 的预期用途是等待某个信号发生变化,或者等待某个时间延迟。但如果你只希望$display 执行一次,请使用initial 而不是always,它会在时间0 开始执行程序序列,而不是循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        相关资源
        最近更新 更多