总是在没有敏感列表的情况下阻止 - $display 未执行
always block with no sensitivity list - $display not executed
当我 运行 以下 Verilog 代码时出现错误:
warning: @* found no sensitivities so it will never trigger.
module main;
reg b;
always @(*) begin
$display("entered always block/n");
end
endmodule
有人可以详细说明一下吗?有没有什么方法可以在没有“敏感度列表”的情况下使用 $display
?
您的模拟器正确地向您发出异常情况警告。 $display
语句永远不会被执行。因此,它是无用的代码。
隐式敏感度列表(@*
)表示只有在某些信号(如b
)改变值时才会进入,并用在右侧(RHS) always
中的一些表达式。问题是您的街区内没有任何信号。请参阅 IEEE Std 1800-2017,第 9.4.2.2 节 Implicit event_expression list.
如果您将 b
添加到您的简单示例中,则 always
块将在 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
edaplayground 上的可运行示例。
always
构造引入了一个无限循环的程序代码序列。它必须至少有一个程序阻塞结构,否则它会进入一个无限的零延迟循环。这会阻止其他任何事情的执行。
always
的预期用途是等待一些信号改变,或者等待一些时间延迟。但是,如果您只希望 $display
执行一次,请使用 initial
而不是 always
,它将在时间 0 开始执行程序序列一次,而不是循环。
当我 运行 以下 Verilog 代码时出现错误:
warning: @* found no sensitivities so it will never trigger.
module main;
reg b;
always @(*) begin
$display("entered always block/n");
end
endmodule
有人可以详细说明一下吗?有没有什么方法可以在没有“敏感度列表”的情况下使用 $display
?
您的模拟器正确地向您发出异常情况警告。 $display
语句永远不会被执行。因此,它是无用的代码。
隐式敏感度列表(@*
)表示只有在某些信号(如b
)改变值时才会进入,并用在右侧(RHS) always
中的一些表达式。问题是您的街区内没有任何信号。请参阅 IEEE Std 1800-2017,第 9.4.2.2 节 Implicit event_expression list.
如果您将 b
添加到您的简单示例中,则 always
块将在 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
edaplayground 上的可运行示例。
always
构造引入了一个无限循环的程序代码序列。它必须至少有一个程序阻塞结构,否则它会进入一个无限的零延迟循环。这会阻止其他任何事情的执行。
always
的预期用途是等待一些信号改变,或者等待一些时间延迟。但是,如果您只希望 $display
执行一次,请使用 initial
而不是 always
,它将在时间 0 开始执行程序序列一次,而不是循环。