使用 "initial" 块和不使用块的简单赋值有什么区别?

What is the difference between simple assignments with "initial" block and without it?

举个例子,这两种实现有什么区别?

initial 语句:

module with_initial();
reg clk,reset,enable,data;

initial begin
  clk=0;
  reset=0;
  enable=0;
  data=0;
end

always @(…)
..
end

endmodule

这里没有使用 initial 语句:

module without_initial();
reg clk,reset,enable,data;

clk=0;
reset=0;
enable=0;
data=0;

always @(…)
..
end

endmodule

without_initial 中的代码不是合法的语法,它会为您产生编译错误,就像 edaplayground 上的模拟器一样。

程序分配必须在 initialalways 块内。请参阅 IEEE 标准 1800-2017,第 10.4 节 程序分配

此外,reg 可以在 initial 块之外声明一个初始值:

module without_initial;

reg clk=0;
reg reset=0;
reg enable=0;
reg data=0;

endmodule

参考 IEEE Std 1800-2017,第 6.8 节变量声明

初始块是你的执行开始的地方,它们执行于 时间 0。这是一个不可合成的程序语句(在某种意义上它不能被建模为硬件)。它仅用于初始化所有变量并以特定值驱动它们。

在 veriog (HDL) 中,至少有一个初始块是强制性的。如果您跳过添加该块,可能会由于以下原因导致错误:

1) 编译器永远不知道将什么驱动到代码中使用的建模门中。 2) 对变量的赋值永远不会发生。

不太确定。但这就是我感觉到的场景背后发生的事情。