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

在systemverilog中使用初始块与初始化reg变量之间有什么区别?,verilog,simulation,system-verilog,Verilog,Simulation,System Verilog,以下两个例子在模拟方面有什么不同 (A) 及 (B) 逻辑变量是否不同?最终结果是相同的,即从最终用户角度看不会有任何差异。区别在于,在第一种情况下,您是在运行时分配值,而在第二种情况下,您是在编译时分配值。区别在于,作为变量声明的一部分,初始化是在任何initial或always构造启动任何进程之前执行的。如果你写: bit clk; initial clk = 1; always #5 clk++; always @(posedge clk) ...; 关于@(posedge clk)是在

以下两个例子在模拟方面有什么不同

(A)

(B)


逻辑变量是否不同?

最终结果是相同的,即从最终用户角度看不会有任何差异。区别在于,在第一种情况下,您是在运行时分配值,而在第二种情况下,您是在编译时分配值。

区别在于,作为变量声明的一部分,初始化是在任何
initial
always
构造启动任何进程之前执行的。如果你写:

bit clk;
initial clk = 1;
always #5 clk++;
always @(posedge clk) ...;
关于
@(posedge clk)
是在时间0还是时间10触发,存在一个争用条件。 但是:

bit clk = 1;
always #5 clk++;
always @(posedge clk) ...;
不存在与上述内容相关的比赛。第一个posedge将以10个时间单位出现。

类似注释:

int val = 0 ; 
int val1 = val + 10 ; 
将生成一致的结果,因为结果在编译时是固定的,其中

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

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

有一个重要的区别:您已将问题标记为“verilog”和“system verilog”。你是什么意思?答案取决于你的意思,因为两者的行为是不同的

在verilog中:

两者

也会有同样的表现。在两种情况下,
a将在时间0(即在运行时)初始化。这可能导致模拟比赛和非确定性行为。例如:

reg a;
initial a = 1'b1;
initial $display(a);
可能显示
0
或可能显示
1
-初始块之间存在竞争。这段代码也会发生同样的事情:

reg a = 1'b1;
initial $display(a);
reg a = 1'b1;
initial $display(a);
系统中的verilog:

会有不同的表现。在第一种情况下,
a
将在时间0处初始化,即在运行时,这可能再次导致模拟比赛和非确定性行为。但是,此代码不存在此类问题:

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

在这种情况下,
a
将在编译时初始化,因此不存在争用,因此将始终显示
1

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

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

可以使用初始值设定项声明变量,例如:

int i=0

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


那么它对依赖于“a”的信号有任何影响吗?例如,b=#1A;参数在编译时获取其值。变量初始化发生在时间0,即运行时。我认为这对verilog是正确的,但对system-verilog不正确。根据@dave_59的说法,SystemVerilog行为应该与verilog向后兼容。这也不正确。未定义静态变量初始化的顺序。这就是所谓的。这是模拟器特有的区别,还是所有模拟器的标准区别?LRM 1800-2012第6.8节说,将静态变量的初始值设置为变量声明的一部分(包括静态类成员)应在任何初始或始终程序启动之前发生。我认为这对系统verilog是正确的,但对verilog不正确。我认为你的第二个例子仍然会给你一个verilog的竞赛(忽略bit不是verilog类型的事实)。SystemVerilog行为与verilog行为向后兼容。SV只是定义了一个未定义的顺序。任何同时支持SV和Verilog的模拟器都可能只使用SV排序。@dave_59:但“Verilog”行为与SV不向前兼容;一个“Verilog”模拟器有一个竞赛,这个问题同时被标记为“Verilog”和“system Verilog”。两者之间存在差异(见下面我的答案)。
reg a = 1'b1;
initial $display(a);
reg a;
initial a = 1'b0;
reg a = 1'b0;
reg a = 1'b1;
initial $display(a);