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



我有一个"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

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

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

相关内容

  • 没有找到相关文章

最新更新