program 就是为了解决module和tb的race violation问题. 因为program作用在reactive 区域,这时赋值的更新已经稳定.
因此,我们一般推荐在Testbench中使用program,在设计dut中使用module,在顶层module中例化dut的module和 testbench的program。
program中的注意点:
- program中不能例化其他program和module
- 不能出现interface和always,可以使用initial forever替代always
- program内部可以发起多个initial块
- program中内部定义的变量最好采用阻塞赋值=,当然采用非阻塞仿真器也不会产生error,驱动外部信号则应该采用非阻塞赋值<=
- program中的initial块和module中的initial块执行位置不同,前者在reactive,后者在active块中执行。
- program中存在的多个initial块中,如果有一个initial采用了退出系统函数$exit(),则会结束该program,而不仅仅是该initial块。
具体例子可以看https://zhuanlan.zhihu.com/p/98773154 如果只想了解四个区域的作用特性没必要看这个.遵守推荐tb建法就是。