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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: eextw6

[求助] fork join问题

[复制链接]
 楼主| 发表于 2021-9-23 10:44:41 | 显示全部楼层


mioyo 发表于 2021-9-21 19:46
从代码结构看:for循环内部按照顺序执行,而在外部加入fork join则意味着有n个for循环内部的逻辑,并行执行 ...


1、for循环里有调用task。
2、没有用automatic。

在加入fork join之后for循环内部已经不是顺序执行了吗?如果是的话,那这点就是我根本上的理解错误。。以为只要是在begin end内就都是顺序执行了。
那就算是顺序执行,执行到打印的时刻,前面的逻辑应该执行完毕了吧。在valid拉高后,还可以执行别的逻辑吗? 这个又是个根本上的理解错误吗?
发表于 2021-9-23 11:59:24 | 显示全部楼层


eextw6 发表于 2021-9-23 10:32
不是单线程吗?绿皮书上没有我这种fork join包for循环的,但是看到的180页那个例子,认为在一个begin end ...


183页,7.1.4例7.7
发表于 2021-9-23 13:23:27 | 显示全部楼层
本帖最后由 jinjiahao 于 2021-9-23 13:37 编辑


eextw6 发表于 2021-9-23 10:32
不是单线程吗?绿皮书上没有我这种fork join包for循环的,但是看到的180页那个例子,认为在一个begin end ...


fork
begin  xxxxxxx;
  zzzzzzz;

end

begin
  yyyyy;
end
join
这样xxxxx,zzzzz是顺序执行的,他们和yyyyy是并行。


但是你的for循环外面,并没有begin end来包括你for循环。
因此你的for循环是好几个并行的线程。


你在for循环外面加上begin end就是顺序执行了:
if(***)begin
    fork
        begin  //for 循环线程
        for(****)begin
            ........
            ........
            ........         end  
         end
     
         begin // 打印的线程
            if(valid)
                $display("The time is %t",$realtime);
         end
     
    join
end

这样for和打印的两个线程是并行的,既可以在valid为1时,及时打印;for循环也是按自己顺序在执行。




 楼主| 发表于 2021-9-24 10:08:27 | 显示全部楼层


jinjiahao 发表于 2021-9-23 13:23
fork
begin  xxxxxxx;
  zzzzzzz;


感谢回复!
在写法上,以后可以按你在13楼的回复中理解写代码。
回到我最初的提问里(代码依旧如下),我当时的打印语句是写在for循环里的。对于下面的代码,如果在for前后加上begin end(此代码没加),可以直接理解for内部顺序执行。如果按照下面代码执行,那for内部是并行执行吗?

if(***)begin
    fork
        for(****)begin
            aaaaaa
            bbbbbb
            cccccc
            if(valid)
                $display("The time is %t",$realtime);
        end
    join
end
发表于 2022-2-5 23:33:13 | 显示全部楼层
very good
发表于 2022-2-6 20:15:02 | 显示全部楼层


jinjiahao 发表于 2021-9-23 13:23
fork
begin  xxxxxxx;
  zzzzzzz;


正解
发表于 2022-2-7 11:26:13 来自手机 | 显示全部楼层
本帖最后由 eaglezhang01 于 2022-2-7 11:28 编辑

这个问题不贴出完整代码和log我都不相信会这样,就目前看到的结构,加了fork join和不加for循环里的代码都要顺序执行完才会执行下面的代码,上面有人说for循环里的代码是并行执行的说法是错误的,其实好的代码风格fork join里还是要用begin end来组织代码
发表于 2022-2-10 16:26:34 | 显示全部楼层


eaglezhang01 发表于 2022-2-7 11:26
这个问题不贴出完整代码和log我都不相信会这样,就目前看到的结构,加了fork join和不加for循环里的代码都 ...


实验过后确实for循环不会因为fork join 而展开并行执行,还是顺序执行的
发表于 2022-2-10 17:12:58 | 显示全部楼层


芝麻蚕豆 发表于 2022-2-10 16:26
实验过后确实for循环不会因为fork join 而展开并行执行,还是顺序执行的


看写法,正常的for循环在fork join里面就是一个线程,是顺序执行,当然也可以展开,在fork join里面套一个fork join_none就可以了,就是一个线程里面展开了多个子线程
发表于 2022-2-18 16:31:21 | 显示全部楼层
如果包着fork的if语句只被执行一次,就不会有区别,如果这个if语句被多次执行,那么会产生多个包含for的子线程,可能就会有问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-12 00:43 , Processed in 0.027074 second(s), 6 queries , Gzip On, Redis On.

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