Verilog 始终在没有灵敏度列表的情况下阻止-$display未执行

Verilog 始终在没有灵敏度列表的情况下阻止-$display未执行,verilog,digital-design,Verilog,Digital Design,当我运行以下Verilog代码时,我得到一个错误: 警告:@*未发现任何敏感性,因此它将永远不会触发 有人能详细说明一下吗?有没有什么方法可以在没有“灵敏度列表”的情况下使用$display。$display语句将永远不会执行。因此,它是无用的代码 隐式敏感度列表(@*)意味着只有当某个信号(如b)改变值时,才会输入它,并且它总是在中某个表达式的右侧(RHS)使用。问题是你的街区内没有任何信号。参考IEEE标准1800-2017,第9.4.2.2节隐式事件表达式列表 如果将b添加到简单示例中,如

当我运行以下Verilog代码时,我得到一个错误:

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


有人能详细说明一下吗?有没有什么方法可以在没有“灵敏度列表”的情况下使用
$display
$display
语句将永远不会执行。因此,它是无用的代码

隐式敏感度列表(
@*
)意味着只有当某个信号(如
b
)改变值时,才会输入它,并且它总是在
中某个表达式的右侧(RHS)使用。问题是你的街区内没有任何信号。参考IEEE标准1800-2017,第9.4.2.2节隐式事件表达式列表

如果将
b
添加到简单示例中,如果
b
上有任何更改,将触发
始终
块:

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

可运行的示例。

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

隐式敏感度列表(
@*
)意味着只有当某个信号(如
b
)改变值时,才会输入它,并且它总是在
中某个表达式的右侧(RHS)使用。问题是你的街区内没有任何信号。参考IEEE标准1800-2017,第9.4.2.2节隐式事件表达式列表

如果将
b
添加到简单示例中,如果
b
上有任何更改,将触发
始终
块:

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

上的可运行示例。

始终
构造引入了一个无休止循环的过程性代码序列。它必须至少有一个过程阻塞构造,否则它将进入无限零延迟循环。这就阻止了其他任何事情的发生


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

always
构造引入了一个无限循环的过程序列。它必须至少有一个过程阻塞构造,否则它将进入无限零延迟循环。这就阻止了其他任何事情的发生

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