检查特定超时条件后如何退出 OVM/verilog 中的 'while' 循环

How to exit a 'while' loop in OVM / verilog after checking for a specific timeout condition

我有一个 'while' 循环作为 OVM 测试的一部分,如下所示:

while (signal_val == 0) begin
    signal_val  = sla_vpi_get_value_by_name ("blah");
end

我想将此循环限制为仅 120 微秒,然后退出。如果 (signal_val == 0) 在 120µs 结束时仍不满足,我想退出测试。我如何实现这一目标?

我想我必须调用 'global_stop_request()' 才能退出测试,但尝试检查 while 循环中的现有条件以获得固定超时值 (120µs) 似乎很棘手。此外,'break' 似乎不起作用。有什么想法吗?

尝试以这种方式使用 'break',但 'break' 给出语法错误:

while (signal_val == 0) begin
    signal_val  = sla_vpi_get_value_by_name ("blah");
    #120us;
    break;
end

您的代码无法按预期运行。让我们来看看:

while (signal_val == 0) begin
    signal_val  = sla_vpi_get_value_by_name ("blah");
    #120us;
    break;
end

signal_val 最初只在 while 语句中计算一次,因为它是 0,所以你进入 while 循环

signal_val 获取由您的函数调用编辑的值 return。这发生在与先前对 while 求值相同的模拟周期。假设没有变化,您将再次获得 0 作为 return 值

现在,函数等待 120us

终于跳出了while循环。 signal_val 不再计算。

要实现您想要的功能,您需要使用 fork...join 和看门狗任务

fork
  begin: wait_signal_val
    while (signal_val == 0) begin
      signal_val  = sla_vpi_get_value_by_name ("blah");
      if (signal_val == 1) begin
        `uvm_info(get_name(), "YES!! signal_val was seen as 1", UVM_LOW);
      end
      else begin 
        #20ns; // (or some clocking mechanism)
      end
    end
  end

  begin: watchdog
    #120us;
    `uvm_fatal(get_name(), "NOPE!! signal_val is still 0 after 120us. Killing test");
  end
join_any
disable fork

在上面的代码中,watchdogwait_signal_val 完成。发生这种情况时,分叉...join_any 完成并禁用分叉。

我在我的测试台中经常使用它来实现您描述的功能并且它可以无缝运行。