我已经设法在 VHDL 中实现了模拟超时。如果进程在 MaxRuntime 上运行的时间更长,它们将被“杀死”。
不幸的是,这反过来不起作用。如果我的模拟在 MaxRuntime 之前完成,那么一切都在等待 MaxRuntime 上的最后一个等待语句。
我发现可以结合 wait on
, wait for
和 wait until
语句合二为一。
我当前的代码片段。一个完整的例子太长了......
package sim is
shared variable IsFinalized : BOOLEAN := FALSE;
procedure initialize(MaxRuntime : TIME := TIME'high);
procedure finalize;
end package;
package body sim is
procedure initialize(MaxRuntime : TIME := TIME'high) is
begin
-- do init stuff
if (MaxRuntime = TIME'high) then
wait on IsFinalized for MaxRuntime;
finalize;
end if;
end procedure;
procedure finalize;
begin
if (not IsFinalized) then
IsFinalized := TRUE;
-- do finalize stuff:
-- -> stop all clocks
-- write a report
end if;
end procedure;
end package body;
entity test is
end entity;
architecture tb of test is
begin
initialize(200 us);
process
begin
-- simulate work
wait for 160 us;
finalize;
end process;
end architecture;
如果
IsFinalized
,等待语句不会退出改变了。我的模拟运行了大约 160 美元。如果我设置 MaxRuntime
到 50 us,模拟在大约 50 us 停止(加上一些额外的周期,直到每个进程注意到停止条件)。当我设置 MaxRuntime
到 200 us,模拟在 200 us 而不是 162 us 后退出。我不想为模拟器使用命令行开关来设置最大执行时间。
最佳答案
所以听起来你想终止模拟,要么在超时,要么在超时之前完成测试。当事件队列为空时模拟器将停止是正确的,但正如您所体验的那样,这是相当高的。
VHDL-2008 引入了 stop
和 finish
在 std.env
用于停止或终止仿真的包。
在 VHDL-2002 中,一种常见的方法是通过 assert
停止仿真。与 severity FAILURE
:
report "OK ### Sim end: OK :-) ### (not actual failure)" severity FAILURE;
这种模拟停止方法基于这样一个事实,即模拟器(例如 ModelSim)通常会在出现
assert
时停止模拟。与 severity FAILURE
发生。
关于vhdl - 如何通过超时停止模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35302180/