一、没有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 automatic int n=k; //这一步是并发的关键 automatic (这里定义跟变量n相关的变量) (这里就写具体的内容) join_none end for (int k=0; k<32; k++) begin fork automatic int n=k; //这一步是并发的关键 automatic (这里定义跟变量n相关的变量) (这里就写具体的内容) join_none end join ...
好像差不多理解了: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: ment4的执行与否不依赖于ment1,ment2和ment3,他们可以同步执行。 在使用过程中经常需要多线程操作,多线程的正确写法为: for(inti=0;i<3;i++)beginforkautomaticidx =ibegin`uvm_do(do[i]);endjoin_noneend 这样就完成了一个简单的多线程,这里为什么要用automatic关键字定义idx,可以参考下...
join_none 这段代码打印的正是我们期望的: No0,My face_grade is 0 No1,My face_grade is 1 No2,My face_grade is 2 No3,My face_grade is 3 …… No9,My face_grade is 9 为什么呢?我们来分析一下: 如上代码,我们加了一个automatic int j=i 转了一下,把i给j,我们打印j。
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而导致的错误输出。
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...
最后一下,经过和别人的讨论,其实不加#0也是可以的,这个时候需要把automatic赋值放在fork-join_none外面: while(1)beginbit[255:0]rdata;p_sequencer.a_port.get(a_trc);...for(int i=0; i
最后一下,经过和别人的讨论,其实不加#0也是可以的,这个时候需要把automatic赋值放在fork-join_none外面: while(1)beginbit[255:0]rdata;p_sequencer.a_port.get(a_trc);...for(int i=0; i
automatic int idx=index; fork begin `uvm_do_on(sequence_inst,p_sequencer.my_sqr[idx]); end join_none; end 上图中例子是正常工作的写法,假如我用fork_join替代fork / join_none会发生什么呢?当然是sequence一个个顺序执行,而没有实现并行。