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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6963|回复: 21

[求助] fork join问题

[复制链接]
发表于 2021-9-8 09:52:55 | 显示全部楼层 |阅读模式

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

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

x
fork join内是只有一个for循环的单线程,请问一下加fork join和不加有什么区别?事实上我加fork join打印的时间是valid拉高后立即的时间(我想要的时间),而不加的话,第一次打印的时间已经是valid拉高后过了几十个clk的时间了。
代码结构如下:
if(***)begin
    fork
        for(****)begin
            ........
            ........
            ........
            if(valid)
                $display("The time is %t",$realtime);
        end
    join
end

发表于 2021-9-8 11:31:09 | 显示全部楼层
好问题,mark
发表于 2021-9-8 14:13:38 | 显示全部楼层
fork...join里面的语句块都是并行执行的,并且所有的语句块都执行完,才继续执行fork...join后面的代码;
fork...join_none里面的语句块都是并行执行的,并且不会阻塞,继续执行fork...join_none后面的代码;
fork...join_any里面的语句块都是并行执行的,只要有一个语句块执行完,就继续执行fork...join_any后面的代码;
 楼主| 发表于 2021-9-8 14:32:24 | 显示全部楼层


飞翔的马甲 发表于 2021-9-8 14:13
fork...join里面的语句块都是并行执行的,并且所有的语句块都执行完,才继续执行fork...join后面的代码;
f ...


在我上面fork join里面的for循环是顺序执行的吧,加不加fork是有什么影响呢?
发表于 2021-9-8 16:04:55 | 显示全部楼层
就已提供代码来看,没啥区别吧
发表于 2021-9-8 16:22:09 | 显示全部楼层


eextw6 发表于 2021-9-8 14:32
在我上面fork join里面的for循环是顺序执行的吧,加不加fork是有什么影响呢?
...


要明确一个“语句块”的概念,多行代码的语句块,用begin...end来界定,单行的代码单独视为一个语句块。
例如:
fork
begin
    process1();
    process2();
end
join

fork
process1();
process2();
join
是不一样的,上面的fork...join只有一个语句块,begin...end里面的代码始终是顺序执行的,所以先执行process1(),再执行process2();
下面fork...join有两个语句块,分别是process1()和process2(),process1()和process2是并行执行的;

至于你的例子,需要把完整的代码贴上来看一下,因为虽然for循环里面的代码是顺序执行的,但是里面的变量会受到fork...join并行执行的影响,实际运行结果可能并不是你想的那样。

发表于 2021-9-21 18:20:39 | 显示全部楼层
我记得这个里面如果涉及到了automatic和static,区别一下子就出来了。
发表于 2021-9-21 19:46:43 | 显示全部楼层
从代码结构看:for循环内部按照顺序执行,而在外部加入fork join则意味着有n个for循环内部的逻辑,并行执行,且都执行完后才能退出。
有两个疑问:
1.在for循环内部是否调用别的task;
2.在for循环内部是否声明automatic类型的变量用来传递参数。
至于不加入fork join的原因是因为for循环内部的逻辑在 顺序执行,但是因为逻辑的一些原因,在打印之前又执行的别的逻辑,导致第一个for循环执行到valid拉高的打印延长,所以导致打印时间对不上
发表于 2021-9-22 11:05:06 | 显示全部楼层


eextw6 发表于 2021-9-8 14:32
在我上面fork join里面的for循环是顺序执行的吧,加不加fork是有什么影响呢?
...


fork join里的for并不是单线程,他已经全部展开了,你仔细看一下绿皮书有关线程的控制就知道了。
 楼主| 发表于 2021-9-23 10:32:29 | 显示全部楼层


jinjiahao 发表于 2021-9-22 11:05
fork join里的for并不是单线程,他已经全部展开了,你仔细看一下绿皮书有关线程的控制就知道了。
...


不是单线程吗?绿皮书上没有我这种fork join包for循环的,但是看到的180页那个例子,认为在一个begin end里就是按顺序执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-5-7 15:12 , Processed in 0.040146 second(s), 7 queries , Gzip On, Redis On.

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