Hi Forum.,
This question is very lengthy as i have described my question in great detail.Please go through it patiently.
In the below code attached(FIRST SNIPPET), I am using loop variable directly in the FORK JOIN_NONE block.If i use like that i understood that fork join_none will take last updated loop variable value(in this example last updated loop variable value will be i=3). And result of that display i have pasted below.
But in same code(SECOND SNIPPET), If i consider automatic variable in the fork join_none block ,it will keep each iteration value in separate memorey and it will update accordingly. I have pasted of SECOND Snippet result as well.
My question is ,1)why when we are using loop variable in fork join_none it will take last updated value(Please give solid reason).
2)As i am using this task as a class member ‘i’(loop variable should also have been automatic variable)
(FIRST SNIPPET):-
module test;
class member;
task main_task(bit[7:0] a,b,c,d);
fork
sub_task(a,b,"FIRST THREAD");
sub_task(c,d,"SECOND THREAD");
join
endtask
task automatic sub_task(bit[7:0] p,q,string label);
bit[7:0] m,n;
for(int i=0;i<3;i++)
begin //for begin
fork
begin //fork begin
m=p*i;
n=q*i;
$display("Tag=%s,m=%0d,n=%0d,i=%0d",label,m,n,i);
end //fork end
join_none
end //for end
endtask
endclass
member m1;
initial begin
m1=new();
for(int i=1;i<5;i++) begin
m1.main_task(i,i+1,i+2,i+3); end
end
endmodule
Result of FIRST SNIPPET :=
Tag=FIRST THREAD,m=3,n=6,i=3
Tag=FIRST THREAD,m=3,n=6,i=3
Tag=FIRST THREAD,m=3,n=6,i=3
Tag=SECOND THREAD,m=9,n=12,i=3
Tag=SECOND THREAD,m=9,n=12,i=3
Tag=SECOND THREAD,m=9,n=12,i=3
Tag=FIRST THREAD,m=6,n=9,i=3
Tag=FIRST THREAD,m=6,n=9,i=3
Tag=FIRST THREAD,m=6,n=9,i=3
Tag=SECOND THREAD,m=12,n=15,i=3
Tag=SECOND THREAD,m=12,n=15,i=3
Tag=SECOND THREAD,m=12,n=15,i=3
Tag=FIRST THREAD,m=9,n=12,i=3
Tag=FIRST THREAD,m=9,n=12,i=3
Tag=FIRST THREAD,m=9,n=12,i=3
Tag=SECOND THREAD,m=15,n=18,i=3
Tag=SECOND THREAD,m=15,n=18,i=3
Tag=SECOND THREAD,m=15,n=18,i=3
Tag=FIRST THREAD,m=12,n=15,i=3
Tag=FIRST THREAD,m=12,n=15,i=3
Tag=FIRST THREAD,m=12,n=15,i=3
Tag=SECOND THREAD,m=18,n=21,i=3
Tag=SECOND THREAD,m=18,n=21,i=3
Tag=SECOND THREAD,m=18,n=21,i=3
(SECOND SNIPPET)
module test;
class member;
task main_task(bit[7:0] a,b,c,d);
fork
sub_task(a,b,"FIRST THREAD");
sub_task(c,d,"SECOND THREAD");
join
endtask
task automatic sub_task(bit[7:0] p,q,string label);
bit[7:0] m,n;
for(int i=0;i<3;i++)
automatic int ch=i;
begin //for begin
fork
//automatic int ch=i;
begin //fork begin
m=p*ch;
n=q*ch;
$display("Tag=%s,m=%0d,n=%0d,i=%0d",label,m,n,i);
end //fork end
join_none
end //for end
endtask
endclass
member m1;
initial begin
m1=new();
for(int i=1;i<5;i++) begin
m1.main_task(i,i+1,i+2,i+3); end
end
endmodule
Result of SECOND SNIPPET :=
Tag=FIRST THREAD,m=0,n=0,ch=0
Tag=FIRST THREAD,m=1,n=2,ch=1
Tag=FIRST THREAD,m=2,n=4,ch=2
Tag=SECOND THREAD,m=0,n=0,ch=0
Tag=SECOND THREAD,m=3,n=4,ch=1
Tag=SECOND THREAD,m=6,n=8,ch=2
Tag=FIRST THREAD,m=0,n=0,ch=0
Tag=FIRST THREAD,m=2,n=3,ch=1
Tag=FIRST THREAD,m=4,n=6,ch=2
Tag=SECOND THREAD,m=0,n=0,ch=0
Tag=SECOND THREAD,m=4,n=5,ch=1
Tag=SECOND THREAD,m=8,n=10,ch=2
Tag=FIRST THREAD,m=0,n=0,ch=0
Tag=FIRST THREAD,m=3,n=4,ch=1
Tag=FIRST THREAD,m=6,n=8,ch=2
Tag=SECOND THREAD,m=0,n=0,ch=0
Tag=SECOND THREAD,m=5,n=6,ch=1
Tag=SECOND THREAD,m=10,n=12,ch=2
Tag=FIRST THREAD,m=0,n=0,ch=0
Tag=FIRST THREAD,m=4,n=5,ch=1
Tag=FIRST THREAD,m=8,n=10,ch=2
Tag=SECOND THREAD,m=0,n=0,ch=0
Tag=SECOND THREAD,m=6,n=7,ch=1
Tag=SECOND THREAD,m=12,n=14,ch=2