【发布时间】:2016-07-18 20:12:48
【问题描述】:
以下两个示例在模拟方面有什么区别?
一)
reg a;
initial a = 1'b0;
和
B)
reg a = 1'b0;
逻辑变量有区别吗?
【问题讨论】:
-
您已将其标记为“verilog”和“system-verilog”。两者之间是有区别的(见下面我的回答)。
标签: verilog simulation system-verilog
以下两个示例在模拟方面有什么区别?
一)
reg a;
initial a = 1'b0;
和
B)
reg a = 1'b0;
逻辑变量有区别吗?
【问题讨论】:
标签: verilog simulation system-verilog
不同之处在于初始化作为变量声明的一部分在任何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) ...;
上面没有比赛。第一个姿势将在 10 个时间单位出现。
【讨论】:
最终结果是相同的,即从最终用户的角度来看不会有任何差异。不同之处在于,在第一种情况下,您是在运行时分配值,而在第二种情况下,您是在编译时分配值。
【讨论】:
有一个重要区别:您已将问题标记为“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);
在系统verilog中:
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;
将产生不一致的结果 [因为分配的顺序发生在运行时并且取决于模拟器]
【讨论】: