程序块是否提供了其他方法无法复制的 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
块测试台可能更适合您。
最后,它真的归结为方法偏好。最好自己评估和尝试。
我不建议使用程序块 - 改用模块。几年前 我写了一篇关于这个的详细文章。