当我运行以下 Verilog 代码时,出现错误:
警告:@* 没有发现任何敏感性,因此它永远不会触发。
module main;
reg b;
always @(*) begin
$display("entered always block/n");
end
endmodule
有人可以详细说明一下吗?有什么方法可以$display
在没有“敏感列表”的情况下使用?
当我运行以下 Verilog 代码时,出现错误:
警告:@* 没有发现任何敏感性,因此它永远不会触发。
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 节隐式事件表达式列表。
如果您添加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 开始执行程序序列一次,而不是循环。