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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8653|回复: 21

[求助] SV笔试问题,如何提前结束fork-join?

[复制链接]
发表于 2020-8-16 12:49:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
小弟前两天参加了晶晨科技秋招笔试,有个SV语法的笔试题一直没搞明白。

现在有定义好的三个子线程do1,do2,do3,在task中并行运行这三个子线程,其中只要有任何一个线程结束,都退出并行运行块,并打印DONE。要求分别用fork-join、fork-join_any,fork-join_none来实现。

我只知道用fork-join_any,如何用其他两个来实现,实在是想不到。故在此提问,望各位前辈不吝赐教!

试着用fork-Join写了一下,不知是否正确。





  1. task test;
  2.   bit ok1='b0,ok2='b0,ok3='b0;
  3.   fork
  4.     begin
  5.       do1();
  6.       ok1='b1;
  7.     end
  8.     begin
  9.       do2();
  10.       ok3='b1;
  11.     end
  12.     begin
  13.       do3();
  14.       ok3='b1;
  15.     end
  16.   join
  17.   if(ok1|ok2|ok3)  disable fork;


复制代码


 楼主| 发表于 2020-8-16 12:50:59 | 显示全部楼层
不知道为何代码只显示了一部分。。但也能体现思想了
 楼主| 发表于 2020-8-16 12:56:54 | 显示全部楼层
我发现了一个问题,17行的if语句应该写在,jork-join里面
 楼主| 发表于 2020-8-16 13:00:42 | 显示全部楼层
而且,我想到一个取巧的办法,就是在fork-join里面嵌套一个fok-join_any,不就实现了功能了吗?
然后在fork-join_none里,嵌套个fork-join_any,然后在外面用个wait fork,再打印信息,是不是也可以了?
哈哈,机智呀。有更好的办法吗?
发表于 2020-8-16 19:39:58 | 显示全部楼层
task test();
  fork : tag
    begin
      sub1();
      disable tag;
    end
    begin
      sub2();
      disable tag;
    end
    begin
      sub3();
      disable tag;
    end
  join
  $display("done");
endtask : test

task test();
  fork:tag
    sub1();
    sub2();
    sub3();
  join_any
  disable tag;
  $display("done");
endtask : test

task test();
  event e;
  fork : tag
    begin
      sub1();
      -> e;
    end
    begin
      sub2();
      -> e;
    end
    begin
      sub3();
      -> e;
    end
  join_none
  @ e;
  disable tag;
  $display("done");
endtask : test
发表于 2020-8-17 10:59:55 来自手机 | 显示全部楼层
把fork放begin…end中,begin…end中创建process实例,fork的某个子进程结束,那么就将process kill掉。
发表于 2020-8-17 11:29:52 | 显示全部楼层
2l正解
 楼主| 发表于 2020-8-21 09:49:52 | 显示全部楼层


空白MAX 发表于 2020-8-16 19:39
task test();
  fork : tag
    begin


妙啊!感觉我还不能灵活运用
发表于 2020-8-25 09:51:06 | 显示全部楼层
参考书中的多线程这一章节以及sv std相关章节,简单总结如下:
1,使用disable fork,简单直接,缺点是会误伤到同名线程(当前线程的名字);
2,使用disable label,这个label是各个线程的名字(或task名),简单直接,缺点也是会误伤到同名线程(label名);
3,使用process类,简单好用,不会误伤到同名的线程,推荐使用;
上述结束线程的方式,2和3可用于很多地方,不限于fork中;

题中要求分别用fork-join、fork-join_any,fork-join_none来实现,是在考这三种线程的区别,但是工作中,更加容易犯的错误是不合理的disable。
发表于 2020-8-27 10:25:53 | 显示全部楼层


精武英雄 发表于 2020-8-25 09:51
参考书中的多线程这一章节以及sv std相关章节,简单总结如下:
1,使用disable fork,简单直接,缺点是会误 ...


学习了  一直只用disable
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-14 11:53 , Processed in 0.029783 second(s), 8 queries , Gzip On, Redis On.

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