systemverilog终止多线程
(2011-12-21 20:25:48)
标签:
fork..joindisableforksystemverilogthreadinterprocessit |
分类: systemverilog |
因为在调试代码的时候发现,一个含有多线程的task任务无论如何也不返回。而原代码系统的庞大难以debug,不得不写了下面一段代码debug。
`timescale 1ns/1ns
class thread;
endclass
program test;
endprogram
通过debug发现,有些线程没有终止导致task不能返回,有些task已经返回了但是仍有些不期望的线程仍在执行 。
task中的fork...join语句开启了三个线程。线程1,2,3属于线程0的衍生线程。disable fork能够终止当前线程及从当前线程中衍生出来的所有子线程。当task被调用后,线程1,2,3同时执行,当TDI==10时,disable fork得以执行,终止线程2,但是线程1和3仍然在执行。由于线程0是fork…join_any语句,线程2结束后,线程0也结束,task返回。但是,当task下次被调用的时候,上一个task开启的线程1和3仍然在执行。
如果将线程0改用fork…join语句,我们就会发现,task根本不会返回。因为线程1和3没有终止。
另一种终止线程的方法是采用fork…join_any disable label;当fork…join_any的某个衍生线程执行完毕后,会接着执行fork…join_any下面的语句disable label从而可将fork…join_any的所有衍生线程也给终止。