【问题标题】:In systemverilog # delay fails when RHS signal changes faster than delay在 systemverilog 中,当 RHS 信号变化快于延迟时,延迟失败
【发布时间】:2016-07-27 21:40:23
【问题描述】:

systemverilog 中的以下代码失败:

module test_dly;
  reg clk = 0;
  wire w_clk_d;

  always #1ns  clk <= ~clk;
  assign #1400ps w_clk_d = clk;
endmodule

我预计 w_clk_d 将是 clk 的延迟版本,但事实并非如此。 如果新事件在延迟到期之前到达,似乎 # 不起作用。 我编写了代码来处理这个问题,但是有没有办法让 # 按预期工作? 谢谢,

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    assign #1400ps w_clk_d = clk; 充当延迟和过滤器。当clk 更改等待 1400ps 然后将当前值(不是原始值)应用于w_clk_d。如果输入变化的速度快于延迟,则会丢失恐吓值。物理电路中的延迟单元也可以观察到类似的行为。

    可以通过链接较小的延迟来减少过滤;物理延迟单元使用相同的策略。

    wire   #700ps clk_d = clk;
    assign #700ps w_clk_d = clk_d;
    

    只有没有过滤的延迟可以通过传输延迟来实现,它在切换时对clk的值进行采样,然后将采样值应用于w_clk_d后1400ps

    logic w_clk_d;
    always @* w_clk_d <= #1400ps clk;
    

    要将分配保持在调度程序活动区域中,则需要额外的代码

    logic w_clk_d;
    always @(clk) fork
      begin
        automatic logic sample_clk; // visible only locally with in the fork thread
        sample_clk = clk; // local copy of clk
        #1400ps;
        w_clk_d = sample_clk;
      end
    join_none // non-blocking, allows detection of next @(clk)
    

    【讨论】:

    • 非常感谢,我不知道过滤。我实现的延迟类似于您的示例代码,但您的示例代码更友好,我会使用它。
    【解决方案2】:

    这里的问题是连续的assign 语句一次只能安排一个活动分配。如果分配的 RHS 变化快于所谓的连续分配的惯性延迟,则 LHS 上的先前分配将被取消或过滤。

    您想要的是所谓的传输延迟:RHS 上的每个更改都会传播到 LHS。您可以使用非阻塞赋值 (NBA) 运算符来执行此操作。

    module test_dly;
      reg clk = 0;
      wire w_clk_d;
    
      always #1ns  clk = ~clk;
      always @clk  w_clk_d <= #1400ps clk;
    endmodule
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多