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

时间:2016-07-18 20:12:48

标签: verilog simulation system-verilog

以下两个关于模拟的例子有什么区别?

A)

reg a;
initial a = 1'b0;

B)

reg a = 1'b0;

逻辑变量有什么不同吗?

5 个答案:

答案 0 :(得分:8)

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

bit clk;
initial clk = 1;
always #5 clk++;
always @(posedge clk) ...;

{0}在时间0或时间10是否触发了@(posedge clk)的竞争条件。 但是:

bit clk = 1;
always #5 clk++;
always @(posedge clk) ...;

以上没有比赛。第一次曝光将以10个时间单位出现。

答案 1 :(得分:3)

最终结果是相同的,即,与最终用户的观点没有任何差别。不同之处在于,在第一种情况下,您在运行时分配值,在第二种情况下,您将在编译期间分配值。

答案 2 :(得分:2)

变量初始化在任何其他程序块执行之前完成。

根据系统Verilog LRM 1800-2012,主题6.8

  

可以使用初始化程序声明变量,例如:

     

int i = 0;

     

将静态变量的初始值设置为   变量声明(包括静态类成员)应该发生   在任何初始或始终程序开始之前(参见6.21和   10.5关于使用静态和自动寿命的变量初始化。)

答案 3 :(得分:1)

有一个重要的区别:你已经标记了你的问题" verilog"和" system-verilog"。你的意思是?答案取决于你的意思,因为两者的行为都不同。

在verilog中:

两者

reg a;
initial a = 1'b0;

reg a = 1'b0;

的行为方式相同。在两个情况下,a将在时间0初始化,即在运行时。这可能导致模拟竞赛和非确定性行为。例如:

reg a;
initial a = 1'b1;
initial $display(a);

可能会显示0或可能会显示1 - 初始块之间存在竞争。 完全这个代码会发生同样的事情:

reg a = 1'b1;
initial $display(a);

在system-verilog中:

reg a;
initial a = 1'b0;

reg a = 1'b0;

表现不同。在第一种情况下,a将在时间0初始化,即在运行时,这也会导致模拟竞赛和非确定性行为。但是,此代码没有这样的问题:

reg a = 1'b1;
initial $display(a);

在这种情况下,a将在编译时初始化,因此没有比赛,因此将始终显示1

答案 4 :(得分:-1)

类似的说明:

int val = 0 ; 
int val1 = val + 10 ; 

将产生一致的结果,因为结果在编译时固定,其中为

initial val = 0 ; 
initial val1 = val + 10; 

将产生不一致的结果[因为赋值的顺序在运行时发生并且依赖于模拟器]