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

标题: 《UVM实战》24小时问答 [打印本页]

作者: doogo    时间: 2014-9-11 16:15
标题: 《UVM实战》24小时问答
本帖最后由 doogo 于 2014-9-19 17:51 编辑

大家好,《UVM1.1应用指南及源代码解析》在经过大量修改后,已经出版了。新书的名字是《UVM实战》。开这个帖子,一方面是想向大家说明一下新书相比于《UVM1.1应用指南及源代码解析》有哪些更新;另外一方面是提供一个交流UVM使用心得的平台,在这个平台上,大家可以提出各种各样的问题,这些问题包括但不限于:

对于这些问题,我会在24小时之内回复。对于第二类和第三类问题,由于UVM博大精深,同时验证这个领域实在是太大,我也无法做到全知全能,只能做到尽量回复。广大网友们可以贡献自己的一份力量,总之大家互相学习,共同进步。



新书介绍
最近三年以来,有大量读者给我发过邮件。我尽量全部回复,但是有一些因为各种各样的原因没能及时回复,向这部分读者致歉!在给我发来邮件的众多读者中,有相当一部分指出了《UVM1.1应用指南及源代码解析》中存在的大量的笔误,在这里向这些读者表示感谢,由于数量众多,这里不一一列举。

《UVM1.1应用指南及源代码解析》中分为明显的前后两部分,前9章讲述了如何使用UVM,后10章讲述了UVM的源代码。在给我发来邮件的众多用户中,99%的都是只看前9章的。我最初的想法是与广大OVM/UVM用户分享读UVM源代码的心得,所以后10章是我花费大量精力写的,而前9章则是顺手而为。这造成了前9章太简单,同时里面问题较多,而后10章太难、太复杂,没有太多人关注。至于介于简单和复杂之间的那部分中等难度的内容,却没有在整本书中被覆盖。

与《UVM1.1应用指南及源代码解析》相比,新书做了如下更改:


1、增加了一些中等难度的内容,消除了《UVM1.1应用指南及源代码解析》中太简单内容与太复杂内容之间的空白。比如加入了大量工厂(factory)模式的内容,详细阐述了寄存器模型中的后门(BACKDOOR)访问等等。新增加的内容及例子几乎占据整本书的2/3篇幅。

2、在《UVM1.1应用指南及源代码解析》中,一开始就给出一个验证平台的例子,但是这个例子是以一个整体的形式呈现在读者面前,而没有说明白这个例子为什么会是这样,这好比从0直接跳到了1,中间没有任何过渡。而在这本书中,我把这个例子一步步的拆解,从0到0.1,再到0.2,一直慢慢增加到1。在每一步增加的时候,都尽量的说明白为什么会这么增加。这更加方便用户的学习。

3、书中的每一个例子都经过了验证,这些例子都能在本书附带大量的源代码中找到。用户可以下载这些源代码并在自己的电脑上运行它们,这会极大的提高学习的速度。


4、书中有一章专门讲述了从OVM到UVM的迁移。UVM是从OVM迁移来的,虽然很多公司现在使用的是UVM,但是由于一些历史遗留问题,在它们的代码库中依然有很多OVM式的、已经被UVM丢弃的用法。通过这一章的学习,用户可以迅速适应这些过时的用法。


( , 下载次数: 362 )

( , 下载次数: 332 )



示例下载
下面是新书中示例及UVM源代码的链接,它们也可以在华章图书的网站上下载到(不过根据有些读者反应,目前似乎有些问题,所以暂且使用下面的链接):
http://pan.baidu.com/s/1gd8CiOz

或者在这里下载:
( , 下载次数: 3881 )
作者: jerrycao    时间: 2014-9-11 16:29
great job !!!
作者: jerrycao    时间: 2014-9-11 16:32
一共有几卷呀? 看名字叫 UVM实战(卷1) . 是不是还有其它卷?
作者: allencherry    时间: 2014-9-11 16:41
写的不错,情况考虑的比较周到,CHIP系统级验证这块写有点少,芯片里面的接口信号如何传递给monitor等我就没有看明白。。。。。
作者: hymeng98    时间: 2014-9-11 18:09
亚马逊上已经下单了,还没送到。。
作者: guolehaohao    时间: 2014-9-11 20:22
恭禧您!已经购买,正在研读中...
作者: doogo    时间: 2014-9-12 08:18
后面可能会有卷二吧,不过卷二应该是研究性质的,类似于源代码分析。卷一里面已经包含了我想写的大部分内容。




   
一共有几卷呀? 看名字叫 UVM实战(卷1) . 是不是还有其它卷?
jerrycao 发表于 2014-9-11 16:32


作者: seabeam    时间: 2014-9-12 10:10
回复 7# doogo

写卷二的话加上1.2的新内容吧
作者: guantou    时间: 2014-9-12 12:47
希望写卷2的时候能在插图上下点功夫。现在的图基本上就是用visio画的,比较简陋,并且有些图没有完全表达出作者的意思。(既然是书,要求也要高一点,呵呵)

希望校审时也多注意些,有些语句和代码有笔误。



定价有点高了,希望卷2能合理些。
作者: qiang0204    时间: 2014-9-12 13:35


   
希望写卷2的时候能在插图上下点功夫。现在的图基本上就是用visio画的,比较简陋,并且有些图没有完全表达出 ...
guantou 发表于 2014-9-12 12:47




    非常好的建议,如果能指出一些细节就更好了。
作者: tmcb    时间: 2014-9-12 14:10
还是实战的例子太少,在工作中又不用这东西,自学比较难呀
作者: seabeam    时间: 2014-9-12 22:59
回复 1# doogo


    另外还有个问题,你的书里目录层级序号前有星号的是什么意思?
作者: doogo    时间: 2014-9-13 06:51
表示这一节的示例代码可以在本书代码包中找到。
在第8页2.2.1节的脚注里面已经注明


   
回复  doogo


    另外还有个问题,你的书里目录层级序号前有星号的是什么意思?
seabeam 发表于 2014-9-12 22:59


作者: arloha2003    时间: 2014-9-13 11:02
卷2大概預計何時出版?
作者: doogo    时间: 2014-9-14 09:47
本帖最后由 doogo 于 2014-9-15 10:11 编辑



   
卷2大概預計何時出版?
arloha2003 发表于 2014-9-13 11:02



还在计划中
作者: zq_proj    时间: 2014-9-14 10:51
是不是把电子版的章节拆成两部分了?所以才有卷一和卷二?
作者: oscillator_cn1    时间: 2014-9-15 09:57
为什么没了后面“源码分析”那部分。
作者: doogo    时间: 2014-9-15 10:12


   
是不是把电子版的章节拆成两部分了?所以才有卷一和卷二?
zq_proj 发表于 2014-9-14 10:51



严格来说,是把电子版的前9章拿来修改,增加了2/3的内容。
作者: doogo    时间: 2014-9-15 10:14


   
为什么没了后面“源码分析”那部分。
oscillator_cn1 发表于 2014-9-15 09:57



源码分析部分的目标用户太少,初期先把前9章拿出来,做了一下修改,同时增加了大量的内容。
作者: oscillator_cn1    时间: 2014-9-15 10:48
回复 19# doogo

可惜,我最想看的就是那部分了。
作者: duan_dzj    时间: 2014-9-15 15:27
学习学习。哈哈哈哈
作者: xiaocheng12345    时间: 2014-9-16 11:22
LZ可以再书中多写一些例子,毕竟理论还是要回归实践。在一个个例子中学才能学的更好,理解的更深刻。。
作者: xiaocheng12345    时间: 2014-9-16 11:41
以下单。。。很看好这本书。。。顺便问下LZ,知不知道哪有UVM的 AMBA总线的VIP??
作者: doogo    时间: 2014-9-16 18:09


   
LZ可以再书中多写一些例子,毕竟理论还是要回归实践。在一个个例子中学才能学的更好,理解的更深刻。。
xiaocheng12345 发表于 2014-9-16 11:22



感谢你的建议!
作者: doogo    时间: 2014-9-16 18:11


   
以下单。。。很看好这本书。。。顺便问下LZ,知不知道哪有UVM的 AMBA总线的VIP??
xiaocheng12345 发表于 2014-9-16 11:41



