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
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