Thursday, April 17, 2014

SystemVerilog, fork-join, parallel threads

The trick to have parallel threads is to use "automatic" keyword when you define a task.
This is just another perspective I tried out while practicing.
file task.sv
class show1;
int   delay;
bit [7:0] count;

function new (int delay, bit [7:0] count);
this.delay = delay;
this.count = count;
endfunction : new;

task show();
            #(delay) $display("time=%2t: Delay=%2d Count=%2d", $time, delay, count);
endtask
endclass



file testcase.sv
`include "./tasks.sv"
program testcase;
show1 s1, s2, s3, s4, s5, s6;
   initial begin
     fork
       s1= new (3,2);
       s1.show();
       s2 = new (5,8); s2.show();
       s3 = new (10,25); s3.show();
       s4 = new (23,0); s4.show();
       s5 = new (6,1); s5.show(); 
     join
     $display("time=%3t: Exiting fork-join...\n", $time);
     s6 = new (5, 3); s6.show(); 
     #100 $finish;
   end
endprogram : testcase



output:
time= 3: Delay= 3 Count= 2
time= 5: Delay= 5 Count= 8
time= 6: Delay= 6 Count= 1
time=10: Delay=10 Count=25
time=23: Delay=23 Count= 0
time=23: Exiting fork-join...

time=28: Delay= 5 Count= 3

$finish called from file "testcase.sv", line 21.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

task automatic show(input int   delay,
          input [7:0] count
         );

       if(delay < 5)
            #(delay) $display("time=%2t: Delay=%2d Count=%2d. Short Process Running...", $time, delay, count);
       else if(delay >= 5 && delay < 10)
            #(delay) $display("time=%2t: Delay=%2d Count=%2d. Medium Process Running...", $time, delay, count);
       else if(delay >= 10 && delay < 15)
            #(delay) $display("time=%2t: Delay=%2d Count=%2d. Long Process Running...", $time, delay, count);
       else #(delay) $display("time=%2t: Delay=%2d Count=%2d. Very long Process Running...", $time, delay, count);
   
endtask



`include "./tasks.sv"
module testcase();
   initial begin
     fork
       show (3,2);   
       show (5,8);   
       show(10,25);
       show(23,0);
       show (6,1);   
     join_any
     $display("time=%2t: Exiting fork-join...\n", $time);
     show (5, 255);   
     #100 $finish;
   end

endmodule


///////////////////////////////////////////////////////////////////////////////////////////////////

The types of fork - join 
1. fork join
2. fork join_any
3. fork join_any disablefork
4. fork join_any waitfork
5. fork join_none
6,7: fork join_none with disablefork / waitfork




 







 

 

No comments:

Post a Comment