提问人:Du mmyTransistor 提问时间:11/9/2023 最后编辑:Du mmyTransistor 更新时间:11/13/2023 访问量:92
SystemVerilog 延迟中断
SystemVerilog Delay Interruption
问:
我有一个问题,希望有人能帮助我。
在systemVerilog中,我有一个输入“en”和一个输出信号“en_delayed”。信号不一定是端口,它们可以是内部变量。
我想在上升和下降时对信号应用不同的延迟,如下所示:
timeunit 1ns;
timeprecision 1ps;
parameter real delay_en_rising_us = 100.0; // means 100us
parameter real delay_en_falling_us = 300.0; // means 300us
assign #(delay_en_rising_us*1.0e3, delay_en_falling_us*1.0e3) en_delayed = en;
如图 1 所示,这工作正常。
但是现在,如果我像这样更改延迟的值
parameter real delay_en_rising_us = 4000.0; // means 4ms
parameter real delay_en_falling_us = 300.0; // means 300us
然后,当信号上升时,下降沿被 4ms 延迟“屏蔽”。见图2。
我希望“en_delayed”在“en”下降时做出反应,即在“en”下降后强制信号“en_delayed”下降 300us。 同样的行为也适用于上升沿。
我怎样才能避免这种情况?
内容已在邮件中。
----更新 1 ----
非常感谢dave_59。这有助于在一开始就解决问题。
但是,我看到了关于我想要实现的内容的其他问题。为了便于模拟,我在这里包含了修改后的代码。
如您所见,在“en_delayed”处,我们看到 300us(红色间隔)的下降延迟,这是可以的。
然后信号“en”上升,我们看到“en_delayed”处有 4000us(紫色间隔)的上升延迟,这是不行的,因为就在 4000us 上升延迟完成之前,有一个“en”信号下降,这应该立即取消之前的上升延迟 4000us,即信号“en_delayed”不应该变高。
然后我们看到信号“en_delayed”在“en”下降(黄色间隔)下降 300us 之后下降,这是不行的,因为信号“en_delayed”应该保持低电平。除此之外,“en”的下一个上升沿应立即取消“en_delayed”处未完成的 300us 下降延迟(如果存在未完成的有效延迟)。
然后我们看到信号“en_delayed”变高,上升延迟为 4000us(蓝色间隔),这是可以的。
总之,信号en_delayed不应在7000us(白色圆圈区域)附近上下波动。
我希望我能正确解释。实际上,这个想法是,如果有一个尚未完成的延迟,并且信号“en”突然改变,那么该未完成的延迟应该立即被丢弃。
谢谢!
module top;
timeunit 1ns;
timeprecision 1ps;
parameter real delay_en_rising_us = 4000.0; // means 4ms
parameter real delay_en_falling_us = 300.0; // means 300us
logic en;
logic en_delayed;
always_comb
if ($realtime == 0)
en_delayed = en;
else if (en)
en_delayed <= #(delay_en_rising_us*1us) en;
else
en_delayed <= #(delay_en_falling_us*1us) en;
//initial begin
initial fork
$dumpfile("dump.vcd"); $dumpvars;
en = 1;
#1000us en = 0; // or add a bigger delay past 4ms
#3000us en = 1;
#6900us en = 0;
#7100us en = 1;
#15000us $finish;
//end
join
endmodule
答:
您的问题是您忘记了时间 0 的第一个上升沿。 直到 1 毫秒才会上升到 4 毫秒。您在时间 0 更改为 1,然后在 0us 时更改为 1000,然后才有机会设置为 1。en
en_delayed
en
en_delayed
为了获得你想要的行为,你可以改变你的刺激的时间,或者写一些行为代码来接受它。请注意,连续分配不能以比 RHS 上指定的延迟更快的速度更改 LHS。这被称为惯性延迟模型。可以使用非阻塞分配来实现传输延迟模型。
module top;
timeunit 1ns;
timeprecision 1ps;
parameter real delay_en_rising_us = 4000.0; // means 4ms
parameter real delay_en_falling_us = 300.0; // means 300us
logic en;
logic en_delayed;
always_comb
if ($realtime == 0)
en_delayed = en;
else if (en)
en_delayed <= #(delay_en_rising_us*1us) en;
else
en_delayed <= #(delay_en_falling_us*1us) en;
initial begin
$dumpfile("dump.vcd"); $dumpvars;
en = 1;
#1000us en = 0; // or add a bigger delay past 4ms
#2000us en = 1;
#5000us en = 0;
end
endmodule
评论