我有一个"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"给出了语法错误:
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
获取函数调用返回的值。这发生在与之前评估 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
完成。当这种情况发生时,叉子...join_any完成并禁用分叉。
我在我的测试平台中经常使用它来实现您描述的功能,并且它可以无缝运行。