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

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

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 936|回复: 12

[求助] sv中fork...join_none

[复制链接]
发表于 2025-3-8 10:57:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 xiuxing056 于 2025-3-8 19:23 编辑

fork

      while (1) begin
             do_response();
      end
join_none
le_conn_op.transcieve(this);
wait(p_sequencer.vif.int);

如上,transcieve执行完成后, 任务do_response就不再执行了,导致中断不能清掉,什么原因?
下面这种写法又可以。

fork

      while (1) begin
             do_response();
      end
     le_conn_op.transcieve(this);
join_any
wait(p_sequencer.vif.int);

发表于 2025-3-8 16:11:59 | 显示全部楼层
你下面这种写法,fork-join_none中是串行执行的,le_conn_op.transcieve(this)都执行不到吧
发表于 2025-3-8 16:13:16 | 显示全部楼层
你下面这段代码,fork-join_none中是串行执行的,le_conn_op.transcieve(this)这句都执行不到吧?一直在做while(1)中的动作。
 楼主| 发表于 2025-3-8 19:23:17 | 显示全部楼层
第二种写法用的是fork join_any,不是fork join_none
 楼主| 发表于 2025-3-9 10:16:24 | 显示全部楼层


Xunuoo 发表于 2025-3-8 16:11
你下面这种写法,fork-join_none中是串行执行的,le_conn_op.transcieve(this)都执行不到吧 ...


可以的,是和while并行执行的
发表于 2025-3-9 10:19:21 | 显示全部楼层


xiuxing056 发表于 2025-3-8 19:23
第二种写法用的是fork join_any,不是fork join_none


抱歉,看错了。

第二段能够成功满足你要求的原因是,fork-join_any中任意一个子任务完成之后,程序就不会block在fork-join_any了,而是会继续往下执行,但是原来没有完成成的子任务不会被终止,而是会继续在后台运行
至于第一段程序为啥在你le_conn_op.transcieve(this)执行完后while(1)中的进程被kill,我也感到很疑惑,是不是你在transcieve()中做了什么特殊处理?
如果问题有解了,麻烦告知我一下,谢谢
发表于 2025-3-10 08:45:29 | 显示全部楼层
fork
   begin
      while (1) begin
             do_response();
      end
   end
join_none
le_conn_op.transcieve(this);
wait(p_sequencer.vif.int);

这样试过吗?
 楼主| 发表于 2025-3-10 21:44:10 | 显示全部楼层


daviehj 发表于 2025-3-10 08:45
fork
   begin
      while (1) begin


没试过,但这个应该是一样的,while块就是顺序执行的
发表于 2025-3-10 22:47:26 | 显示全部楼层
fork join_none的执行逻辑并不是先开启fork join中的线程,再执行下面的内容,而是先跳过fork join中的task,执行下面内容的同时再执行frok中的内容。所以我怀疑是不是你的transcieve中有某个状态触发导致do_response中没有捕捉到,从而无法触发中断。你可以试试下面这段代码
ork

      while (1) begin
             do_response();
      end
join_none
#1ns;
le_conn_op.transcieve(this);
wait(p_sequencer.vif.int);
发表于 2025-3-10 22:57:08 | 显示全部楼层
fork join_none的执行逻辑是开辟一个线程,先执行fork join下面的程序,同时再执行fork join中的程序,我怀疑是你 do_response()中有监测transcieve的内容,而你这种写法是先执行的transcieve,后执行的do_response(),所以可能出错。建议在fork join_none下面加一个延时验证一下是否是这个问题导致。
fork

      while (1) begin
             do_response();
      end
join_none
#1ns;
le_conn_op.transcieve(this);
wait(p_sequencer.vif.int);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2025-4-16 23:27 , Processed in 0.025597 second(s), 8 queries , Gzip On, MemCached On.

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