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

sup*_*nun 4 simulation verilog system-verilog

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

一个)

reg a;
initial a = 1'b0;
Run Code Online (Sandbox Code Playgroud)

B)

reg a = 1'b0;
Run Code Online (Sandbox Code Playgroud)

逻辑变量是不同的?

dav*_*_59 8

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

bit clk;
initial clk = 1;
always #5 clk++;
always @(posedge clk) ...;
Run Code Online (Sandbox Code Playgroud)

@(posedge clk)在0时或10时是否触发了竞争条件.但是:

bit clk = 1;
always #5 clk++;
always @(posedge clk) ...;
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*lor 4

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

在verilog中:

两个都

reg a;
initial a = 1'b0;
Run Code Online (Sandbox Code Playgroud)

reg a = 1'b0;
Run Code Online (Sandbox Code Playgroud)

也会有同样的行为方式。在这两种情况下,它将在时间 0(即运行时)a初始化。这可能会导致模拟竞争和不确定性行为。例如:

reg a;
initial a = 1'b1;
initial $display(a);
Run Code Online (Sandbox Code Playgroud)

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

reg a = 1'b1;
initial $display(a);
Run Code Online (Sandbox Code Playgroud)

在系统verilog中:

reg a;
initial a = 1'b0;
Run Code Online (Sandbox Code Playgroud)

reg a = 1'b0;
Run Code Online (Sandbox Code Playgroud)

会有不同的行为。在第一种情况下,a它将在时间 0 处初始化,即在运行时初始化,这又会导致模拟竞争和不确定性行为。然而这段代码不存在这样的问题:

reg a = 1'b1;
initial $display(a);
Run Code Online (Sandbox Code Playgroud)

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