2016-07-27 52 views
4

下面的代码的SystemVerilog失败失败:在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的版本,但事实并非如此。 似乎#如果新事件在延迟过期之前到达,则#不工作。 我写了代码来处理这个问题,但有没有办法让#工作正常? 谢谢,

回答

4

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) 
+0

非常感谢,我不知道过滤。我实现类似于你的示例代码的延迟,但是你的示例代码更友好,我将使用它。 –

0

这里的问题在于连续的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