在systemverilog中使用初始块和初始化reg变量有什么区别



以下两个示例在模拟方面有什么区别?

A)

reg a;
initial a = 1'b0;

B)

reg a = 1'b0;

逻辑变量不同吗?

不同之处在于,初始化是在任何initialalways构造启动的任何进程之前执行的变量声明的一部分。如果你写:

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; 

将产生不一致的结果[因为分配顺序发生在运行时,并且取决于模拟器]

最新更新