【问题标题】:What is the difference between using an initial block vs initializing a reg variable in systemverilog?在 systemverilog 中使用初始块与初始化 reg 变量有什么区别?
【发布时间】:2016-07-18 20:12:48
【问题描述】:

以下两个示例在模拟方面有什么区别?

一)

reg a;
initial a = 1'b0;

B)

reg a = 1'b0;

逻辑变量有区别吗?

【问题讨论】:

  • 您已将其标记为“verilog”和“system-verilog”。两者之间是有区别的(见下面我的回答)。

标签: verilog simulation system-verilog


【解决方案1】:

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

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 个时间单位出现。

【讨论】:

  • 这种区别是模拟器特有的还是应该是所有模拟器的标准?
  • LRM 1800-2012 第 6.8 节说 将静态变量的初始值设置为变量声明的一部分(包括静态类成员)应在任何初始或始终过程开始之前进行我>
  • 我认为这对于 system-verilog 是正确的,但对于 verilog 是不正确的。我认为你的第二个例子仍然会让你在 verilog 中竞争(忽略 bit 不是 verilog 类型的事实)。
  • SystemVerilog 行为向后兼容 Verilog 行为。 SV 只是定义了一个未定义的顺序。任何同时支持 SV 和 Verilog 的模拟器都可能只使用 SV 排序。
  • @dave_59:但“Verilog”行为与 SV 不向前兼容;一个“Verilog”模拟器有一个比赛,问题被标记为两者。
【解决方案2】:

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

【讨论】:

  • 那么它对依赖于“a”的信号有影响吗?例如,b = #1 a;
  • 参数在编译时获取它们的值。变量初始化发生在时间 0,即运行时间。
  • 我认为这对于verilog是正确的,但对于system-verilog是不正确的。
  • 根据@dave_59 的response,SystemVerilog 行为应该向后兼容 Verilog。
【解决方案3】:

有一个重要区别:您已将问题标记为“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

【讨论】:

    【解决方案4】:

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

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

    可以用初始化器声明变量,例如:

    int i = 0;

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

    【讨论】:

      【解决方案5】:

      类似的说明:

      int val = 0 ; 
      int val1 = val + 10 ; 
      

      将产生一致的结果,因为结果在编译时是固定的,其中

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

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

      【讨论】:

      猜你喜欢
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      相关资源
      最近更新 更多