我有一个'while‘循环作为OVM测试的一部分,如下所示:
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’给出一个语法错误:
while (signal_val == 0) begin
signal_val = sla_vpi_get_value_by_name ("blah");
#120us;
break;
end发布于 2017-07-29 04:50:36
你的代码不会像你期望的那样工作。让我们看一看:
while (signal_val == 0) begin
signal_val = sla_vpi_get_value_by_name ("blah");
#120us;
break;
endsignal_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在上面的代码中,watchdog或wait_signal_val结束。当发生这种情况时,fork...join_any完成并禁用fork。
我在我的测试平台中经常使用它来实现您所描述的功能,并且它可以无缝地工作。
https://stackoverflow.com/questions/45361502
复制相似问题