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建法就是。