【问题标题】:assertion for holding the reset for a long time长时间保持复位的断言
【发布时间】:2016-03-30 19:08:34
【问题描述】:

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

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

【问题讨论】:

    标签: system-verilog system-verilog-assertions


    【解决方案1】:

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

    它可能看起来像这样:

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

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

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

    关于断言中的局部变量,可以阅读Local Variables in SVA

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        这是异步检查。最好的方法是用传统方式或纯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
        //
        

        【讨论】:

          猜你喜欢
          • 2015-08-09
          • 2013-01-17
          • 1970-01-01
          • 1970-01-01
          • 2018-07-05
          • 2023-03-16
          • 2017-01-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多