RTL基本知识:关于disable fork的误解

分析说明:

initial"块"在仿真开始时执行,开启进程procedure_0,创建一个对应的可执行的线程.该进程中开启了5个进程(ini_process_0、ini_process_1、ini_process_2、ini_process_3和ini_process_4),其中并没有哪个进程创建对应的可执行的线程,这5个进程顺序执行.在进程ini_process_1中开启了3个进程(bg_process_0、bg_process_1和bg_process_2),这三个进程也是顺序执行,当执行bg_process_2时,因为其所属的线程只有procedure_0(ini_process_1并没有创建对应的线程),所以在执行该进程时,将会终止ini_process_0和bg_process_1.所以,在使用disable fork时,如果没有注意线程和进程之间的关系,那么极易导致额外的进程被终止.

总结

综上示例所述,课件<<SystemVerilog forVerification>>中将线程和进程互换使用对于理解disable fork不合适,并且IEEE中并没有完全采取混用,否则也没有必要强调哪些进程可以产生线程了.书中示例7.17将initialbegin...end中所有的函数调用标注为线程(Tasks and function areprocedure that are enabled from one or more places in other procedures.(IEEEStandard for SystemVerilog-Unified Hardware Design,Specification,andVerification Language))是不合理的,这样对于理解disable fork的作用范围的理解可能会产生误导,书中示例进程中之所以存在线程是因为其中具体实现存在产生线程的结构.disable fork只能终止那些调用线程产生的进程.因此,在使用disable fork终止fork进程时需要注意一下几点:

  • 哪些语句属于进程?哪些语句属于线程?

  • begin...end和fork...join的执行顺序是什么?

  • 哪些进程处于激活状态?

  • 不同的仿真工具仿真出来的结果可能存在差异(目前Cadence和Synopsys仿真结果基本一致,Mentor仿真结果与这两家EDA工具的仿真结果不一致);

参考文献

Chris Spear.SystemVerilog for Verificatio.2008.Springer

IEEE.IEEE Standard for SystemVerilog-Unified HardwareDesign,Specification,and Verification Language.2013.IEEE

猜你喜欢

转载自www.cnblogs.com/xgcl-wei/p/8992985.html