如何在 SystemVerilog 中检查信号在使用 ModelSim 进行仿真期间变高

How to check in SystemVerilog that signal went high during simulation using ModelSim

我需要检查,在测试平台期间,特定信号是否至少在一个时钟周期内变为逻辑 1。

我测试了以下断言,它们应该是等价的:

    initial assert property (
        @(posedge clk_tree_x.ClkRsBST_ix.clk)
            s_eventually TS.TSUpdated) else
      $error("Was not active");

   initial begin
      assert property (@(posedge clk_tree_x.ClkRsBST_ix.clk)
               strong(##[*] TS.TSUpdated)) else
    $error("Was not active");
   end

在使用 Mentor ModelSim SE64 2021.1 进行仿真时,结果非常奇怪。

第一次模拟通过 时,模拟完全忽略了这个断言。在 第二次模拟传递 上,ModelSim 显然使用先前模拟的结果来宣布 在断言触发的新 运行 模拟发生 之前:

#    Time: 2005087500 ps Started: 5 ns  Scope: tb_bst_provider.DUT.fook File: bst_provider.sv Line: 669
# ** Warning: (vsim-8777) Breakpointing based on severity while evaluating concurrent assertion is not supported.
#    Time: 2005087500 ps  Iteration: 0  Region: /tb_bst_provider/DUT File: bst_provider.sv

不确定这是否对所有强属性都是一致的行为,但它对任何类型的单元测试几乎没有用,因为测试永远不会 运行 两次使用相同的参数。

有什么方法可以断言 'signal is not present through the simulation run' 确实可以与 modelsim 一起使用吗?

我不确定你是否可以用断言来做到这一点。您可以使用断言覆盖检测非活动信号。在任何情况下,您都不应该在初始块中放置断言。

可以在不使用断言的情况下完成对 activity 的潜在检查,如下例所示。

  always @(posedge clk) begin
    if (sig == 1)
      active <= 1;
  end

  final begin
    if (!active)
       $error("was not active");
    else
      $info ("it was active");
  end

只需确保您可以正常退出模拟,否则 final 可能在中断的情况下根本不会执行。