首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在检查特定超时条件后退出OVM / verilog中的“while”循环

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

Stack Overflow用户
提问于 2017-07-28 05:43:02
回答 1查看 3.5K关注 0票数 1

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

代码语言:javascript
运行
复制
while (signal_val == 0) begin
    signal_val  = sla_vpi_get_value_by_name ("blah");
end

我只想限制这个循环120微秒,然后退出。如果120µs结束时(signal_val == 0)仍不满意,我想退出测试。如何实现?

我想我将不得不调用'global_stop_request()‘来退出测试,但是尝试检查while循环中的现有条件以获得固定的超时值(120µs)似乎很棘手。而且,“中断”似乎不起作用。有什么想法吗?

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

代码语言:javascript
运行
复制
while (signal_val == 0) begin
    signal_val  = sla_vpi_get_value_by_name ("blah");
    #120us;
    break;
end
EN

Stack Overflow用户

回答已采纳

发布于 2017-07-29 04:50:36

你的代码不会像你期望的那样工作。让我们看一看:

代码语言:javascript
运行
复制
while (signal_val == 0) begin
    signal_val  = sla_vpi_get_value_by_name ("blah");
    #120us;
    break;
end

signal_val最初只在while语句中计算一次,由于它是0,因此进入while循环

signal_val获取函数调用返回的值。这发生在与上一次while评估相同的模拟周期。假设没有变化,返回值再次为0

现在,函数等待120us

最后,它中断了while循环。signal_val不会再次求值。

要实现所需的功能,您需要使用fork...join和一个监视程序任务

代码语言:javascript
运行
复制
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结束。当发生这种情况时,fork...join_any完成并禁用fork。

我在我的测试平台中经常使用它来实现您所描述的功能,并且它可以无缝地工作。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45361502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档