System verilog 长时间保持重置的断言

System verilog 长时间保持重置的断言,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我看到断言总是与时钟的n个周期有关。有没有办法检查wrt时间刻度的持续时间?意义 我们假设检查重置是否保持100s或更少,我们如何为这个写一个断言语句? 首先,我会考虑SVA是否是检查这一点的最好方法。p> 如果您这样认为,那么在测试台上创建一个具有适当周期的虚拟时钟,并(通过分层命名的功能)使用它怎么样。可能需要一个合适的时期 如果您正在寻找最小脉冲宽度,则为100ns 如果您正在寻找最大脉冲宽度,则速度要快得多(例如,10ns周期将允许您检查脉冲宽度是否小于110ns,即11个周期) 断

我看到断言总是与时钟的n个周期有关。有没有办法检查wrt时间刻度的持续时间?意义


我们假设检查重置是否保持100s或更少,我们如何为这个写一个断言语句?

首先,我会考虑SVA是否是检查这一点的最好方法。p> 如果您这样认为,那么在测试台上创建一个具有适当周期的虚拟时钟,并(通过分层命名的功能)使用它怎么样。可能需要一个合适的时期

  • 如果您正在寻找最小脉冲宽度,则为100ns

  • 如果您正在寻找最大脉冲宽度,则速度要快得多(例如,10ns周期将允许您检查脉冲宽度是否小于110ns,即11个周期)


断言最好同步完成。这并不意味着你不能检查异步的东西,但是你仍然需要同步地采样有问题的信号。因此,通过这种方式,您可以使用虚拟时钟同步采样异步信号。

这是异步检查。最好的方法是用传统方法或纯systemverilog检查它,而不是使用SVA并发断言

如果需要,您仍然可以添加立即断言,用于覆盖目的。 快速示例代码:

//
task assert_reset_hold_100ns();
  fork : fk1
    begin : blk1
      @(reset);
      $fatal;
    end
    begin : blk2
      #100ns;
      ASSERT_RESET_HOLD_100NS: assert(1);
    end
  join_any
  disable fork;
endtask

// checker
initial forever begin
  wait(reset === 0);
  assert_reset_hold_100ns();
  wait(reset === 1);
  end
//

是的,从概念上讲,您可以使用SVA中的局部变量编写这样的断言

可能是这样的:

property reset_chk;
  time current_time;
  @(rst) (~rst, current_time = $time) |=> ($time - current_time == 100);
endproperty
但是应该避免这种类型的断言,因为它们不是写在时钟上的。

或者,人们总是可以制作一个参考时钟,其速度足以适应任何此类信号定时

对于断言中的局部变量,可以读取