首页 > 其他分享 >SystemVerilog -- 3.1 SystemVerilog Threads --> fork join

SystemVerilog -- 3.1 SystemVerilog Threads --> fork join

时间:2024-05-13 22:07:57浏览次数:13  
标签:fork join 0t Thread -- finished time display SystemVerilog

fork join

SystemVerilog 通过构造提供对并行或并发threads的支持。可以使用forkjoin同时生成多个procedural blocks。有一些变体允许main thread根据child thread何时完成继续执行其余语句。

Syntax

fork
  // Thread 1
  // Thread 2
  // ...
  // Thread 3
join

fork join example

在下面显示的示例中,使用了forked的3个threads。main thread将保持暂停状态,直到forked生成的所有threads都完成。beginend中的任何代码块都被视为单独的thread,在本例中为Thread 2

module tb;
  initial begin
    $display ("[%0t] Main Thread: Fork join going to start", $time);
    fork
      // Thread 1
      #30 $display ("[%0t] Thread1 finished", $time);
      // Thread 2
      begin
        #5  $display ("[%0t] Thread2 ...", $time);
        #10 $display ("[%0t] Thread2 finished", $time);
      end
      // Thread 3
      #20 $display ("[%0t] Thread3 finished", $time);
    join
    $display ("[%0t] Main Thread: Fork join has finished", $time);
  end
endmodule

main thread在时间0ns时forked所有3个threads。Thread2是一个procedural blocks,只有当它执行beginend中的所有语句时才会完成。Thread2需要15ns才能完成,并且由于它从0ns开始,所以它在15ns结束,并且是第一个完成的thread。Thread1在30ns时完成模拟时间最多,而Thread3在20ns时更早完成。

模拟日志

ncsim> run
[0] Main Thread: Fork join going to start
[5] Thread2 ...
[15] Thread2 finished
[20] Thread3 finished
[30] Thread1 finished
[30] Main Thread: Fork join has finished
ncsim: *W,RNQUIE: Simulation is complete.

Nested fork join

fork join也可以嵌套在其他中。

Example #1

module tb;
  initial begin
    $display ("[%0t] Main Thread: Fork join going to start", $time);
    fork
      fork
        print (20, "Thread1_0");
        print (30, "Thread1_1");
      join
      print (10, "Thread2");
    join
    $display ("[%0t] Main Thread: Fork join has finished", $time);
  end

  // Note that this task has to be automatic
  task automatic print (int _time, string t_name);
    #(_time) $display ("[%0t] %s", $time, t_name);
  endtask
endmodule

模拟日志

ncsim> run
[0] Main Thread: Fork join going to start
[10] Thread2
[20] Thread1_0
[30] Thread1_1
[30] Main Thread: Fork join has finished
ncsim: *W,RNQUIE: Simulation is complete.

Example #2

module tb;
  initial begin
    $display ("[%0t] Main Thread: Fork join going to start", $time);
    fork
      // Thread 1
      fork 
        #50 $display ("[%0t] Thread1_0 ...", $time);
        #70 $display ("[%0t] Thread1_1 ...", $time);
        begin
          #10  $display ("[%0t] Thread1_2 ...", $time);
          #100 $display ("[%0t] Thread1_2 finished", $time);
        end
      join

      // Thread 2
      begin
        #10  $display ("[%0t] Thread2 ...", $time);
        #100 $display ("[%0t] Thread2 finished", $time);
      end

      // Thread 3
      #20 $display ("[%0t] Thread3 finished", $time);
    join
    $display ("[%0t] Main Thread: Fork join has finished", $time);
  end
endmodule

看到main thread保持挂起状态,直到所有嵌套的forked结束110ns。

模拟日志

ncsim> run
[0] Main Thread: Fork join going to start
[5] Thread2 ...
[10] Thread1_2 ...
[15] Thread2 finished
[20] Thread3 finished
[50] Thread1_0 ...
[70] Thread1_1 ...
[110] Thread1_2 finished
[110] Main Thread: Fork join has finished
ncsim: *W,RNQUIE: Simulation is complete.

标签:fork,join,0t,Thread,--,finished,time,display,SystemVerilog
From: https://www.cnblogs.com/sys-123456/p/18188244

相关文章

  • JPEG库的移植(arm平台)
    JPEG库的移植(arm平台)目录JPEG库的移植(arm平台)介绍头文件及全局变量1、图片显示2、其他图片压缩到jpg图片3、主函数及验证程序输出结果介绍图解头文件及全局变量#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#in......
  • # Pycharm操作git
    日常开发中,经常会使用Git来管理项目,IDE使用Pycharm,使用Pycharm中的Git操作可以大大节省直接使用命令敲代码的时间.【1】拉取仓库使用git来进行clone操作拉取远程仓库的代码到本地填入仓库的git地址【2】gitcommit......
  • 解锁弹框:Python 下的 Playwright 弹框处理完全指南
    前言在Web自动化测试中,处理弹框是一项常见的任务。弹框可能包括警告、确认和提示框。Playwright是一个功能强大的自动化测试工具,提供了处理这些弹框的灵活方法。在本文中,我们将深入探讨如何使用Python编写代码来处理各种类型的弹框。弹框的分类弹框通常分为3种,分别为aler......
  • 后台爆破工具 - blasting
    https://github.com/gubeihc/blasting02项目介绍 工具主要是为了方便在面对web后台进行爆破测试的时候,用户名和密码是加密的情况下如果单纯分析js来进行爆破测试时间成本会比较多。这里呢就采用模拟浏览器通过调用js来直接写入账号密码进行请求,来快速达到测试效果。 程......
  • x64汇编——汇编指令
     汇编指令 movdest,srcmovmove的简称将src的内容赋值给dest,类似于dest=src[地址值]中扩号[]里面放的都是内存地址一个变量的地址值,是它所有字节地址中的最小值word是2字节,dword是4字节(doubleword),qword是8字节(quadword)  注意地址取值是向高位扩展,如......
  • 【django学习-19】基本流程与用户管理界面(原始方式)
    1.安装及创建项目1.1:安装django,pipinstalldjango1.2:创建项目:django-adminstartproject项目名称1.3:创建app:pythonmanage.pystartappapp名称1.4:使用pychram创建项目:1.4.1:注意点,pycharm在标准的基础上默认给咱们加了点东西1.4.2:创建了一个templates目录【删除】1.......
  • [题解] Flipping Game
    题目描述有n盏灯,每个灯有开和关两种状态。每按一次灯会变成相反的状态。给定灯初始的开关状态和结束的开关状态,若操作k轮,每轮要按m个不同的灯,问有多少种方法使灯由初始状态变到结束状态。题解需注意每轮要按不同的灯,若无这个条件,暴力计算组合数即可。要操作多轮,且每轮按灯的......
  • 常用Git命令
    常用Git命令下面是我整理的常用Git命令清单。几个专用名词的译名如下。Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库【1】新建代码库#在当前目录新建一个Git代码库$gitinit#新建一个目录,将其初始化为Git代码库$gitinit[pr......
  • 设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真
    文件IO练习题设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。代码:/****************************************************************************************************************** * filename : Show......
  • SSH连接远程仓库
    【1】生成密钥文件在任意位置打开cmd或者gitbashssh-keygen-ted25519-C"[email protected]"在用户目录下的.ssh就会自动生成密钥,打开pub结尾的,复制其内容【2】把公钥配置在gitee账号上【3】删除之前配置的origingitremoteremoveorigin【4】换成ssh地址gitrem......