程序块是否提供了其他方法无法复制的 SV 功能?
这个问题的不太具体的版本是:我应该用程序块来验证吗?我正在从一个受限于 Verilog-95 的环境转移到一个支持 SV 的环境,我想知道我是否通过不使用程序块为自己创造了额外的工作。
程序块是否提供了其他方法无法复制的 SV 功能?
这个问题的不太具体的版本是:我应该用程序块来验证吗?我正在从一个受限于 Verilog-95 的环境转移到一个支持 SV 的环境,我想知道我是否通过不使用程序块为自己创造了额外的工作。
查看IEEE Std 1800-2012 § 3.4 & § 24。有关program块的完整描述。
在一个简短的、不完整的总结中,一个program块:
always过程、primitive实例、module
实例、interface实例(允许virtual interface端口interface)或其他program实例。$exit,它终止program调用它的实例。
program实例都退出时,模拟将终止。module除了如上所述之外,它几乎就像一个块。块的想法program是在测试和设计之间建立清晰的分离。在 SystemVerilog 的早期版本(IEEE 1800 之前)中,a 的实例化class通常仅限于program块。这强调了测试和设计的划分。它还使program模块对于想要在流程中使用面向对象编程的验证工程师至关重要。自 IEEE 1800 以来,aclass几乎可以在任何地方定义和实例化。结果,program区块变得不那么充足了。
今天,对program区块有用性的看法存在分歧。从我参加的最近几次会议来看,趋势似乎倾向于放弃program区块。这是因为这些优点可以通过其他方法来实现。Reactive 区域中的调度可以通过clocking块来完成。A mailbox、 queue( [$]) 或关联数组 ( [*]) 可用于智能处理模拟终止运行多个测试。就个人而言,我仍然喜欢使用program块并在需要时initial forever用作always等效项。如果您打算使用 UVM,那么无program块测试台可能更适合您。
最后,它真的归结为方法偏好。最好自己评估和尝试。
我不建议使用程序块 - 改用模块。几年前 我写了一篇关于这个的详细文章。