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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9755|回复: 18

[求助] 我觉得UVM1.1中的官方给的例子代码中有缺陷,请高手指教。

[复制链接]
发表于 2012-12-28 16:30:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 qinzongqing 于 2012-12-28 16:38 编辑

12.jpg

上图是官方代码
描述如下:官方代码是先写了sigs.drvClk.din[tr.sa]<=tr.da 再写 @(sigs.drvClk);也就是等待时钟写在后面。而官方代码没有出现问题,是因为碰巧在执行send函数前 别的操作有时钟上升沿到来,也就是说,官方代码没有出错,是因为运行时碰巧是如下的情况。也就是sigs.drvClk.din[tr.sa]<=tr.da之前有了若干个@(sigs.drvClk)。要是让send第一时间就工作,一个数据就丢失了,我感觉官方的代码是碰巧没有出问题而已。

实际工作时相当于这么回事

实际工作时相当于这么回事


我的结论:我认为同步驱动数据时  应该先写@(sigs.drvClk),也就是如下所示

我认为平时应这么写

我认为平时应这么写
请大家指教!官方代码按理说应该没有缺陷啊。。。纠结了很多天,但是我还是想知道官方这种代码到底有没有问题。大家平时在同步驱动数据时是怎么做的呢? 请指教~~~谢谢~~~
发表于 2012-12-28 20:29:56 | 显示全部楼层
初始化时丢几个数据没什么大不了。
 楼主| 发表于 2012-12-28 21:47:37 | 显示全部楼层
synopsys 竟然会出这样的示范代码..............
发表于 2012-12-29 00:31:42 | 显示全部楼层
本帖最后由 baddy2323 于 2012-12-29 00:32 编辑

回复 1# qinzongqing


    向DUT驱动数据时采用你给的方式,而从接口总线接收数据时,类似上述官方所给代码,相同的问题,在for或foreahc循环前会比预期的多一个时钟周期。
发表于 2012-12-31 10:20:55 | 显示全部楼层
sigs.drvClk.din[tr.sa]<=tr.da
用了clocking block,本来就是同步驱动的。数据是在时钟沿之后被驱动到信号上
发表于 2012-12-31 13:01:08 | 显示全部楼层
同意5#, 代码中即使没有显式等待时钟沿,数据也会等到下一个有效时钟沿才赋值。
发表于 2012-12-31 15:01:32 | 显示全部楼层
没有问题啊。这个你要看看DUT是什么行为才行,有些是先等一个时钟,有些是出了数据要打一拍。
怎么会有错呢?
 楼主| 发表于 2013-1-2 11:12:40 | 显示全部楼层
回复 5# swxu





  1. program test(router_io.TEST io);  
  2.         initial begin
  3.                 io.drvClk.din<=16'h2;
  4.                 @(io.drvClk);   //假如这句没有
  5.                
  6.                 io.drvClk.din<=16'h4;
  7.                 @(io.drvClk);   //假如这句没有
  8.                
  9.                 io.drvClk.din<=16'h7;
  10.                 @(io.drvClk);   //假如这句没有
  11.                     
  12.                 io.drvClk.din<=16'h9;
  13.                 @(io.drvClk);   //假如这句没有

  14.                 #50 $finish;
  15.        
  16.         end
  17. endprogram: test


复制代码

    但是 要是去掉上面代码中的@(io.drvClk);   那么只有最后io.drvClk.din<=16'h9;执行了,其余的没有机会驱动数据。。。我在这一块内容纠结好久了。。。 真想搞得清楚点,要不我自己写的代码 都不知道到底怎么运行。。。求解啊~~~谢谢大家~~~
 楼主| 发表于 2013-1-2 11:41:29 | 显示全部楼层
回复 8# qinzongqing


   PS :   所以6楼“代码中即使没有显式等待时钟沿,数据也会等到下一个有效时钟沿才赋值。”应该不成立吧?
发表于 2013-1-5 16:53:30 | 显示全部楼层
回复 8# qinzongqing

你的代码中,没有@(io.drvClk)的话,仿真一开始,所有的赋值都会在第一个时钟沿后起效,结果当然是最后一句覆盖前面所有的。

要推动仿真时间前进,肯定要靠@(io.drvClk)。
clokcing block的作用就是,在bench中,在一个时钟上升沿之前对信号作了驱动,该值只有等到时钟上升沿才到达DUT
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-27 23:43 , Processed in 0.032015 second(s), 9 queries , Gzip On, Redis On.

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