微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 我觉得UVM1.1中的官方给的例子代码中有缺陷,请高手指教。

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

时间:10-02 整理:3721RD 点击:




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



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

请大家指教!官方代码按理说应该没有缺陷啊。纠结了很多天,但是我还是想知道官方这种代码到底有没有问题。大家平时在同步驱动数据时是怎么做的呢? 请指教~谢谢~

初始化时丢几个数据没什么大不了。

synopsys 竟然会出这样的示范代码..............

向DUT驱动数据时采用你给的方式,而从接口总线接收数据时,类似上述官方所给代码,相同的问题,在for或foreahc循环前会比预期的多一个时钟周期。

sigs.drvClk.din[tr.sa]<=tr.da
用了clocking block,本来就是同步驱动的。数据是在时钟沿之后被驱动到信号上

同意5#, 代码中即使没有显式等待时钟沿,数据也会等到下一个有效时钟沿才赋值。

没有问题啊。这个你要看看DUT是什么行为才行,有些是先等一个时钟,有些是出了数据要打一拍。
怎么会有错呢?

  1. program test(router_io.TEST io);
  2. initial begin
  3. io.drvClk.din<=16'h2;
  4. @(io.drvClk);//假如这句没有

  5. io.drvClk.din<=16'h4;
  6. @(io.drvClk);//假如这句没有

  7. io.drvClk.din<=16'h7;
  8. @(io.drvClk);//假如这句没有

  9. io.drvClk.din<=16'h9;
  10. @(io.drvClk);//假如这句没有

  11. #50 $finish;

  12. end
  13. endprogram: test

复制代码


但是 要是去掉上面代码中的@(io.drvClk);那么只有最后io.drvClk.din<=16'h9;执行了,其余的没有机会驱动数据。我在这一块内容纠结好久了。 真想搞得清楚点,要不我自己写的代码 都不知道到底怎么运行。求解啊~谢谢大家~

PS :所以6楼“代码中即使没有显式等待时钟沿,数据也会等到下一个有效时钟沿才赋值。”应该不成立吧?

你的代码中,没有@(io.drvClk)的话,仿真一开始,所有的赋值都会在第一个时钟沿后起效,结果当然是最后一句覆盖前面所有的。
要推动仿真时间前进,肯定要靠@(io.drvClk)。
clokcing block的作用就是,在bench中,在一个时钟上升沿之前对信号作了驱动,该值只有等到时钟上升沿才到达DUT

在用vcs仿真的时候,数据一定会在时钟后给出的。
io.drvClk.din<=16'h2;
04.@(io.drvClk);
06.io.drvClk.din<=16'h4;
07.@(io.drvClk);//假如这句没有
io.drvClk.din<=16'h2;你应该是拿不到这个数据的

这个例子从哪来的,能不能给个附件

要是像你那么理解去改变顺序的话仿真会死掉的,这个顺序是对的,不信你自己试试

好好看看时钟块的概念

都在UVM了,落后了!

您好,能把这个官方的实例代码传一份给我妈

说的很对,学习了...

的确有问题。

小编,你好,请问官方代码爱哪里有下载呢?抑或是能否传我一份,多谢了。guikunkun@126.com

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top