SystemVerilog 延迟中断

SystemVerilog Delay Interruption

提问人:Du mmyTransistor 提问时间:11/9/2023 最后编辑:Du mmyTransistor 更新时间:11/13/2023 访问量:92

问:

enter image description here

我有一个问题,希望有人能帮助我。

在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”突然改变,那么该未完成的延迟应该立即被丢弃。

谢谢!

enter image description here

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
Verilog 变量赋 值延迟 system-verilog 中断

评论

1赞 Serge 11/9/2023
有没有带测试台的复制器?我怀疑“en”从 0 到 1 的变化比上一个操作的延迟(这是未定义的行为)更快。请注意,从“x”到“0”的更改也由第二个延迟参数控制。

答:

0赞 dave_59 11/10/2023 #1

您的问题是您忘记了时间 0 的第一个上升沿。 直到 1 毫秒才会上升到 4 毫秒。您在时间 0 更改为 1,然后在 0us 时更改为 1000,然后才有机会设置为 1。enen_delayedenen_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

评论

0赞 Du mmyTransistor 11/12/2023
非常感谢dave_59。在实施您的建议后,我添加了包含其他信息的更新。请看一下,如果可能的话,请给我反馈。谢谢!