SystemVerilog语言中fork...join/join_any/join_none的区别

在很多的分支并行结构中,常常用到fork...join的结构。

简单说,fork...join/join_any/join_none结构用作并发执行,阻塞父进程的执行,直到子进程执行完毕。

用于区分begin...end语句的顺序执行:

1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块

2)用fork_join语句,通常用来标识并行执行的语句,用它标识的块称作并行块


三种并发类型


1. fork...join

            fork // $(0s)

                a; // (need 5s)

                b; // (need 2s)

                c; // (need 3s)

            join

            d; // $(5s)

当运行到fork处时,a、b、c三条子线程将会同时开启,直到三条线程都运行完毕,d语句才会开始执行,通常在此处取决于子线程中时间最长的那条。

2. fork...join_any

            fork // $(0s)

                a; // (need 5s)

                b; // (need 2s)

                c; // (need 3s)

            join_any

            d; // $(2s)

当运行到fork处时,a、b、c三条子线程同时开启,但d语句的开启,将会取决于a、b、c中运行时间最短的那条。且a与c会自行继续运行,直到执行完毕。

3. fork...join_none

            fork // $(0s)

                a; // (need 5s)

                b; // (need 2s)

                c; // (need 3s)

            join_none

            d; // $(0s)

当运行到fork处时,a、b、c三条子线程将与d语句同时开启,也就是说fork...join_none只起到了点火的作用,将线程开启而不占用时间。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容