一般用这个协议的公司里面都会有的。但是一般的公司应该不会公开的。除非有组织或个人自己写好了,公布出来。
作者: xiaocheng12345    时间: 2014-9-17 14:25
谢谢,问个小问题,再看2.5.2节时,我想看看UVM里数据传递的波形,用dumpfile记录波形,出来了几个信号,除了CLK,其他信号不是高阻态就是不定态,这是什么原因?如果这个方法不行,有没其他方法可以用波形看到UVM内部数据传输?
作者: alex_leexiao    时间: 2014-9-17 17:39
http://pan.baidu.com/s/1gd8CiOz
作者: alex_leexiao    时间: 2014-9-17 17:39
good job```````````
作者: doogo    时间: 2014-9-17 20:16
本帖最后由 doogo 于 2014-9-17 20:21 编辑


   
谢谢,问个小问题,再看2.5.2节时,我想看看UVM里数据传递的波形,用dumpfile记录波形,出来了几个信号,除 ...
xiaocheng12345 发表于 2014-9-17 14:25



1. 你使用的是本书示例包(在首页有下载地址)中的代码吗?
2. 这个跟仿真工具相关的。questa的最新的visualizer可以看class内部的信号波形(可能这个工具还没上市,目前似乎只是beta版)。
作者: 飞扬紫百合    时间: 2014-9-17 21:24
3.3.4 filed automation中的宏与if的结合:

这一节中内容感觉和标题不搭啊
作者: iooiniu    时间: 2014-9-17 22:13
doogo 哥发现个小问题,应该是书中的笔误: P119 代码清单 4-27中 29行 A_inst.A_export.connect(B_inst.b_imp);
应该为A_inst.A_port.connect(B_inst.b_imp); 吧   A的端口是port类型的
作者: iooiniu    时间: 2014-9-17 22:19
再问个问题: begin_tr和end_tr是不是用来自己对原来的transaction进行处理,用来自己重新组合一个新的transaction啊? 这里看你之前的代码分析指南 实在没看懂,能给简单解释下么?
作者: xiaocheng12345    时间: 2014-9-18 09:04
回复 29# doogo

是的,现在指导
作者: xiaocheng12345    时间: 2014-9-18 09:05
回复 33# xiaocheng12345


   谢谢指导
作者: grow    时间: 2014-9-18 09:08
感谢楼主提供的好书
感谢楼主的无私奉献
作者: doogo    时间: 2014-9-18 09:58


   
3.3.4 filed automation中的宏与if的结合:

这一节中内容感觉和标题不搭啊
飞扬紫百合 发表于 2014-9-17 21:24



这位同学觉得什么样的标题比较好呢?
作者: doogo    时间: 2014-9-18 10:02


   
doogo 哥发现个小问题,应该是书中的笔误: P119 代码清单 4-27中 29行 A_inst.A_export.connect(B_inst.b_ ...
iooiniu 发表于 2014-9-17 22:13



这个确实是的,感谢你指出问题。本书的示例包中的代码是正确的。
作者: doogo    时间: 2014-9-18 10:15


   
再问个问题: begin_tr和end_tr是不是用来自己对原来的transaction进行处理,用来自己重新组合一个新的tran ...
iooiniu 发表于 2014-9-17 22:19

不是。
这两个函数只是用于记录一些内部使用的信息而已,对整体的影响不大,不必研究的太深入。
作者: jjww110    时间: 2014-9-18 15:35
已经买了,感觉不错!!
作者: doogo    时间: 2014-9-18 16:05


   
已经买了,感觉不错!!
jjww110 发表于 2014-9-18 15:35



欢迎阅读后提出意见!
作者: silencefpga    时间: 2014-9-18 17:14
感谢楼主,由于出差事情相对较少,买了本,内容不错,正在学习....
作者: dou124    时间: 2014-9-18 21:38
看了你的书,收获比较多,我觉得最好能够有个功能简单的DUT,然后围绕这个DUT使用UVM搞一个平台,这样大家在看过书之后,再看代码,理解得会更加深刻一些,感谢祝贺张博出书。
作者: 飞扬紫百合    时间: 2014-9-19 07:36
回复 36# doogo


    把这个小结的内容融合到介绍uvm-transaction那节里面;

另外请教一个问题,ref-model 派生component和object有啥不同,仅仅是component和object的本身不同还是用法上有啥不同?我是一直用object的。
作者: pwy122    时间: 2014-9-19 09:41
买过了,迫不及待想拜读
作者: doogo    时间: 2014-9-19 10:23


   
看了你的书,收获比较多,我觉得最好能够有个功能简单的DUT,然后围绕这个DUT使用UVM搞一个平台,这样大家在 ...
dou124 发表于 2014-9-18 21:38



这本书里面的那个MAC的例子基本上就是一个典型的DUT了。一组数据输入端口,再做些处理,然后一组数据输出端口。这其中的“再做些处理”就是reference model。书中只是简单的把输入的transaction复制一份,然后再发出去。当然了,或许这个DUT有些过于简单了。
作者: doogo    时间: 2014-9-19 10:29


   
回复  doogo


    把这个小结的内容融合到介绍uvm-transaction那节里面;

另外请教一个问题,ref-m ...
飞扬紫百合 发表于 2014-9-19 07:36



谢谢你的建议。


1. 如果派生自Object,那么reference model中的进程需要手工启动。但是如果派生自component,那么其main_phase等可以自动执行。
2. 由于可能要对reference model配置一些参数,通常来说,config_db比较常用于component的build_phase。
3. 一般人都习惯于使用component,这样后面的人如果接手你的验证环境会比较方便。


当然了,派生自object也不是那么不可接受的事情。自己习惯,同时又不影响其它人就好。
作者: soelife    时间: 2014-9-19 11:03
准备买一本来学习
作者: leonardo_z    时间: 2014-9-19 11:05
书已到,正在学。 能否把代码上传,公司网络访问不了 网盘。
作者: estshooter    时间: 2014-9-19 15:39
之前读过张强的《UVM1.1实践与源代码分析》电子版,受益颇深。现在看到这本书正式出版真是可喜可贺!
在此也想请教几个具体应用中遇到的问题:
1.在用基于UVM RAL的验证环境时,如果在2个并行sequence(基于uvm_reg_sequence)中同时读写某个block(基于uvm_reg_block)的同一个register(基于uvm_reg)时,由于每个register对应的samphone只有唯一的key,某个sequence的读写操作get到key但是又没有完成的话,另一个sequence(优先级比前面所述的sequence高)就没法get到key了,从而会造成死锁。请问这种情况要怎么解决?
2.如果需要通过sequence来控制slave agent的响应,由于slave agent是被动的(master agent是主动的),需要slave driver采集到相应的命令信息才能给出合理的响应。但如果driver已经采集到命令信息再通过sequencer传给sequence的话,这个时候命令phase已经结束了,那么与命令phase相关的响应信息(比如命令接收ack需要delay随机cycle)就没办法通过sequence来控制了。怎样做才能让slave sequence既能控制命令phase,又能控制数据phase的响应?
3.在用基于UVM RAL的验证环境时,如果有多个master(在验证环境中用某几个master agent的driver来模拟)可以访问某个block(基于uvm_reg_block)的寄存器,是否应该在block中create多个map(基于uvm_reg_map),每个map对应一个master且通过set_sequencer设置其对应的sequencer和adapter?(因为如果只用default_map的话,调用其set_sequencer函数就只能选择某一个master及其对应的sequencer和adapter了)

期待能得到指教,谢谢!
作者: doogo    时间: 2014-9-19 17:52


   
书已到,正在学。 能否把代码上传,公司网络访问不了 网盘。
leonardo_z 发表于 2014-9-19 11:05



已经上传到首页。
作者: doogo    时间: 2014-9-19 18:06


   
之前读过张强的《UVM1.1实践与源代码分析》电子版,受益颇深。现在看到这本书正式出版真是可喜可贺!
在此 ...
estshooter 发表于 2014-9-19 15:39



1. 对于这种情况,在新书的10.3.3节有一个类似的例子。唯一的解决办法是保证get到key的sequence会释放这个key。我不清楚你那边为什么会没有释放key,我猜应该是类似disable fork之类的把这个进程干掉了。如果是这样,那么在干掉这个进程前,请等待key被释放。2. 虽然你描述的比较完整,但是不太清楚具体的细节。建议:
  (1)是否可以不使用sequence来实现slave agent的功能?解决问题的方式有很多种,sequence有时并不是唯一的选择。我们的目标是使用最方便最灵活的方式。我在新书中在这个上面阐述了不少。
  (2)如果一定要使用sequence,那么“但如果driver已经采集到命令信息再通过sequencer传给sequence的话,这个时候命令phase已经结束了”这句话估计是你的slave drive写的稍微有点问题。从理论上来说,如果slave driver得到命令再马上传回给sequencer的话,sequence做出响应,把transaction传递回driver,这个过程是完全不需要消耗时间($time打出来的时间)的。因此,命令phase并没有结束。你可以修改你的slave drive来实现这一点。
3.  你可以这样做,如果依然不能解决问题的话,那么可以多例化几个RAL好了。一个master对应一个RAL,一个RAL里面只需要一个map就可以了,当然了,这种解决方式并不是那么优雅。
作者: doogo    时间: 2014-9-19 18:06


   
之前读过张强的《UVM1.1实践与源代码分析》电子版,受益颇深。现在看到这本书正式出版真是可喜可贺!
在此 ...
estshooter 发表于 2014-9-19 15:39



1. 对于这种情况,在新书的10.3.3节有一个类似的例子。唯一的解决办法是保证get到key的sequence会释放这个key。我不清楚你那边为什么会没有释放key,我猜应该是类似disable fork之类的把这个进程干掉了。如果是这样,那么在干掉这个进程前,请等待key被释放。2. 虽然你描述的比较完整,但是不太清楚具体的细节。建议:
  (1)是否可以不使用sequence来实现slave agent的功能?解决问题的方式有很多种,sequence有时并不是唯一的选择。我们的目标是使用最方便最灵活的方式。我在新书中在这个上面阐述了不少。
  (2)如果一定要使用sequence,那么“但如果driver已经采集到命令信息再通过sequencer传给sequence的话,这个时候命令phase已经结束了”这句话估计是你的slave drive写的稍微有点问题。从理论上来说,如果slave driver得到命令再马上传回给sequencer的话,sequence做出响应,把transaction传递回driver,这个过程是完全不需要消耗时间($time打出来的时间)的。因此,命令phase并没有结束。你可以修改你的slave drive来实现这一点。
3.  你可以这样做,如果依然不能解决问题的话,那么可以多例化几个RAL好了。一个master对应一个RAL,一个RAL里面只需要一个map就可以了,当然了,这种解决方式并不是那么优雅。
作者: estshooter    时间: 2014-9-19 23:33
回复 52# doogo


    感谢及时回复。关于问题1和问题2我之前描述的可能不够清楚,在这里补充一下:
1.先get到key的sequence没有释放key是因为它发出的读写某个寄存器操作被优先级更高的中断sequence里面的grab操作锁住了,所以还没有完成,也就无法释放key。而此时运行到中断sequence里面读写与上述相同的寄存器时,就get不到key了。所以发生了死锁。看cadence关于UVM的示例中中断sequence都是采用grab的方式来控制程序跳转的,不知是否还有其他方法?
2.(1)之所以要采用sequence来实现是为了实现中央集权控制(整个激励的产生都是通过顶层的virtual sequence来统一控制调度)的验证环境,当然如果有更好的集中控制方式,也可以对现有方式进行改进;
(2)之所以说“如果driver已经采集到命令信息再通过sequencer传给sequence的话,这个时候命令phase已经结束了”,是因为只有driver采到有效的command ack握手信号,才能认为采到的命令信息是有效的吧?这个时候命令phase是不是可以认为已经结束了?所以我的疑惑就是类似于command ack相对于command vld的延迟cycle数这种响应信息是不是没办法通过slave sequence来控制?
3.如果例化多个RAL,应该是可以解决驱动这个问题的,但是跟实际情况似乎有些不相符:因为每个RAL是相互独立的,某个master对某个RAL的操作对其他master是不可见的,而实际上这些寄存器肯定是每个master共同访问的。另外按照你的理解,UVM可以引入多个uvm_reg_map的机制是不是就是为了适应这种多master访问的场景?
作者: doogo    时间: 2014-9-19 23:49
回复 53# estshooter


1. 为了避免grab的情况,那么只能在先得到key的sequence中也使用grab了,这样后面的grab会等前面的grab完了再做操作。2. 还是不明白。slave driver为什么会需要采集command ack?我的理解是master(DUT)发一个command,同时发一个command vld,slave driver回给master一个ack。
3. 多个reg_map的一种应用场景:一个DUT有两组总线接口,这个DUT做为slave。对于DUT中的一个寄存器来说,可以分别从两个接口访问,且这两个接口访问的地址不一样。
作者: estshooter    时间: 2014-9-20 00:35
回复 54# doogo


    非常感谢你的耐心解答!
    关于问题1,还有一点疑惑:我的初衷是中断seqence(interrupt sequence)的优先级比先get到key的sequence(normal sequence)高,所以我希望检测到中断时,能把normal sequence里当前操作执行完(现在的问题就是找不到这样一种机制),然后先执行interrupt sequence里的操作,再执行normal sequence里剩余的操作。如果在normal sequence里也加入grab的话似乎不符合我的意图。
    关于问题2,是我的理解有问题,如你所说应该可以通过修改driver的方式来解决;
    关于问题3,我理解了你的意思,这种多master访问block寄存器的最佳机制我可能还需要继续尝试和探索,如果后续有新的思路,请随时指教!
作者: doogo    时间: 2014-9-20 01:13


   
回复  doogo


    非常感谢你的耐心解答!
    关于问题1,还有一点疑惑:我的初衷是中断seqence(in ...
estshooter 发表于 2014-9-20 00:35



关于问题1,并不是整个sequence都要grab,而是如下的方式grab:normal_sequence
//some code
grab();
reg_model.write();
ungrab();
//other code
endsequence


即把grab的粒度降低,只在真正在读写寄存器时才grab。这样应该能够满足你的要求。
作者: seabeam    时间: 2014-9-20 12:53
大作拜读中,实际操作中phase跳转会遇到一些问题,而且mentor并不建议使用这一功能,这个怎么看?
作者: iooiniu    时间: 2014-9-20 16:50
我是初学者,看书后有3个问题想问下:
1.看书中写的 :所有的config一般直接从uvm_object中派生, 这个“一般”用词是不是意味着我从uvm_component或者uvm_sequence_item中派生也没问题吧,只要是我自己调用得当。(之前和同事研究uvm的时候,讨论了下这个,还是不太确定)

2. 是关于blocking_get端口的,书中图4-11 控制流顺序为:B_port-->A_export--->A_imp;数据流顺序相反:在B的代码中 是直接用B_port.get(tr);我想问的就是你怎么就能确定get函数一定能get的到tr呢?万一是空状态呢?

3.还有一个也是关于port的,blocking_peek这个端口不太懂  peek本来就是阻塞的,加个blocking是什么情况啊? 另外 blocking_get 和nonblocking_get 这个阻塞具体体现在什么地方? get函数会在什么情况阻塞? 阻塞的时候是不是上面第2个问题中的 get到空状态了?

问题有点多,有劳强哥费时间了。。。
作者: doogo    时间: 2014-9-21 09:07


   
大作拜读中,实际操作中phase跳转会遇到一些问题,而且mentor并不建议使用这一功能,这个怎么看?
seabeam 发表于 2014-9-20 12:53



是的。能避免还是避免吧。
作者: doogo    时间: 2014-9-21 09:26


   
我是初学者,看书后有3个问题想问下:
1.看书中写的 :所有的config一般直接从uvm_object中派生, 这个“一 ...
iooiniu 发表于 2014-9-20 16:50




   1、在OVM时代有人就使用component做config。但是因为各种各样的问题,在UVM时代这种用法后来被丢弃了。2、get是阻塞性质的,要在A中实现一个阻塞的get。如果为空,就一直等待。
3、(1)peek跟get类似,是阻塞的。从理论上来说,它跟get的区别是。如果从一个fifo或者queue中,peek过后,原来的数据一直在那里,但是get过后,数据就被取出了。所以最终实现的peek要符合这个规范。但是你完全可以把peek做的跟get一样,只是这样不是好的代码风格。
(2)blocking和nonblocking体现在blocking必须要实现get的任务(以get为例),而nonblocking则是can_get和try_get。get必须是阻塞的,而can_get和try_get都是非阻塞的,所以从而有blocking和Nonblocking。
(3)get任务最终是你自己实现的,即4.2.7节中A的get任务,如果这个任务你实现成非阻塞的,也没有人管你。从理论上来说,get必须是非阻塞的。你如果实现了非阻塞的get,虽然语法上没错误,但是一段代码的正确性并不只是由语法来保证的。
作者: kevinclick    时间: 2014-9-21 17:19
好东西
作者: dou124    时间: 2014-9-21 20:28
回复 45# doogo


   恩 MAC还是比较好的,是IEEE802.3标准中的内容,不存在所谓侵权的问题,无论如何,祝贺楼主
作者: iooiniu    时间: 2014-9-22 00:00
谢谢强哥之前对于我的port端口的问题的答复!
同时,我看完你的答复,还是有个小疑问,可能是我对UVM理解不够深吧: 书中P101对于blocking和nonblocking的解释:monitor有2种处理方法:1.是阻塞的(这个好理解) 2.是非阻塞的,“不等待,直接返回”这个"直接返回",是返回什么? 返回put/get函数的结果? 但是我看代码清单4-9中put函数定义的是function void B::put( );这个void,如果返回了,也不会有什么影响啊。 这个地方不太明白。 又麻烦强哥了。。。
作者: msim578    时间: 2014-9-22 09:02
非常好的建议,如果能指出一些细节就更好了。
作者: msim578    时间: 2014-9-22 09:08
一共有几卷呀?
作者: doogo    时间: 2014-9-22 10:43


   
谢谢强哥之前对于我的port端口的问题的答复!
同时,我看完你的答复,还是有个小疑问,可能是我对UVM理解不 ...
iooiniu 发表于 2014-9-22 00:00



哦,这里是这个样子的。
如果要体现“阻塞”这个特性,那么代码4-9中的put要实现成一个task,在这个task中可以:


wait(b_queue.size() == 0);
b_queue.push_front(tr);


其实b_queue是B中的一个queue。这样相当于在b_queue为空前一直阻塞在那里。
现在代码4-9中的put是实现成了一个函数。
但是无论是函数还是任务,对于monitor来说都是不可见的。它唯一能够做的事情是等待这个任务/函数返回。从而体现出阻塞的特性。
如果是非阻塞型端口,那么put只能定义成一个函数,由于函数不消耗仿真时间,所以就是非阻塞的。
对于既可以定义成任务,又可以定义成函数的情况,我在书中都以“函数/任务”做了说明,否则都直接说明是“函数”
作者: doogo    时间: 2014-9-22 10:44


   
一共有几卷呀?
msim578 发表于 2014-9-22 09:08



如果时机成熟,后面会有卷2。卷1的内容对于熟悉UVM来说足够了。
作者: xiaocheng12345    时间: 2014-9-22 12:25
卷二主要写啥?要是能多几个项目的例子就比较好啦
作者: estshooter    时间: 2014-9-22 16:21
回复 1# doogo

还想请教一个问题:
      在基于UVM RAL的验证环境来实现寄存器访问时,除了读写类型,地址,数据等这些基本的总线信息之外,有些总线可能还有些sideband信号(比如AHB的hprot),但是uvm_reg_adapter的reg2bus和bus2reg函数参数传递的是uvm_reg_bus_op这个结构体(里面只有kind,addr,data,byte_en等信息),那这些sideband信号怎样才能加进去呢?(我想实现的目标就是我在调用寄存器的读写函数read/write的时候能控制driver的hprot信号)
作者: cool88now    时间: 2014-9-23 03:40
great job !!!!!!!!!!!!
作者: DZ小亮    时间: 2014-9-23 09:23
期待卷2 的出版
作者: ririyu    时间: 2014-9-23 11:34
请教在uvm中搭建memory model的方法。UVM相对ovm引入了register和memory的方法,但是memory没有镜像值,这对于验证memory有些不便。
比如,有多个memory,如果读写的时候产生误操作,本来应该写A memory但是写到B memory去了,如果有memory model有mirror ,则可以在一系列读写操作后,将所有memory所有地址的值读出来与mirror值进行比较,会比较容易查出这类问题。
但是现在没有mirror,就只能写一个地址,然后通过backdoor读出这个地址进行比较,但是无法检查其他地址有没有被误操作。
想请教如何解决这个问题,有没有什么好的办法推荐。
另外,ovm的rgm也可以用于搭建memory模型,并且有镜像值;想请假,uvm是不是也有rgm,在哪里可以下载rgm的库呢,如果用于搭建memory模型,用rgm如何?
多谢!
作者: wzc00703    时间: 2014-9-23 12:18
新书到手,正在研习!顶!
作者: dongdongic    时间: 2014-9-23 13:20
感谢楼主分享~
作者: doogo    时间: 2014-9-23 13:55


   
回复  doogo

还想请教一个问题:
      在基于UVM RAL的验证环境来实现寄存器访问时,除了读写类型,地 ...
estshooter 发表于 2014-9-22 16:21



你的这一个目标用目前的UVM reg model是很难实现的。必须要改uvm_reg_bus_op及其它一系列代码。
作者: doogo    时间: 2014-9-23 14:04


   
请教在uvm中搭建memory model的方法。UVM相对ovm引入了register和memory的方法,但是memory没有镜像值,这对 ...
ririyu 发表于 2014-9-23 11:34



1. 你说的这种误操作的情况,使用镜像值并不能简单多少。2. rgm已经被UVM放弃了,且目前已经停止维护。最新的是2012年的一个版本:

http://forums.accellera.org/files/file/86-cadence-uvm-rgm275-release/
作者: leonardo_z    时间: 2014-9-23 20:43
回复 26# xiaocheng12345


    是不是看的顶层的信号,顶层只用了clk和reset,其他没连到DUT,所以高阻态。 DUT其他信号是用接口if联的。
作者: estshooter    时间: 2014-9-24 10:57


   
你的这一个目标用目前的UVM reg model是很难实现的。必须要改uvm_reg_bus_op及其它一系列代码。
doogo 发表于 2014-9-23 13:55




   

    了解了,谢谢!另外请问强哥是否有跟UVM官方取得过联系?是通过什么方式?有些特别底层的东西想直接跟他们交流,但一直没有得到过回复。
作者: doogo    时间: 2014-9-24 13:23


   
了解了,谢谢!另外请问强哥是否有跟UVM官方取得过联系?是通过什么方式?有些特别底层的 ...
estshooter 发表于 2014-9-24 10:57



有。你如果有想法,可以去它家论坛上提


http://forums.accellera.org/
作者: cugjack    时间: 2014-9-24 18:47
刚看了第一版的部分内容,觉得前面几章帮助对UVM的基本理解还是很有帮助的。
作者: iooiniu    时间: 2014-9-25 22:35
强哥,有个验证层次的问题:  interface uvc 是不是只是验证driver产生DUT的接口时序和验证环境的组件是没有问题的,而不是验证DUT的代码逻辑和功能?因为interface uvc里是没有scoreboard和rm的。
谢谢!
作者: doogo    时间: 2014-9-26 09:01


   
强哥,有个验证层次的问题:  interface uvc 是不是只是验证driver产生DUT的接口时序和验证环境的组件是没有 ...
iooiniu 发表于 2014-9-25 22:35



不一定。有些UVC还是有SCB的。看看各个公司的实现了,另外还要看接口复杂度。很复杂的接口一般会有RM和SCB的。这个问题的关键是你怎么看待UVC。什么才是接口UVC?每个人有不同的理解。有些只实现了agent和sequence就可以了,有些要求严格一些,要实现的更多。
作者: leonardo_z    时间: 2014-9-27 07:24
请教一下 2.5.2代码和debussy的问题,debussy 的$fsdbDumpvar放在哪合适呢? 我放到 top_tb.sv, 生成的fsdb文件没有信号,放到dut.sv后,有信号,可是放到dut不太合适
( , 下载次数: 93 )
作者: watercube    时间: 2014-9-27 13:22
强哥,看你书里介绍的uvm_config机制那部分时,想到一个问题:
UVM里面可以通过uvm_config_db的机制设置sequnce中的参数吗?
如果可以,那么set和get函数中的前两个参数的 路径该怎么填写呢?
作者: cugjack    时间: 2014-9-27 15:12
非常感谢你的代码分享,可以结合书本好好研究。
作者: doogo    时间: 2014-9-27 16:16


   
请教一下 2.5.2代码和debussy的问题,debussy 的$fsdbDumpvar放在哪合适呢? 我放到 top_tb.sv, 生成的fsdb ...
leonardo_z 发表于 2014-9-27 07:24



放在top_tb.sv中。
我猜你用的是questa或者modelsim?这两个工具默认情况下会把信号的层次优化掉的。要加一个novopt的选项,强制不优化。
作者: doogo    时间: 2014-9-27 16:18
本帖最后由 doogo 于 2014-9-27 16:21 编辑


   
强哥,看你书里介绍的uvm_config机制那部分时,想到一个问题:
UVM里面可以通过uvm_config_db的机制设置se ...
watercube 发表于 2014-9-27 13:22



《UVM实战》中6.6节专门讲述了如何在sequence中使用config_db
在set的时候
uvm_config_db#(bit)::set(this, "i_env.agt.sqr*", "random_en", 1);
在sequence中get的时候
uvm_config_db#(bit)::set(null, get_full_name(), "random_en", random_en);
作者: xue716    时间: 2014-9-28 13:39
多多学习拉
作者: xiaozhuguai    时间: 2014-9-29 10:14
好像蛮不错,下下来看看
作者: smithchart07    时间: 2014-9-29 20:47
xie xie!!!
作者: grow    时间: 2014-9-29 23:26
强哥,新手读完后,发现有几个地方笔误:
1.P78:经过清单3-58的设置->清单3-59;2.P79:如代码清单3-60可以使用->3-61;3.P176:代码清单6-24中,->`uvm_do_on_pri;4.P185:换言之,止述代码->上述;5.P222:第一行->reg_data.configure;6.P269:代码清单8-27中->my_monitor;7.P315:代码清单10-20乱了
作者: 不回忆君    时间: 2014-9-29 23:57
回复 77# leonardo_z


    对,我也出现这种情况,顶层CLK和RST_N是直连的就有信号,其他信号连接if的信号,然后就都是高阻态,我是参照强哥的代码例子写的
