1

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

假设我想检查复位是否保持 100ns 或更短,我们如何为此编写断言语句?

4

3 回答 3

1

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

它可能看起来像这样:

property reset_chk;
  time current_time;
  @(rst) (~rst, current_time = $time) |=> ($time - current_time == 100);
endproperty

但是应该避免这种类型的断言,因为它们不是写在时钟上的。

或者,人们总是可以制作一个足够快的参考时钟,以适应任何此类信号时序。

对于断言中的局部变量,您可以阅读SVA 中的局部变量

于 2016-04-02T11:44:17.567 回答
0

首先,我会考虑 SVA 是否是检查这一点的最佳方式。

如果您这么认为,那么如何在测试台中创建一个具有合适周期的虚拟时钟并(通过分层命名的力量)使用它。一个合适的时期可能是

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

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

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

于 2016-03-30T20:00:30.670 回答
0

这是异步检查。最好的方法是用传统方式或纯 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
//
于 2016-03-31T06:12:50.907 回答