以下两个示例在模拟方面有什么区别?
A)
reg a;
initial a = 1'b0;
和
B)
reg a = 1'b0;
逻辑变量不同吗?
不同之处在于,初始化是在任何initial
或always
构造启动的任何进程之前执行的变量声明的一部分。如果你写:
bit clk;
initial clk = 1;
always #5 clk++;
always @(posedge clk) ...;
存在关于CCD_ 3是在时间0还是在时间10被触发的竞赛条件。但是:
bit clk = 1;
always #5 clk++;
always @(posedge clk) ...;
不存在与上述内容相关的竞赛。第一次装腔作势将以10个时间单位出现。
有一个重要区别:您将问题标记为"verilog"one_answers"system verilog"。你的意思是什么?答案取决于你的意思,因为两者的行为不同。
在verilog中:
两个
reg a;
initial a = 1'b0;
和
reg a = 1'b0;
会以同样的方式行事。在这两种情况下,a
将在时间0初始化,即在运行时初始化。这可能导致模拟竞赛和不确定性行为。例如:
reg a;
initial a = 1'b1;
initial $display(a);
可能显示CCD_ 5或可能显示CCD_。完全同样的事情也会发生在这个代码上:
reg a = 1'b1;
initial $display(a);
系统内验证日志:
reg a;
initial a = 1'b0;
和
reg a = 1'b0;
会有不同的表现。在第一种情况下,a
将在时间0初始化,即在运行时初始化,这可能再次导致模拟竞赛和非确定性行为。然而,这个代码不存在这样的问题:
reg a = 1'b1;
initial $display(a);
在这种情况下,a
将在编译时初始化,因此不存在竞争,因此1
将始终显示。
最终结果是一样的,即从最终用户的角度来看不会有任何差异。不同之处在于,在第一种情况下,您在运行时分配值,而在第二种情况下则在编译时分配值。
变量初始化在执行任何其他过程块之前完成
根据Verilog LRM 1800-2012系统,主题6.8
变量可以用初始值设定项声明,例如:
int i=0;
将静态变量的初始值设置为应出现变量声明(包括静态类成员)在开始任何初始或始终程序之前(另请参见6.21和10.5关于具有静态和自动寿命的变量初始化)。
类似说明:
int val = 0 ;
int val1 = val + 10 ;
将产生一致的结果,因为结果在编译时是固定的,其中作为
initial val = 0 ;
initial val1 = val + 10;
将产生不一致的结果[因为分配顺序发生在运行时,并且取决于模拟器]