
UVM
文章平均质量分 61
tingtang13
这个作者很懒,什么都没留下…
展开
-
UVM:5.1.9 phase的调试
1.每次用uvm_info太麻烦,使用命令行调试: +UVM_PHASE_TRACE2.输出:原创 2015-06-16 14:39:44 · 1909 阅读 · 0 评论 -
UVM:5.3.1 domain 简介
1.domain 是UVM 中用于组织不同组件的概念。2.没有domain:两个driver 位于同一domain3.有domain:两个driver 位于不同domain4.1)domain 把两个时钟域隔开,之后两个domain的各个动态运行的phase 就可以不同步。2)只能隔离run-time phase。3)run_phase 和其它fun原创 2015-06-16 17:52:04 · 1805 阅读 · 1 评论 -
UVM:6.3.4 start_item与 finish_item
1.前面使用宏产生transaction,隐藏了细节。2.不适用宏产生transaction 主要靠两个任务:start_item 和finish_item。使用前,必须要实例化transaction:3.构建sequence 如下:4.可以在transaction 例化后,finish_item 前随机化:1)assert也可在start_item 之后,原创 2015-06-17 16:44:59 · 6257 阅读 · 1 评论 -
UVM:5.1.3 phase 的执行顺序
1.UVM 在build_phase 里做实例化工作,假如在其他phase 实例化一个uvm_component,那么系统会报错。2.uvm_object 可以在任何phase 实例化。3..除了build_phase 外,所有function phase都是从叶到根执行。4.对于兄弟关系的component,如driver 与monitor。同一phase 的执行顺序是字典序,即ne原创 2015-06-16 10:07:48 · 3227 阅读 · 0 评论 -
UVM:5.3.3 多domain中phase 的跳转
1.当位于不同domain时,phase 的跳转只局限于某一domain。2.A 和base_test 与上节相同。3.B:4:结果:B 两次进入reset_phase 和main_phase,而A 只一次。domain 使得phase 的跳转局限于平台的一部分。原创 2015-06-17 09:42:18 · 899 阅读 · 0 评论 -
UVM:6.3.2 uvm_create 与 uvm_send
1.除了uvm_do 产生transaction,还可以使用uvm_create 与uvm_send 产生:1)uvm_create 作用是例化transaction。可以做更灵活的处理。2.可以不用uvm_create 宏,直接调用new 进行例化:3.uvm_send_pri:原创 2015-06-17 16:12:25 · 7243 阅读 · 0 评论 -
UVM:5.1.4 UVM 树的遍历
1.广度优先:先兄弟在孩子。2.深度优先:先孩子在兄弟。3.同级别兄弟按照字典序。1)build_phase 是从根到叶,connect_phase 是从叶到根。原创 2015-06-16 10:58:09 · 533 阅读 · 0 评论 -
UVM:5.1.6 build 阶段出现UVM_ERROR停止仿真
1.在build_phase使用 uvm_error,也会退出:2.结果:3.在end_of_elaboration_phase 之前的phase中,如果出现UVM_ERROR,UVM就认为出现了致命错误,会调用uvm_fatal 结束仿真。4.小设计看不出优势,大设计有用。原创 2015-06-16 11:35:51 · 3408 阅读 · 0 评论 -
UVM:5.1.8 phase 机制的必要性
1.可以这么写:第三行在第二行后面就可以。2.将顺序降到最低,也可以这么写:3.UVM 将例化放在build_phase,连接放在connect_phase,这就是phase 的来源。方便用户。原创 2015-06-16 14:27:25 · 616 阅读 · 0 评论 -
UVM:6.1.2 sequence 的启动与执行
1.完成一个sequence后,可以使用start 将其启动:2.还可以使用default_sequence。其实default_sequence也会调用start 任务。有两种方式:1)2)先例化,在启动:3.sequence 启动后会自动执行sequence 的body 任务。此外,还会自动调用sequence的 pre_body 与post_b原创 2015-06-17 10:05:19 · 1630 阅读 · 0 评论 -
UVM:6.2.1 在同一sequencer 上启动多个sequence
1.在my_sequencer 上同时启动两个sequence。1)my_case0:2)sequence0:3)sequence1:4)结果:4.1)sequencer 选择哪个sequence 的transaction是sequence 机制中的仲裁问题。4.2)对于transaction 来说,存在优先级概念,越原创 2015-06-17 10:40:02 · 3872 阅读 · 0 评论 -
UVM:5.2.2 参数phase 的必要性
1.便于在任何component 的main_phase 中都能raise_objection,必须通过 phase.raise_objection完成。2.build_phase 等function phase也可以提起和撤销objection:不报错,但一般使用在main_phase 等task phase,而不是 function phase。原创 2015-06-16 15:51:57 · 593 阅读 · 0 评论 -
UVM:5.2.4 set_drain_time 的使用
1.任何DUT 模块都有延时:在sequence 中,m时刻发送完最后一个sequence,如果此刻drop_objection,那么在 n+p 时刻DUT 的输出报无法收到。所以需要延时p时间才能drop_objection:2.UVM所有的objection 设置了 drain_time 属性。设置方式:1)phase_done 是uvm_phase原创 2015-06-16 16:27:07 · 9070 阅读 · 0 评论 -
UVM:5.1.5 super.phase 的内容
1.build_phase:自动获取通过config_db::set 设置的参数。如果要关闭此功能,可以不用super.build_phase。2.除了build_phase 外,其他phase几乎没做任何相关的事:1)除了build_phase 外,其他phase完全可以不必加上super.xxx_phase 语句。如果是user自己定义的class,某个conn原创 2015-06-16 11:07:29 · 4242 阅读 · 0 评论 -
UVM:5.1.7 phase 的跳转
1.phase 执行后还可以在执行一次前面的phase,phase之间可以跳来跳去。2.例子,监测到reset_n 信号为低,则从main_phase 跳转到reset_phase。1)driver:reset_phase 做一些清理工作,并等待复位。2)top_tb:3)my_case0:4)结果:UVM_WAR原创 2015-06-16 11:48:33 · 5490 阅读 · 3 评论 -
UVM:6.3.1 uvm_do系列宏
1.uvm_do系列宏主要有以下8个:1)uvm_do_on用于显式指定那个sequencer发送此transaction。第一个是transaction 指针,第二个是sequencer 指针。2)使用uvm_do 时,默认的sequencer 就是此sequence 启动时为其指定的sequencer,sequence 将这个sequencer 的指针放在其成员变量m_sequ原创 2015-06-17 15:52:52 · 12715 阅读 · 1 评论 -
UVM:6.3.5 pre_do,mid_do 与post_do
1.uvm_do 封装了一系列接口,封装越多,灵活性越差。所以增加了三个接口:pre_do,mid_do 与post_do 任务。2.pre_do 是start_item 返回前执行的组后一行代码,之后才对transaction 随机化。3.mid_do 位于finish_item最开始;post_do位于finish_item 最后一行。大致顺序:4.示例:1)p原创 2015-06-17 16:59:01 · 1619 阅读 · 0 评论 -
UVM:5.2.3 控制objection 的最佳选择
1.一般不会在driver 和monitor这种有while 的控制objection。2.一般是以下两种:1)scoreboard中:通过config_db::set 设置收集到的transaction 的数量pkt_num,收集到足够后跳出循环:while(1)会一直执行,跳出只可能是for。2)在sequence 中rise sequencer的objecti原创 2015-06-16 16:14:28 · 684 阅读 · 0 评论 -
UVM:6.1.1 从driver 中剥离激励产生功能
激励产生与驱动要分离,反正就是好!原创 2015-06-17 09:59:49 · 542 阅读 · 0 评论 -
UVM:6.2.2 sequencer 的lock操作
1.sequence 向sequencer 发送请求,一旦相应这个lock,sequencer 会一直发送此sequence 的transaction,知道unlock 被调用。(fork join)2.one_lock:1)sequence1:2)结果:3.dual_lock:首先获得所有权的sequence 执行完后才会将所有权交给另外一个seq原创 2015-06-17 11:39:08 · 835 阅读 · 0 评论 -
UVM:6.2.3 sequencer 的grab 操作
1.grab 比lock 优先级更高。2.lock 是插到sequencer 仲裁队列的后面。3.grab则是插到前面,一发出就拥有sequencer 的所有权。4.如果遇到lock,grab 不会打断lock,等待lock完成。5.两个grab试图获取,和lock一样,先获得先用,用完再给另外一个。6.my_case0:7.结果原创 2015-06-17 12:12:50 · 1585 阅读 · 1 评论 -
UVM:6.2.4 sequence 的有效性
1.UVM 可以使sequence 在一定时间内不参与仲裁,令此sequence 失效。2.sequencer 在仲裁时,查看sequence 的is_relevant 函数返回的结果。如果为1,说明有效,否则无效。可以重载is_relevant 函数是sequence 失效:5个0才对!3.结果:1)is_relevant 与grab和lock是完原创 2015-06-17 14:19:03 · 736 阅读 · 0 评论 -
UVM:5.1.10 超时退出
1.出现挂起,通过uvm_root 的set_timeout 设置超时时间:1)第一个参数是要设置的时间,第二个参数是是否可以被覆盖。默认是9200s。2)uvm_top 是真正的树根。2.命令行 +UVM_TIMEOUT=,表示是否被覆盖,可以使YES or NO。 +UVM_TIMEOUT="300ns, YES"原创 2015-06-16 15:07:31 · 3768 阅读 · 0 评论 -
UVM:5.2.5 objection 的调试
1.命令行: +UVM_OBJECTION_TRACE2.一次raise 两个objection:1)第二个是string,可以为空。2)第三个是数量。3.加入UVM_OBJECTION_TRACE 结果:1)UVM 采用树形结构管理所有objection。2)当有一个objection提起后,会检查从当前component 一直到顶层u原创 2015-06-16 17:23:38 · 2685 阅读 · 0 评论 -
UVM:5.3.2 多domain 的例子
1.将某个component 置于新的domain中,B如下:1)新建一个domain 并例化。在connect_phase 中通过set_domain 将B 加入到此domain中:原型:2)第二个参数表示是否递归,1表示递归。3)例化一般在build_phase 完成,所以一般在connect_phase 中调用set_domain。2:A:原创 2015-06-17 09:34:00 · 1023 阅读 · 0 评论 -
UVM:6.3.3 uvm_rand_send 系列宏
1.uvm_rand_send 系列宏有如下几个:1)和uvm_send 的唯一区别是它会对transaction 进行随机化。2)使用前提是transaction 被分配了空间,(就是uvm_create)2.uvm_rand_send 系列宏及uvm_send 系列宏的意义在于,如果一个transaction 占用内存较大,希望前后两次发送的transaction都原创 2015-06-17 16:16:02 · 3879 阅读 · 0 评论 -
UVM:5.2.1 objection 与task phase
1.进入到某一phase 时,UVM 会收集此phase 所有的objection,并且实时监测所有objection 是否已经被撤销,如果都撤销,就关闭此phase,进入下一个phase。所有phase 执行完毕后,调用$finish 关闭验证平台。2.如果此phase 没有rise 任何objection,直接跳到下一个phase。3.只有driver rise obj原创 2015-06-16 15:20:49 · 732 阅读 · 0 评论 -
UVM:6.5.2 sequence 之间的简单同步
1.新验证平台有两个driver,本来是完全等价的,但现在要求driver0 必须先发送最长包,driver1 才能发送。这是sequence 之间的同步,使用全局事件完成:2.通过config_db 设置default sequence:1)drv1_seq 要等待send_over 的到来,不会马上产生transaction,等待drv0_seq。原创 2015-06-18 15:10:15 · 1023 阅读 · 0 评论 -
UVM:6.4.4 p_sequencer 的使用
1.考虑如下情况,sequencer 有如下变量:2.在sequence 发送transaction 时,必须设置此dmac 和smac,sequence 的body如何得到这两个值呢?1)在介绍sequence 时,内部有m_sequencer, 直接使用m_sequencer 得到这两个变量:编译错误:因为m_sequencer 是uvm_seq原创 2015-06-18 12:31:39 · 2303 阅读 · 0 评论 -
UVM:6.5.3 sequence 之间的复杂同步
1.使用全局变量不好,event。2.实现同步的最好方式就是用virtual sequence。虚拟的意思是他根本就不发送transaction,只是控制其它的sequence,起统一调度的作用。3.为了使用virtual sequence,一般需要一个virtual sequencer。里面包含指向其它真实sequencer 的指针:4.base_test:例化seq原创 2015-06-18 15:24:35 · 1505 阅读 · 0 评论 -
UVM:6.5.5 在sequence 中慎用fork join_none
1.将DUT 的数据口扩展为4路,验证平台也要有4个完全相同的driver,sequencer。my_vsqr 如下:2.virtual sequence:1)由于join_none 的特性,系统并不等fork 起来的进程结束就进入下一次for 循环,展开后如下:问题是:使用join_none 并不等这4个mseq 执行完就直接返回。然后就是endtas原创 2015-06-19 11:46:11 · 2221 阅读 · 1 评论 -
UVM:6.5.1 带双路输入输出端口的DUT
1.为了说明virtual sequence,以带双路输入输出端口的DUT为例:1)相当于在原先的基础上增加一组端口,功能一摸一样。2.增加后,在test 中在例化一个my_env:3.tb:4.my_case0 中,设置两个default sequence:原创 2015-06-18 14:35:22 · 870 阅读 · 0 评论 -
UVM:6.5.4 仅在virtual sequence 中控制objection
1.sequence 中使用starting_phase 控制验证平台的关闭。2.除了手工启动sequence 时为starting_phase 赋值外,只有将此sequence 作为sequencer的某动态运行phase 的default_sequence 时,其starting_phase 才不为null。3.如果某sequence 作为uvm_do 的参数,那么此sequence原创 2015-06-19 09:51:45 · 1066 阅读 · 0 评论 -
UVM:6.4.3 transaction 类型的匹配
1.sequence要想在sequencer 上启动,产生的transaction 类型必须是和sequencer 同样的类型,或派生自这种transaction。2.如果不是会报错:3.嵌套sequence 的前提是,套在里面的所有sequence 产生的transaction 都可以被同一个sequencer 接受。4.两个截然不同的transaction原创 2015-06-18 10:17:57 · 1467 阅读 · 0 评论 -
UVM:6.4.5 sequence 的派生与继承
1.从sequence 派生另外一个sequence:1)公用的函数或任务写在base_sequence 中,其他sequence 从此派生。2)p_sequencer 无需在声明一次。3)在声明一次也不会报错:1)相当于连续声明两个p_sequencer,一个属于父类,一个属于子类。所以不报错。原创 2015-06-18 14:19:27 · 1203 阅读 · 0 评论 -
UVM:6.4.1 嵌套的sequence
1.假设产生CRC错误包的sequence 如下:2.长包sequence 如下:原创 2015-06-17 17:51:15 · 1585 阅读 · 2 评论 -
UVM:6.4.2 在sequence 中使用rand 类型变量
1.transaction 中,使用randomize 进行随机。2.sequence 中也可以使用rand 修饰符。如下:3.可以被顶层sequence 调用:4.sequence 的变量名要和transaction 的相应字段名字不一样。如果一样:1)发现dmac是个随机值。2)因为运行到第15行,编译器会首先去my_transact原创 2015-06-18 09:50:09 · 3019 阅读 · 1 评论 -
UVM:6.6.2 在sequence 中设置参数
1.向UVM 树中任意节点传递参数,my_case0:2.还可以向sequence 中传递参数:1)这个sequence 向自己传递了一个参数:first_start。2)sequence 是在virtual sequencer 中被启动,get_full_name 应该是uvm_test_top.v_sqr.*,而不是i_agt的那个。set也是v_sqr。原创 2015-06-19 15:13:17 · 2472 阅读 · 0 评论 -
UVM:6.6.1 在sequence 中获取参数
1.在sequence 的body 中调用get_full_name(),打印返回值,结果大致如下:1)包括sequencer 的路径,及例化此sequence 传递的名字。2.可以使用如下的方式为sequence 传递参数:1)通配符是因为sequence在例化时名字一般是不固定的,而且有时是未知的(比如default_sequence),所以使用通配符。原创 2015-06-19 14:59:03 · 3055 阅读 · 0 评论 -
UVM:6.7.1 put_response 与 get_response
1.sequence 需要根据driver对 transaction 的反应来决定接下来要发送的transaction。2.如果要response,那么在sequence 中需要get_response 任务:3.driver 中使用put_response 任务:1)set_id_info 将req 的id等信息复制到rsp 中。2)由于可能存在多个seq原创 2015-06-19 16:33:23 · 6807 阅读 · 0 评论