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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3311|回复: 6

[求助] 为什么repeat中的执行不是顺序执行的呢?

[复制链接]
发表于 2013-7-29 17:41:57 | 显示全部楼层 |阅读模式

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

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

x
err.png

这是在systemverilog for verification这本书上看到的。其中Transaction为定义的class。书上说,在执行repeat的过程中,如果transmit这个task会执行几个周期,那么这个过程中,addr的值实际上是会变的。如下图所示。

@.png


但是repeat中不是顺序执行的吗?为什么会出现这种冲突现象呢?
发表于 2013-7-30 15:14:04 | 显示全部楼层
"The bug becomes visible when transmit spawns off a thread", 也就是说 task transmit里会用 fork--join_none并发一个线程来执行发送动作,因此generator_bad中的repeat(n)会在同一时刻执行完毕,而所产生的n个transmit线程在随后时刻其实在发送同一个Transaction对象。如果你能保证transmit在完成整个发送动作,同时其它对象,特别是checker,monitor等也完成了对t的处理后才会退出的话,那么generator_bad的写法也可以接受。但明显这一点是很难保证的。
 楼主| 发表于 2013-8-8 16:43:04 | 显示全部楼层
回复 2# nativeda


   您好,不是特别明白你的解释。你的意思是说因为transmit里面定义的语句都是fork_join的,所以会同时产生n个线程吗?但是repeat里面的三个语句是顺序的。也就是说,第三局transmit是在前两句执行完了之后才能执行的。同时,也只有transmit执行完了之后才会回到repeat头部执行random函数的吧。那这样的话,transmit中是并行还是顺序执行应该没有影响吧。
发表于 2013-8-8 17:00:51 | 显示全部楼层
这么理解吧,如果transmit有时间消耗如几个系统时钟,这段代码的确会显示n个addr,但是实际上传送给DUT的地址值可能只有一个(前边的地址被后边的地址覆盖了),因此最好在repeat创建transaction对象
 楼主| 发表于 2013-8-8 17:44:11 | 显示全部楼层
回复 4# zhuyi1234567899


   不是很看懂您的解释。我是这样理解的。每次repeat的时候,t的addr都会被randomize一下,那么transmit就会传递不同的值呀。
发表于 2013-8-9 12:52:41 | 显示全部楼层
值是传递出去了,但是DUT收到的呢?
发表于 2013-8-9 12:55:01 | 显示全部楼层
具体写代码看看结果不就知道了,这种错误我也放过,后来想想是需要传递不同的transaction而不是同一个transaction的不同内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-19 04:50 , Processed in 0.022368 second(s), 9 queries , Gzip On, Redis On.

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