uvm实战-学习笔记 下载本文

i_agt.ap、o_agt.ap和mdl.ap是analysis_port

mdl.port、scb.exp_port和scb.act_port都是blocking_get_port

fifo上有很多export,但是这些export实际都是imp src/tlm1/uvm_tlm_fifo_base.svh

上面连接的agt_mdl_fifo.analysis_export也是一个analysis_imp: 源代码中实现如下: src/tlm1/uvm_tlm_fifos.svh uvm_analysis_imp #(T, uvm_tlm_analysis_fifo #(T)) analysis_export;

fifo是一个component,可以调一些函数来debug: used() is_empty() is_full() flush()

fifo里缓存深度可以在new的时候用第三个参数设置。

问题:fifo的两端是不是一般就是 analysis_port和blocking_get_port ? ---- 感觉4.3.5章节开始一段文字描述是这个意思。

使用fifo还是imp自己来把握。 各有各的好处。

imp可以使用uvm_analysis_imp_decl(_标记)的macro,有时候会很方便。

而analysis_fifo可以用for循环来操作fifo数组,也可以带来代码的简洁。connect和new的时候用for循环。

imp不能在

第5章 UVM验证平台的运行 5.1 phase机制

所有的phase如下图:

中间绿色的是task phase,两头青色的是function phase

component的实例化是在build_phase中完成,object的实例化可以在任何phase完成。 function phase中除了build_phase都是“自下而上”的执行 ---- 这里的上下是指的树结构中的上下。------- build_phase是“自上而下”

同层次的兄弟关系的component,build phase执行顺序是根据new时候name的字典序 – 5.1.3章节

对于叔侄关系的component,build phase执行顺序是深度优先。例如前面UVM树中,“scb”和“i_agt.drv”,因为i_agt在scb前面,会执行完i_agt,然后drv\\mon\\sqr,然后o_agt,然后mon,然后才是scb。

所有component的同一个run time phase是同时开始的。----- 也就是说会等其他component的上一个phase结束才开始当前phase。

super.build_phase(phase)一定要加,其他phase的super….可以不用加.

phase之间可以跳转。例如在正常工作的时候,发生了的reset,那么应该是main_phase跳转到reset_phase. 例如:5.1.7章节的示例代码

jump导致main_phase的objection没有被drop. ------ 仿真发现这里会有一个UVM WARINGING报出来,这个问题如何解决呢?---应该不用管它 simv +UVM_PHASE_TRACE可以调试phase 超时退出机制:

1) 在test的build_phase里加上 uvm_top.set_timeout(500ns,0); 2) `define UVM_DEFAULT_TIMEOUT 500ns 3) simv +UVM_TIMEOUT=”500ns,YES”

控制objection的时机:

推荐在sequence里的body()task中实现控制objection 5.2.2章节示例代码: