微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > sv里的fork_join线程问题

sv里的fork_join线程问题

时间:10-02 整理:3721RD 点击:
代码里已经把program声明为qutomatic了,表明for循环里的变量i是automatic,并不是只分配一块共享内存放置i啊

运行结果为:

我觉得应该有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 为啥得到相同的结果,两者的变量内存分配是怎么回事,谢谢

  1. program automatic test ;
  2. int i; // not within a procedural block - static
  3. task t ( int a ); // arguments and variables in t are automatic
  4. ... // unless explicitly declared static
  5. endtask
  6. endprogram

复制代码

IEEE 1800-2012有解释

不好意思,说错了。应该这样改: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.

谢谢啊,我懂了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top