作者: 不回忆君    时间: 2014-9-30 00:08
uvm_config_db#(uvm_object_wrapper)::set(this,
                                           "v_sqr.configure_phase",
                                           "default_sequence",
                                           case0_cfg_vseq::type_id::get());
   uvm_config_db#(uvm_object_wrapper)::set(this,
                                           "v_sqr.main_phase",
                                           "default_sequence",
                                           case0_vseq::type_id::get());
1、这是第七章里面的代码,只有set,却没看到get。
2、很奇怪第一个config_db为什么在configure_phase里set,我照着搭自己的验证平台时却卡 在configure_phase那,改成main_phase就可以跑通。
3、我在DUT里面CLK和RST_N信号直接连接,其他信号与例化的if连接,然后出来除CLK和RST_N信号外,其他都是高阻态。我的整个平台都是参照7.2写的
作者: doogo    时间: 2014-9-30 07:36


   
uvm_config_db#(uvm_object_wrapper)::set(this,
                                           "v_sqr.co ...
不回忆君 发表于 2014-9-30 00:08




1. default_sequence只需要set,不需要get,2.4.3节中已经说明了这一点2. UVM推荐寄存器的配置是在configure_phase中完成,所以我猜测你的bus_driver中只有main_phase,而没有confure_phase?对于你的问题,要么在bus_driver中加一个configure_phase,要么如我在书的代码中那样,使用run_phase。建议你直接从本帖子首页中下载源代码。
3. 这个把你的代码都贴上来看看吧。
作者: doogo    时间: 2014-9-30 07:37


   
强哥,新手读完后,发现有几个地方笔误:
1.P78:经过清单3-58的设置->清单3-59;2.P79:如代码清单3-60可 ...
grow 发表于 2014-9-29 23:26



非常感谢你指出书中的问题!
作者: mmffss2007    时间: 2014-9-30 09:53
谢谢楼主的分享,正在学习中~~
作者: 不回忆君    时间: 2014-9-30 10:18
本帖最后由 不回忆君 于 2014-9-30 11:00 编辑

回复 94# doogo


  第一个问题已经解决了,谢谢强哥。鉴于公司信息安全原因,代码不方便贴上来。
现在还有个问题,就是顶层例化了DUT和一些if。通过DVE只能看到DUT,却看不见if。顶层还是参照7.2的源代码写的。用了virtual if.

经公司同事帮忙解决了。。。在顶层加入dump_file即可
作者: 罗森内力    时间: 2014-9-30 12:12
好东西啊,谢谢楼主分享
作者: igloo11    时间: 2014-9-30 22:01
大有收获。
作者: tedazsx    时间: 2014-10-4 22:53
希望能给出一个勘误表,并及时更新。




欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5