加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

fork...join在验证中的用法

(2012-01-18 15:30:43)
标签:

fork

join

systemverilog

杂谈

分类: Dreamywork
  • 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
    

     

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

    选项
    描述
    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("
    ", k);
                begin
                    automatic int m = j; // m的值是不确定的
                    ... 
    
                                end 
    
            join_none
    

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有