SV中线程分析(fork..join,fork...join_any,fork...join_none)

   发现了一点新的东西,加深了我对这几个线程的理解,写点东西记录一下。

1,并行的实际执行顺序

    大家都知道fork...join里面是并行执行的,但计算机执行语句肯定是有先后顺序的,具体那些并行的语句是怎么执行的呢?

    这要看具体使用的SV 仿真器是怎么操作的。虽然fork...join里面是并行的,但VCS会先执行并行的写在前面的语句。

SV中线程分析(fork..join,fork...join_any,fork...join_none)_第1张图片

    这个program中fork...join里的两个begin...end是并行的,VCS会先执行a = b + d;然后再执行b = a + e;运行的结果如下:

    将两个begin...end调换顺序后,发现就会先执行b = a + e;

SV中线程分析(fork..join,fork...join_any,fork...join_none)_第2张图片

结果如下

2,fork...join_none

    fork...join_none块后面接的不消耗仿真时间的语句会先于fork...join_none块执行。然后注意下面这句话(这不是fork...join_none特有的,是SV这门语言仿真的执行过程):

    所以对于如下的一段fork...join_none

SV中线程分析(fork..join,fork...join_any,fork...join_none)_第3张图片

    执行的结果如下:

SV中线程分析(fork..join,fork...join_any,fork...join_none)_第4张图片

    可以看到这几句话的执行先后顺序,注意有句话没有执行,因为这个initial 块已经到达了底部,所以simulation will terminate at that simulation time regardless of whether or not child threads still have future events to be executed。

3,fork...join_any

SV中线程分析(fork..join,fork...join_any,fork...join_none)_第5张图片

执行结果如下:

SV中线程分析(fork..join,fork...join_any,fork...join_none)_第6张图片

    可以看下这几句语句的执行顺序,然后发现还是有句话没有执行,因为initial 块到达了底部,仿真终止了。

你可能感兴趣的:(SystemVerilog,SV,线程,VCS对SV线程的处理)