【问题标题】:Difference in Clock Generation时钟生成的差异
【发布时间】:2013-04-02 11:26:05
【问题描述】:

以下代码有什么区别?

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


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

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

【问题讨论】:

    标签: verilog clock


    【解决方案1】:

    从使用角度来说两者的区别:

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

    对于 Wires B = #5 A; 表示 B 从 5 个时间步前分配给 A。 A 领先 B 5 个时间步长。如果B改成A A = #5 A;

    wire B;
    assign B= #5 A;
    

    IEEE 1800-2012 部分涵盖了电线的用法6.7 网络声明

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

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

    @new2android 提供了从1996 : Understanding Verilog Blocking and Non--blocking Assignments 读取的以下信息

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

    备注

    1. 延迟的所有用途仅用于模拟,不可综合。
    2. 问答不涵盖使用延迟的非阻塞变体时的差异(B <= #5 A;#5 B <= A;)。

    【讨论】:

    • 如果 clk 不是时钟而是一些随机信号,你能告诉我模拟器是如何反应的吗?我认为一个比另一个有更多的事件,但我不确定。
    • 抱歉,我只是将模拟器用作工具,并没有涉及到它所面临的具体调度问题。从表面上看,对于 reg 声明,这两种类型似乎在做同样的事情,所以我原以为它们对于模拟器是一样的。
    • 您的答案还有一些补充,#5 A = B ; // 宽度小于 5 的脉冲会被模拟器忽略 A = #5 B ; // 每 5 个时间单位检查一次输入并立即赋值
    • 这是我从链接(幻灯片 16)sutherland-hdl.com/papers/…987654323@
    猜你喜欢
    • 2021-11-26
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多