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)
逻辑变量是不同的?
不同之处在于初始化作为变量声明的一部分在任何initial
或always
构造启动的任何进程之前执行.如果你写道:
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个时间单位出现.
有一个重要的区别:您已将问题标记为“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