在Systemverilog#延迟时,信号的速度比延迟
问题描述:
下面的代码的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的版本,但事实并非如此。 似乎#如果新事件在延迟过期之前到达,则#不工作。 我写了代码来处理这个问题,但有没有办法让#工作正常? 谢谢,
答
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)
答
这里的问题在于连续的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
非常感谢,我不知道过滤。我实现类似于你的示例代码的延迟,但是你的示例代码更友好,我将使用它。 –