程序 block 提供的 SV 是否有任何其他方法无法复制的功能?
这个问题的不太具体的版本是:我应该为验证程序 block 而烦恼吗?我正在从一个我们被限制为 Verilog-95 的环境转移到一个支持 SV 的环境,我想知道我是否通过不使用程序 block 为自己创造了额外的工作。
最佳答案
查看 IEEE Std 1800-2012 § 3.4 & § 24。有关程序
block 的完整描述。
在一个简短的、不完整的总结中,一个程序
block :
- 不能包含
always
过程、primitive
实例、模块
instances,interface
instances (virtual interface
and portinterface
is allowed), 或者其他program
实例。 - 指定 react 区域中的调度。这可以防止竞争条件。
- 有一个额外的系统任务
$exit
,它会终止调用它的程序
实例。- 当所有
程序
实例退出时,模拟将终止。
- 当所有
- 除上述情况外,大部分类似于
module
block 。
program
block 的想法是在测试和设计之间创建清晰的分离。在早期版本的 SystemVerilog(pre IEEE 1800)中,class
的实例化通常仅限于 program
block 。这强调了测试和设计的划分。它还使 program
block 对于希望在其流程中使用面向对象编程的验证工程师来说至关重要。自 IEEE 1800 以来,class
几乎可以在任何地方定义和实例化。结果,program
block 变得不够用了。
今天对程序
block 的有用性的看法存在分歧。从我参加的最近几次 session 来看,趋势似乎是支持放弃 program
block 。这是因为可以通过其他方法实现这些优点。 Reactive 区域中的调度可以使用 clocking
block 来完成。 邮箱
、队列([$]
)或关联数组([*]
)可用于智能处理模拟终止运行多个测试.就个人而言,我仍然喜欢使用 program
block ,并在需要时使用 initial forever
作为 always
等价物。如果您打算使用 UVM,那么非程序
block 测试平台可能更适合您。
最后,它真的归结为方法论偏好。最好自己评估和尝试。
关于unit-testing - SystemVerilog 程序 block 与传统测试平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406092/