在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10735|回复: 14

[求助] sv里面fork...join_none的一段错误分析!!

[复制链接]
发表于 2014-7-16 21:21:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
谁能帮看看这个例子中,详细的执行过程(for展开),即错误分析~~谢谢~

2.png
发表于 2014-7-16 21:41:54 | 显示全部楼层
i=0       send(i)--->into waiting queue
            i++;
i=1       send(i)---->into waiting queue
            i++;
i=2       send(i)------>into  waiting  queue
................
.................
i=16;            ready queue 执行完 开始执行waiting queue
i=16          $display().....
i=16          $display().....
16次
就出现打印结果了,因为16个sendtask引用的是一个地址(*i);而且由于你是join none 的,所以你的所有send会在for循环结束后开始执行
发表于 2014-7-18 10:23:04 | 显示全部楼层
首先是SV中static与automatic的区别。一个任务如果没有被标示为automatic,则默认为static,在这个任务的调用过程中就只会分配一块内存空间,所以每一次该任务的调用都会导致上一次任务的内存被重写。你的例子中就是说send被调用了许多次,但是send任务里面的int j 这个变量其实共用了同一个地址。
再看join_none语句。它指示父线程不会被阻塞,而会继续执行,子线程会加入等待队列。也就是说i会一直被加到15跳出循环后,才会执行循环中产生的16个send任务(线程),而此时i的值已经是15了,按前面说的这个任务是static的,所以再执行display只会打印出15.
如果将task send; 改为task automatic send 就可以实现15-0的打印。
或者在send任务中用automatic定义一个变量,如automatic int temp;然后先将j存放在temp中,打印temp。如下
task send(int j);
  automatic int temp;
  temp = j;
  fork
    $display("%0d",temp);
    #0;
  join_none
endtask
结果应该是一样的。
发表于 2014-7-18 10:50:31 | 显示全部楼层
为什么打印的不是 16 而是 15?  在for 跳出后, i 应该是16了.
发表于 2014-7-18 16:55:25 | 显示全部楼层
回复 4# jerrycao


   是这样的,在program里面,task默认是static的,所以将for循环展开是
send(0);
send(1);
。。。
send(15);
由于send task是static的,也就是在内存中只有一个send,且由于fork join_none的缘故,send的执行会在下一个timeslot才开始,所以后面的send的数字会override前面的,也就是在内存中的send的输入值是15, 最后就是执行16遍内存中唯一的static的task send。
发表于 2014-9-5 00:04:05 | 显示全部楼层
program test -->  program automatic test
发表于 2014-9-5 11:39:37 | 显示全部楼层
回复 3# wangjunchi


    GOOD! 六楼说的也对。
发表于 2014-9-6 15:52:51 | 显示全部楼层
都好厉害
发表于 2017-5-11 16:04:48 | 显示全部楼层
绿皮书上有说明
发表于 2017-5-11 22:14:40 | 显示全部楼层
厉害厉害,看了一下,有点理解了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-2 07:18 , Processed in 0.026937 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表