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时,才创建索引变量。

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sqlyog安装详细步骤

    sqlyog安装详细步骤mysql安装步骤请点击:Mysql5.6安装详细步骤我的sqlyog百度云链接(永久有效):http://pan.baidu.com/s/1i5j4GG9密码获取请点击:获取密码注册码序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c如果使用sqlyog登陆报错的话请参考https://bl…

    2022年5月8日
    51
  • 如何配置python环境变量mac_如何配置python环境变量,如何配置python环境变量mac

    如何配置python环境变量mac_如何配置python环境变量,如何配置python环境变量mac如何配置python环境变量,如何配置python环境变量mac,如何设置Python环境变量大家好,我是Yivies.相信很多python的初学者们在进行一顿下一步下一步的安装之后,在windowscommand命令行输入python的时候会出现这样的情况:可我们希望它是这样子的:其实这是因为你在安装的时候忘记了添加python的环境变量的原因!那接下来我就教大家如何手动设置python的环境…

    2022年6月22日
    47
  • Linux文本处理神器awk实战案例

    Linux文本处理神器awk实战案例1.什么是awk2.打印不同列的内容3.打印行号和列号4.修改输入和输出分隔符5.输入多个文件6.修改某一列的值7.条件筛选后打印8.运算9.正则表达式

    2022年7月11日
    18
  • 如何打开sql server配置管理器

    如何打开sql server配置管理器如何打开sqlserver配置管理器

    2022年7月20日
    87
  • springboot 与spring的区别_SpringBootVFS

    springboot 与spring的区别_SpringBootVFS一、概念1、SpringSpring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。2、SpringMVCSpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校

    2022年8月20日
    9
  • Burp Suite抓包讲解「建议收藏」

    Burp Suite抓包讲解「建议收藏」目录BurpSuite安装介绍BurpSuite抓包工具概述设置代理信息抓包的基本操作抓HTTPS包的证书设置BurpSuite安装介绍BurpSuite是一款集成化的渗透测试工具,包含了许多功能,可以帮助我们高效地完成对web应用程序的渗透测试和攻击。由Java语言编写,执行程序是Java文件类型的jar文件,免费版可在官网下载。环境运行时依赖JRE,需提前安装Java环境。百度JDK下载即可。(打开cmd,输入Java-version,便可查看版本信息)环境变量配置

    2022年6月10日
    158

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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