以下两个关于模拟的例子有什么区别?
A)
reg a;
initial a = 1'b0;
和
B)
reg a = 1'b0;
逻辑变量有什么不同吗?
答案 0 :(得分:8)
不同之处在于初始化是变量声明的一部分,在任何initial
或always
结构启动的进程之前执行。如果你写了:
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;
将产生不一致的结果[因为赋值的顺序在运行时发生并且依赖于模拟器]