有没有一种方法可以在用户调用 $finish 后执行一段代码?
Is there a method to execute a block of code after a user calls $finish?
我们希望能够提供在每个 SystemVerilog 测试结束时要完成的事情的预定义列表。由于有多人在这个项目上工作,如果他们不必考虑我们在后台做的事情,而只需像往常一样在测试结束时调用 $finish
就好了。我知道我们可以创建自己的自定义 $finish
宏,但我们宁愿不必更改先前存在的测试。
在 SystemVerilog 中有没有什么方法可以在 $finish
调用后有一段代码 运行?使用像 UVM 这样的东西不是一种选择。我环顾四周,但我似乎无法找到执行此行为的东西。
final
关键字可以帮到您。请参阅 IEEE 标准 1800-2017,第 9.2.3 节 最终程序:
A final procedure executes when simulation ends due to an explicit or
implicit call to $finish .
一个限制是它在零时间内执行,这意味着您不能有任何延迟等。阅读完整说明以了解所有详细信息。
示例:
final begin
$display("something");
do_something();
end
如果事物列表不消耗时间,final
块是initial
块的对立面,除了它不能消耗任何时间.不然就不是“最终”的东西了。
如果您需要耗时的步骤,不修改现有测试是无法做到的。最简单的方法是在包 p
中声明一个全局事件,例如 test_done
,然后将 $finish;
替换为 ->p::test_done;
。但有时您需要关闭其他 free-运行 进程。这样做需要更多的协调,而这正是 UVM 通过其阶段和反对机制所完成的。
我们希望能够提供在每个 SystemVerilog 测试结束时要完成的事情的预定义列表。由于有多人在这个项目上工作,如果他们不必考虑我们在后台做的事情,而只需像往常一样在测试结束时调用 $finish
就好了。我知道我们可以创建自己的自定义 $finish
宏,但我们宁愿不必更改先前存在的测试。
在 SystemVerilog 中有没有什么方法可以在 $finish
调用后有一段代码 运行?使用像 UVM 这样的东西不是一种选择。我环顾四周,但我似乎无法找到执行此行为的东西。
final
关键字可以帮到您。请参阅 IEEE 标准 1800-2017,第 9.2.3 节 最终程序:
A final procedure executes when simulation ends due to an explicit or implicit call to $finish .
一个限制是它在零时间内执行,这意味着您不能有任何延迟等。阅读完整说明以了解所有详细信息。
示例:
final begin
$display("something");
do_something();
end
如果事物列表不消耗时间,final
块是initial
块的对立面,除了它不能消耗任何时间.不然就不是“最终”的东西了。
如果您需要耗时的步骤,不修改现有测试是无法做到的。最简单的方法是在包 p
中声明一个全局事件,例如 test_done
,然后将 $finish;
替换为 ->p::test_done;
。但有时您需要关闭其他 free-运行 进程。这样做需要更多的协调,而这正是 UVM 通过其阶段和反对机制所完成的。