一、没有automatic的fork-join_none 通常小白会这么写: 代码如下: foreach(a[i])begin fork repeat(a[i]) #1ns; $display("a[%0d] = %0d, @%0t",i,a[i],$time); join_none end 结果如图: 由图可知,有两个问题: 打印时间全部为0时刻:因为使用的fork-join_none语句,所以延迟语句不会阻塞$dis...
fork for (int k=0; k<32; k++) begin fork automatic int n=k; //这一步是并发的关键 automatic (这里定义跟变量n相关的变量) (这里就写具体的内容) join_none end for (int k=0; k<32; k++) begin fork automatic int n=k; //这一步是并发的关键 automatic (这里定义跟变量n相关的变量) ...
好像差不多理解了:for循环的时候依次创建了10个进程,然后等for循环结束后,才并行执行10个fork进程。因为fork-join_none,for全部循环完了以后, 10个$display(“No%0d,My face_grade is %0d”, i,i );才并行的执行完!!在打印的时候得到的i值就是最后的10了。换句话理解:这10个并行的$display里面...
fork-join_none相信大家应该熟悉了,新来的朋友可以回顾下jerry之前的文章,就是之前jerry提到的那个“暴脾气”的哥们,他不会去等别人,直接会着急做自己的事情。 前文回顾(点击查看):fork-join挺好用的了,fork-join_any、fork-join_none有什么用? 回顾下那篇文章中我们举的一个例子,这个暴脾气可以这么用: fork ...
fork..join_none: ment4的执行与否不依赖于ment1,ment2和ment3,他们可以同步执行。 在使用过程中经常需要多线程操作,多线程的正确写法为: for(inti=0;i<3;i++)beginforkautomaticidx =ibegin`uvm_do(do[i]);endjoin_noneend 这样就完成了一个简单的多线程,这里为什么要用automatic关键字定义idx,可以参考下...
我仔细理解了下他的意思,觉得确实使用#0来立刻进行进行阻塞,进而达到立即执行fork-join_none内语句的方式是比较合理的(当然了,其他阻塞行为一样会让fork-join_none内的语句执行,但不能达到立刻执行的效果)。经过这个勘误和指点后,我突然觉得又通彻了一些。
for(int i = 0; i < 10; i++) { automatic int j = i; fork $display("No %0d, My face grade is %0d", j, j); } join_none 这里使用的automatic类型确保了每个fork进程中的j都有独立的作用域,避免了由于i在for循环结束后为10而导致的错误输出。
我仔细理解了下他的意思,觉得确实使用#0来立刻进行进行阻塞,进而达到立即执行fork-join_none内语句的方式是比较合理的(当然了,其他阻塞行为一样会让fork-join_none内的语句执行,但不能达到立刻执行的效果)。经过这个勘误和指点后,我突然觉得又通彻了一些。
此外,Verilog中的函数必须有返回值,并且返回值必须调用,例如用到赋值语句中。SV 中允许函数调用任务,但只能在由 fork...join_none 语句生成的线程中调用。 如果你有一个不消耗时间的SV任务,你应该把它定义成 void 函数,这种函数没有返回值。它可以被其它任务或函数调用。
automatic int index;index=i;fork beginsend(index);end join_none end wait fork;endtask tasksend(int j);$display("driving port %0d",j);endtask endmodule 代码语言:javascript 复制 all:clean comp run sim.logclean:\rm-rf simv*csrc*.keycomp:vcs-full64 test.sv-sverilogrun:simv-l sim.log...