使用 "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 上的模拟器一样。
程序分配必须在 initial
或 always
块内。请参阅 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) 对变量的赋值永远不会发生。
不太确定。但这就是我感觉到的场景背后发生的事情。
举个例子,这两种实现有什么区别?
与 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 上的模拟器一样。
程序分配必须在 initial
或 always
块内。请参阅 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) 对变量的赋值永远不会发生。
不太确定。但这就是我感觉到的场景背后发生的事情。