首页 > 其他分享 >线程控制 fork

线程控制 fork

时间:2022-10-04 23:47:59浏览次数:42  
标签:fork 控制 join exec initial 线程 time display

线程控制

1. 线程控制

1.1. 并行线程

  • fork...join需要所有的并行的线程都结束以后才会继续执行
  • fork...join_any则会等到任何一个线程结束以后就继续执行
  • fork...join_none则不会等待其他子线程而继续执行
    在这里插入图片描述
fork
  begin	// thread-1
    $display("First Block!\n");
    # 20ns;
  end
  begin	// thread-2
    $display("Second Block!\n");
    @eventA;
  end
join
  • fork...join_anyfork_join_none继续执行后,其一些未完成的子程序仍将在后台运行
  • 如果要等待这些子程序全部完成,或者停止这些子程序可以使用wait fork或者disable fork
task mt_test;
  fork
    exce1();
    exce2();
  join_any
  fork
    exec3();
    exec4();
  join_none
  wait fork; // block until exec1 ... exec4 complete
endtask

1.2. 一些代码示例

1.2.1. 多个initial并行执行

module tb;
  task automatic exec(int id, int t);
    $display("@%t exec[%0d entered]", $time, id);
    #t;
    $display("@%t exec[%0d exited]", $time, id);
  endtask

  initial begin exec(1, 10); end
  initial begin exec(2, 20); end
  initial begin exec(3, 30); end
  initial begin exec(4, 40); end
endmodule

在这里插入图片描述

1.2.2. 单个initial内串行执行

module tb2;
  task automatic exec(int id, int t);
    $display("@%t exec[%0d entered]", $time, id);
    #t;
    $display("@%t exec[%0d exited]", $time, id);
  endtask

  initial begin
    exec(1, 10);
    exec(2, 20);
    exec(3, 30);
    exec(4, 40);
  end
endmodule

在这里插入图片描述

1.2.3. fork…join内并行执行

module tb3;
  task automatic exec(int id, int t);
    $display("@%t exec[%0d entered]", $time, id);
    #t;
    $display("@%t exec[%0d exited]", $time, id);
  endtask

  initial begin
    fork
      exec(1, 10);
      exec(2, 20);
      exec(3, 30);
      exec(4, 40);
    join
  end
endmodule

在这里插入图片描述

1.2.4. join_any和join_none

module tb4;
  task automatic exec(int id, int t);
    $display("@%t exec[%0d entered]", $time, id);
    #t;
    $display("@%t exec[%0d exited]", $time, id);
  endtask

  initial begin: ini_proc1
    $display("@%t fork-join_any entered", $time);
    fork
      exec(1, 10);
      exec(2, 20);
    join_any
    $display("@%t fork-join_any exited", $time);
    $display("@%t fork-join_none entered", $time);
    fork
      exec(3, 30);
      exec(4, 40);
    join_none
    $display("@%t fork-join_none exited", $time);
    $display("@%t ini_proc1 exited", $time);
  end

  
  initial begin
    #200;
  end
endmodule

在这里插入图片描述
initial本该在10ns的时候退出,但是fork块内的线程还没有结束

1.2.5. wait fork

wait fork可以让当前initial块等待前面的fork执行完后再继续

module tb5;
  task automatic exec(int id, int t);
    $display("@%t exec[%0d entered]", $time, id);
    #t;
    $display("@%t exec[%0d exited]", $time, id);
  endtask

  initial begin: ini_proc1
    $display("@%t fork-join_any entered", $time);
    fork
      exec(1, 10);
      exec(2, 20);
    join_any
    $display("@%t fork-join_any exited", $time);
    $display("@%t fork-join_none entered", $time);
    fork
      exec(3, 30);
      exec(4, 40);
    join_none
    $display("@%t fork-join_none exited", $time);
    wait fork;
    $display("@%t ini_proc1 exited", $time);
  end
  
  initial begin
    #200;
  end
endmodule

1.2.6. disable fork

disable fork可以让当前initial内没有执行完的fork线程结束

module tb6;
  task automatic exec(int id, int t);
    $display("@%t exec[%0d entered]", $time, id);
    #t;
    $display("@%t exec[%0d exited]", $time, id);
  endtask

  initial begin: ini_proc1
    $display("@%t fork-join_any entered", $time);
    fork
      exec(1, 10);
      exec(2, 20);
    join_any
    $display("@%t fork-join_any exited", $time);
    $display("@%t fork-join_none entered", $time);
    fork
      exec(3, 30);
      exec(4, 40);
    join_none
    $display("@%t fork-join_none exited", $time);
    disable fork;
    $display("@%t ini_proc1 exited", $time);
  end
  
  initial begin
    #200;
  end
endmodule

在这里插入图片描述

1.2. 时序控制

  • SV可以通过延迟控制或者时间等待来对过程块完成时序控制
  • 延迟控制即通过#来完成
    #10 rega = regb;
  • 事件(event)控制即通过@来完成
    @r rega = regb;
    @(posedge clk) rega = regb;
  • wait语句也可以与事件或者表达式结合来完成
    real AOR[];
    initial wait(AOR.size() > 0) …;

标签:fork,控制,join,exec,initial,线程,time,display
From: https://www.cnblogs.com/amxiang/p/16754843.html

相关文章

  • 线程间同步和通信,event semaphore mailbox
    线程间同步和通信,event semaphore mailbox1.概述2.事件event3.wait_order()4.旗语(semaphore)5.semaphore::get();6.semaphore::try_get()7.信箱mailbox......
  • 线程的控制与同步
    线程的控制与同步1.线程的使用1.1.什么是线程?1.2.线程的概念澄清2.线程的控制2.1.fork并行线程语句块2.2.等待所有衍生线程2.3.停止单个线程2.4.......
  • 22-FAQ登录RabbitMQ控制台提示不是私密连接
    登录RabbitMQ控制台提示不是私密连接将启动的时候的赋权操作再执行一遍rabbitmqctladd_userrootrabbitmqctlset_permissions-p/root".*"".*"".*"rabbitmqct......
  • 05-RabbitMQ控制台入门及其Java简单操作
    MQ控制台简单操作建立Exchange新建Exchange成功新建Queue新建Queue成功建立Exchange与Queue的关系建立关系成功路由键:就是指发送到Exchange的消息,通......
  • XX学Python·进程与线程
    多任务编程-进程多任务执行方式并发:在一段时间内交替去执行任务并行:多核cpu每个cpu执行一个任务。注:任务>cpu时,每个cpu并发执行多个任务进程:计算机中的程......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实......
  • 实验4:开源控制器实践——OpenDaylight
    一、基本要求1、Mininet拓扑生成并连接控制器的结果2、Mininet中ping测试截图二、进阶要求1、ODL提供的文档链接:http://127.0.0.1:8181/apidoc/explorer/index.html......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight第一部分:基本实验1.利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器执行结果截图2.通过Postman工具调用OpenDayl......
  • 实验4:开源控制器实践——OpenDaylight
    一.基本要求1.利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器2.通过Postman工具调用OpenDaylight提供的API下发流表,实现拓扑内主机h1和h3网络中断10s......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实......