有没有一种方法可以在用户调用 $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 通过其阶段和反对机制所完成的。