2017-07-27 14 views
1

我有一个“而”循环为OVM测试,看起来像这样的部分:如何检查特定超时条件后退出在OVM/Verilog的一个“而”循环

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)的现有条件似乎很棘手。此外,'休息'似乎并没有工作。有任何想法吗?

使用“休息”这样一来,但“破”试图给出一个语法错误:如您所期望

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

'break'不能正常工作?你是如何应用它的? – Serge

+0

但我在这里意识到了两件事:1.'break'给出了语法错误。 2.正在添加120微秒的延迟,但条件未被检查120微秒。 – chmod

+0

你收到了什么样的错误信息? – Serge

回答

2

您的代码将无法正常工作。让我们一起来看看:

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和一个看门狗任务

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。

我在我的测试平台中使用了很多功能,就像你描述的那样,它可以无缝工作。

+0

Got it!在你回答之前,我刚刚在这个问题上搜索了类似的东西。你认为这是相似的吗?哪种方法更好? '* fork looping_code; //进程1 #120us; //处理2 join_any global_stop_request(); *' – chmod

+0

嘿,如果它能完成这项工作,那很好!你的解决方案看起来更优雅如果你喜欢这个答案,请接受:) – noobuntu