systemverilog中的for和fork join嵌套

引言

在IC验证中通常需要并行发送激励,比如多个端口同时收发激励。这需要我们使用多线程的编程思路。sv中使用 fork join 来同时挂起多个线程。当需要同时挂起N个线程时,显然一个个挂起显得有些麻烦,而且代码不太雅观。这时候我们可以嵌套for循环来完成这一工作。本文章主要阐述sv中 for 和 fork join 的嵌套编程,以及遇到的问题和分析。

问题描述

同时挂起多个任务,不用等待直接退出

利用for嵌套fork join_none,同时挂起多个线程,在这里task proc一定要加automatic,这是因为sv中任务默认是静态的,如果你试图在测试程序里的多个地方调用同一任务,由于任务里的局部变量会使用共享的静态存储区,所以不同的线程之间会窜用这些变量。

`timescale 1ns/1ns
module top();
	task automatic proc(int dw_num);
    #1;
    $display("#%0p dw_num=%0d",$time,dw_num); 
  endtask

  task main_proc();
	  $display("#%0p enter main_proc()",$time);
  endtask
  
 task hwb();
    for(int i=0;i<4;i++)
	  begin
	    automatic int j = i; 
      	fork
                proc(j);
      	join_none
      end
   main_proc(); 
  endtask


initial begin
    $display("-----------------------------------------------------------------");
    hwb();
    $display("-----------------------------------------------------------------");
    #20;
    $finish; //ends the simulation
  end
  endmodule

同时挂起多个任务,等到所有任务结束后退出

`timescale 1ns/1ns
module top();
	task automatic proc(int dw_num);
    #1;
    $display("#%0p dw_num=%0d",$time,dw_num); 
  endtask

  task main_proc();
	  #1 $display("#%0p enter main_proc()",$time);
  endtask
  
 task hwb();
    for(int i=0;i<4;i++)
	  begin
	    automatic int j = i; 
      	fork
                proc(j);
      	join_none
      end
   wait fork;
   main_proc(); 
  endtask


initial begin
    $display("-----------------------------------------------------------------");
    hwb();
    $display("-----------------------------------------------------------------");
    #20;
    $finish; //ends the simulation
  end
  endmodule

同时挂起多个任务,等到任一任务结束后退出

`timescale 1ns/1ns
module top();
	task automatic proc(int dw_num);
    #1;
    $display("#%0p dw_num=%0d",$time,dw_num); 
  endtask

  task main_proc();
	  #1 $display("#%0p enter main_proc()",$time);
  endtask
  
 task hwb();
    for(int i=0;i<4;i++)
	  begin
	    automatic int j = i; 
      	fork
	    begin
	      fork:work	
                proc(j);
      	  join_any
	      disable work;
	    end
      	join_none
      end
   wait fork;
   main_proc(); 
  endtask


initial begin
    $display("-----------------------------------------------------------------");
    hwb();
    $display("-----------------------------------------------------------------");
    #20;
    $finish; //ends the simulation
  end
  endmodule

仿真与结果分析

待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值