SystemVerilog for循环中的fork join_none「建议收藏」

SystemVerilog for循环中的fork join_none「建议收藏」moduletest;initialbeginmain();endtaskmain();//forkjoin_anyblock1fork#5$display(“THREAD1%0t”,$time);#25$display(“THREAD2%0t”,$ti…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

module test;

   initial begin
      main();
   end

   task main();
      // fork join_any block1
      fork
         #5 $display("THREAD 1 %0t", $time);
         #25 $display("THREAD 2 %0t", $time);
      join_any
      dev_state();
      $display("After task call %0t", $time);
      #100 $finish;
   endtask

   task dev_state();
      // fork join_any block2
      fork
         #5 $display("THREAD 3 %0t", $time);
         #10 $display("THREAD 4 %0t", $time);
      join_any
      disable fork;
   endtask

   initial begin
      $display("debug point fork_1");
      fork_1();
      $display("debug point fork_2");
      fork_2();
      $display("debug point fork_3");
      fork_3();
      $display("debug point fork_4");
      fork_4();      
   end
   
   task fork_1();
      for(int i = 0; i < 16; i++) begin
         fork 
            // begin
            automatic int index =i;       
            send(index);
            // end 
         join_none 
      end
      wait fork;
   endtask

   task fork_2();
      for(int i = 0; i < 16; i++) begin
         fork 
            // begin
            automatic int index;
            index = i;          
            send(index);
            // end 
         join_none         
      end
      wait fork;
   endtask

   task fork_3();
      for(int i = 0; i < 16; i++) begin
         fork 
            begin
               automatic int index;
               index = i;         
               send(index);
            end 
         join_none 
      end
      wait fork;      
   endtask

   task fork_4();
      for(int i = 0; i < 16; i++) begin
         automatic int index;
         index = i;         
         fork 
            begin
               send(index);
            end 
         join_none 
      end
      wait fork;      
   endtask

   task send(int j);
      $display("driving port %0d" , j);
   endtask


endmodule
all : clean comp run sim.log 

clean:
	\rm -rf simv* csrc *.key
comp:
	vcs -full64 test.sv -sverilog
run:
	simv -l sim.log
debug point fork_1
driving port 0
driving port 1
driving port 2
driving port 3
driving port 4
driving port 5
driving port 6
driving port 7
driving port 8
driving port 9
driving port 10
driving port 11
driving port 12
driving port 13
driving port 14
driving port 15
debug point fork_2
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
debug point fork_3
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
driving port 16
debug point fork_4
driving port 0
driving port 1
driving port 2
driving port 3
driving port 4
driving port 5
driving port 6
driving port 7
driving port 8
driving port 9
driving port 10
driving port 11
driving port 12
driving port 13
driving port 14
driving port 15
THREAD 1 5
THREAD 3 10
After task call 10

 

使用以上Makefile和test.sv文件,运行仿真,仿真结果如下

可以看到虽然都是fork join_none wait fork但是每一个fork_x task的打印结果是不同的。这是为什么呢?

不同之处在于变量index的生存周期,以及何时为该变量分配变量i的值的时间。

意识到将有16个并发变量名为index,只有一个名为i。在情况1)和2)中,每次进入fork / join_none块时都会创建index变量。在派生fork / join_none中的任何进程之前发生。在情况1)中,变量初始化也发生在fork / join_none中的任何进程之前。您需要记住的是,自动变量是在输入时创建的,并在执行它们所在的块中的任何过程语句之前被初始化。因此,在情况1)中,每个索引变量在每次循环迭代中都获得i的当前值。
在情况2)中,您将初始化移到了单独的过程分配语句中。 fork / join_none中的每个语句将成为新的子进程,并且直到当前父线程挂起后,该子进程才开始执行。现在,for循环会生成16个线程,然后在i的值为16时在wait fork处挂起。(正如我之前说过的,如果send(index)看到单位值0或分配的值16,这是一个竞赛。
在情况3)中,现在在一个begin / end块内声明index变量,这是fork / join_none的单个语句。因此,直到所有16个进程都已生成并且i的值为16时,才创建索引变量。

任何自动变量的生命周期都将在其块及其所有嵌套块的生命周期结束时结束。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193010.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pytest重试_pycharm could not find main

    pytest重试_pycharm could not find main安装:pip3installpytest-rerunfailures重新运行所有失败用例要重新运行所有测试失败的用例,请使用–reruns命令行选项,并指定要运行测试的最大次数:$py

  • 服务器ssh免密钥登陆(vscode远程连接服务器)

    VScode实现远程查看代码要使用一些插件,我用的是Remote-SSH,安装很简单,推荐看下下面的博客,写的很详细:https://blog.csdn.net/u010417914/article/details/96918562重要的是遇到的一些问题:1.我的服务器用的是Ubuntu18.04,生成rsa公钥和私钥后,注意要以附加到文件尾部的方式把公钥拷贝到…

  • java女人_Java是一个事业成功的女人

    java女人_Java是一个事业成功的女人原标题:Java是一个事业成功的女人文/北京达内教育(微信号:bjtedu01)关注后免费可获得达内5天训练营,都是干货哦~Java是一个事业成功的女人。很多在她手下干过的人都感觉她的能力跟她的地位并不般配,她更多的是通过技巧打动了中层管理人员。你也许会认为她是很有智慧的人,你愿意跟随她。但你要准备好在数年里不断的听到“你用错了接口,你遗漏了一个分号”这样的责备。C++是Java的表姐。她在…

  • Error filterStart 错误解决「建议收藏」

    Error filterStart 错误解决「建议收藏」2019独角兽企业重金招聘Python工程师标准>>>…

  • 源码大招:不服来战!撸这些完整项目,你不牛逼都难!

    源码大招:不服来战!撸这些完整项目,你不牛逼都难!经常有人问我有没有什么项目代码,我回复说去Github找,但是还是好多人不知道如何找到那些比较好的项目。今天花了点时间找了些安卓的项目,觉得还是不错的,几乎就是自己生活常用的一些app,如果你是一个Android开发者,我觉得撸完这些项目,你想不牛逼都难。菜鸟新闻菜鸟新闻客户端是一个仿照36Kr官方,实时抓取36Kr官网数据的资讯类新闻客户端。包括首页新闻,详情,发现,活动,实时数据

  • 阿里面试失败后,一气之下我图解了Java中18把锁「建议收藏」

    目录乐观锁和悲观锁独占锁和共享锁互斥锁和读写锁公平锁和非公平锁可重入锁自旋锁分段锁锁升级(无锁|偏向锁|轻量级锁|重量级锁)锁优化技术(锁粗化、锁消除)乐观锁和悲观锁悲观锁悲观锁对应于生活中悲观的人,悲观的人总是想着事情往坏的方向发展。举个生活中的例子,假设厕所只有一个坑位了,悲观锁上厕所会第一时间把门反锁上,这样其他人上厕所只能在门外等候,这种状态就是「阻塞」了。回到代码世界中,一个共享数据加了悲观锁,那线程每次想操作这个数据前都会假设其他线程.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号