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

systemverilog终止多线程

(2011-12-21 20:25:48)
标签:

fork..join

disable

fork

systemverilog

thread

interprocess

it

分类: systemverilog

因为在调试代码的时候发现,一个含有多线程的task任务无论如何也不返回。而原代码系统的庞大难以debug,不得不写了下面一段代码debug。

`timescale 1ns/1ns

class thread;

    task debug(int id);

    int TDI;

    int TMS;

    bit TCK;

    $display("@%0t:start fork..join example of instance %d",$time,id);

    fork:thread//线程0

    begin//线程1

      while(1)begin

        #10;

        TDI=TDI+1;

        $display("@%0t:thread 1,the value of TDI is %d of instance %d",$time,TDI,id);

      end

    end

    begin//线程2

      TMS=0;

      TCK=0;

      TDI=0;

      wait(TDI==10);

      disable fork;//

      $display("disable instance %d&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",id);

      $display("@%0t:thread 2",$time);

    end

    begin//线程3

      forever begin

        #10;

        TCK=~TCK;

        $display("@%0t:thread 3 of instance %d",$time,id);

      end

    end

    join_any

    //disable thread;

  endtask

endclass

program test;

  initial begin

    thread t;

    for(int i=0;i<10;i++)

    begin

      t=new();

      $display("loop %d started***************************",i);

      t.debug(i);

      $display("loop %d stopped***************************",i);

    end

  end

endprogram

通过debug发现,有些线程没有终止导致task不能返回,有些task已经返回了但是仍有些不期望的线程仍在执行 。

task中的fork...join语句开启了三个线程。线程1,2,3属于线程0的衍生线程。disable fork能够终止当前线程及从当前线程中衍生出来的所有子线程。当task被调用后,线程1,2,3同时执行,当TDI==10时,disable fork得以执行,终止线程2,但是线程1和3仍然在执行。由于线程0是fork…join_any语句,线程2结束后,线程0也结束,task返回。但是,当task下次被调用的时候,上一个task开启的线程1和3仍然在执行。

如果将线程0改用fork…join语句,我们就会发现,task根本不会返回。因为线程1和3没有终止。

另一种终止线程的方法是采用fork…join_any disable label;当fork…join_any的某个衍生线程执行完毕后,会接着执行fork…join_any下面的语句disable label从而可将fork…join_any的所有衍生线程也给终止。

0

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

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

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

新浪公司 版权所有