返回介绍

9.6 fork...join

发布于 2020-09-09 22:55:48 字数 2081 浏览 1006 评论 0 收藏 0

fork...join能够从它的每一个并行语句中产生并发进程。

fork...join块的声明语法如下:

par_block ::=          // 引用自附录A.6.3
    fork [: block_identifier] {block_item_declaration} {statement_or_null}
    join_keyword [: block_identifier]

join_keyword ::= join | join_any | join_none

语法 9-1—Fork...join块语法(摘录自附录A)

fork...join块可以指定一条或多条语句,每一条语句都应该作为并发进程执行。Verilog fork...join块总是引起执行fork语句的进程阻塞直到所有分支进程中止。通过加入join_any和join_none关键字,SystemVerilog提供了三种选择来指定父进程何时恢复执行。

表 9-1: fork...join控制选项

选项描述
join父进程会阻塞直到这个分支产生的所有进程结束。
join_any父进程会阻塞直到这个分支产生的任意一个进程结束。
join_none父进程会继续与这个分支产生的所有进程并发执行。在父线程执行一条阻塞语句之前,产生的进程不会启动执行。

在定义一个fork...join块的时候,将整个分叉封装在一个begin...end块中会引起整个块作为单个进程执行,其中每条语句顺序地执行。

fork
    begin
        statement1; // 一个带有2条语句的进程
        statement2;
    end
join

在下面的例子中,包含两个进程分支,第一个等待20ns,第二个等待命名事件eventA被触发。因为指定了join关键字,父进程应该阻塞直到这两个进程结束;也就是说,直到过了20ns并且eventA被触发。

fork
    begin
        $display("First Block\n");
        #20ns;
    end
    begin
        $display("Second Block\n");
        @eventA;
    end
join

在一个fork...join语句的关联文中使用return语句是非法的,并且会导致一个编译错误。例如:

task wait_20;
    fork
        #20;
        return; // 非法的:不能返回;任务位于另外一个进程中
    join_none
endtask

只要fork...join块作用范围内声明的自动变量进入它们的作用范围,在产生任何进程之前,这些自动变量应该被初始化成它们的初始值。这些变量对于循环结构产生的进程存储唯一的、每次都交互的数据非常有用。例如:

initial
    for(int j = 1; j <= 3; ++j)
        fork
            automatic int k = j;     // 对每一个j值的本地拷贝
            #k $write("%0d", k);
            begin
                automatic int m = j; // m的值是不确定的
                ...
            end
        join_none

上面的例子的输出为:123。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文