为什么repeat中的执行不是顺序执行的呢?
这是在systemverilog for verification这本书上看到的。其中Transaction为定义的class。书上说,在执行repeat的过程中,如果transmit这个task会执行几个周期,那么这个过程中,addr的值实际上是会变的。如下图所示。
但是repeat中不是顺序执行的吗?为什么会出现这种冲突现象呢?
"The bug becomes visible when transmit spawns off a thread", 也就是说 task transmit里会用 fork--join_none并发一个线程来执行发送动作,因此generator_bad中的repeat(n)会在同一时刻执行完毕,而所产生的n个transmit线程在随后时刻其实在发送同一个Transaction对象。如果你能保证transmit在完成整个发送动作,同时其它对象,特别是checker,monitor等也完成了对t的处理后才会退出的话,那么generator_bad的写法也可以接受。但明显这一点是很难保证的。
您好,不是特别明白你的解释。你的意思是说因为transmit里面定义的语句都是fork_join的,所以会同时产生n个线程吗?但是repeat里面的三个语句是顺序的。也就是说,第三局transmit是在前两句执行完了之后才能执行的。同时,也只有transmit执行完了之后才会回到repeat头部执行random函数的吧。那这样的话,transmit中是并行还是顺序执行应该没有影响吧。
这么理解吧,如果transmit有时间消耗如几个系统时钟,这段代码的确会显示n个addr,但是实际上传送给DUT的地址值可能只有一个(前边的地址被后边的地址覆盖了),因此最好在repeat创建transaction对象
不是很看懂您的解释。我是这样理解的。每次repeat的时候,t的addr都会被randomize一下,那么transmit就会传递不同的值呀。
值是传递出去了,但是DUT收到的呢?
具体写代码看看结果不就知道了,这种错误我也放过,后来想想是需要传递不同的transaction而不是同一个transaction的不同内容