4

以下代码有什么区别?

initial begin
  clk = 0 ;
  forever begin
    #5  clk =   ~clk;
  end
end


initial begin
  clk = 0 ;
  forever begin
    clk = #5  ~clk;
  end
end

我确实知道惯性和传输延迟之间的区别,并且我知道在这两种情况下都会生成时钟(两者之间存在一些相位差),但我想知道模拟器如何对以下代码做出反应。它是相同的还是不同的 ?比如在计算值时考虑了多少事件?

4

1 回答 1

1

两者从使用上的区别:

#5 clk = ~clk;表示等待 5 个时间步然后执行clk = ~clk;

对于 WiresB = #5 A;意味着 B 从 5 个时间步前分配给 A。A 领先 B 5 个时间步长。如果 B 更改为 AA = #5 A;

wire B;
assign B= #5 A;

IEEE 1800-20126.7 节网络声明涵盖了电线的使用

从@new2androids 更新语法A = #5 B;,因为寄存器不同于电线。B 每 5 个时间单位检查一次,并立即为 A 赋值。这就是为什么它适用于测试台时钟生成。

至于模拟器如何反应,可能会有一些其他人可以评论的标准调度实践,但在某种程度上它可能取决于您使用的模拟器。

@new2android 提供了从1996 年读取的以下信息:了解 Verilog 阻塞和非阻塞分配

  1. #5 A = B;宽度小于 5 的脉冲会被模拟器忽略
  2. A = #5 B;每 5 个时间单位检查输入并立即分配值

笔记

  1. 所有延迟的使用仅用于模拟,不可综合。
  2. B <= #5 A;问题和答案不涵盖使用延迟( ,#5 B <= A;)的非阻塞变体时的差异。
于 2013-04-02T11:55:59.250 回答