检查特定超时条件后如何退出 OVM/verilog 中的 'while' 循环
How to exit a 'while' loop in OVM / verilog after checking for a specific timeout condition
我有一个 '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',但 '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
获取由您的函数调用编辑的值 return。这发生在与先前对 while 求值相同的模拟周期。假设没有变化,您将再次获得 0 作为 return 值
现在,函数等待 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 完成并禁用分叉。
我在我的测试台中经常使用它来实现您描述的功能并且它可以无缝运行。
我有一个 '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',但 '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
获取由您的函数调用编辑的值 return。这发生在与先前对 while 求值相同的模拟周期。假设没有变化,您将再次获得 0 作为 return 值
现在,函数等待 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 完成并禁用分叉。
我在我的测试台中经常使用它来实现您描述的功能并且它可以无缝运行。