sv里的fork_join线程问题
时间:10-02
整理:3721RD
点击:
代码里已经把program声明为qutomatic了,表明for循环里的变量i是automatic,并不是只分配一块共享内存放置i啊
运行结果为:
我觉得应该有16个内存区域放置i的中间值,应该从port0到port15才对啊.请大神解释下,谢谢
回复 1# 打回原形
图片上传失败了,这是图片
运行结果为:
我觉得应该有16个内存区域放置i的中间值,应该从port0到port15才对啊.请大神解释下,谢谢
回复 1# 打回原形
图片上传失败了,这是图片
我把 i 声明为静态的,结果居然和动态 i 运行的一样,怎么回事啊
for (int ii = 0; ii < 16; ii+=)
fork
begin
automatic int jj;
jj = ii;
send(jj);
end
join_none
end
我知道声明一个中间自动变量可以解决,但是automatic的program里面的变量默认是automatic,那么for循环里的 i 也是automatic, 按道理没必要中间再复制一份吧。一般加中间自动变量用于解决static的program,还望大神解释下我截的两张图中同样在automatic的program
中,automatic的 i 和 static的 i 为啥得到相同的结果,两者的变量内存分配是怎么回事,谢谢
- program automatic test ;
- int i; // not within a procedural block - static
- task t ( int a ); // arguments and variables in t are automatic
- ... // unless explicitly declared static
- endtask
- endprogram
不好意思,说错了。应该这样改:task automatic send(int j);
fork
begin
$display();
#1;
end
join_none
endtask
initial begin
for (int ii = 0; ii < 16; ii ++) begin
send(ii);
end
end
仿真器遇到fork join_none语句,会直接跳到join_none之后继续执行直到遇到阻塞语句。在你的例子里,仿真器会先执行16次for循环,然后才会执行16个fork,所以在fork里面看到的ii会是16.
谢谢啊,我懂了