1、uvm_analysis_fifo的peek和get区别:
peek端口和get端口类似,数据流和控制流都一样,唯一区别是: 当get任务被调用时,fifo内部缓存中会少一个transaction,而peek被调用时,fifo会把transaction复制一份发出去,内部transaction数量不会减少。
普通的peek和get 端口差异是什么?
fifo有两种类型,一种是uvm_tlm_analysis_fifo,一种是uvm_tlm_fifo,差别是:前者有一个analysis-export的端口,并且有一个write函数,后者没有。
fifo 缓存操作: used函数:用于查询fifo缓存有多少transaction,
is_empty:用于判断当前fifo是否为空;
is_full:用于判断当前fifo缓存是否已经满了。 内部存储大小是在new时决定的,如下:
function new(string name,uvm_component parent=null, int size =1),size 用于设定fifo缓存上限,默认1. size=0,表示fifo缓存设置为无限大小。
flush 函数:用于清空fifo缓存中的数据,一般用于复位操作。
2\uvm phase 执行顺序
1)build_phase 执行顺序为:从上而下。 对于uvm树形结构,build_phase主要用于构建类的实例,如果下面的先执行,上面的后执行,即下面的先构建,上面的后构建,导致的结果就是空指针,例如agent 下有drv和mon,在agent实例化之前,不能进行drv和mon的实例化。
2)connect_phase执行顺序: 从下而上,即先执行drv和mon的connect,再执行agent的connect_phase;
3)对于同一层次中有兄弟关系的componet,执行顺序按照字典序,即按照new时name的字母排序。
4)对于兄弟关系的字典序外,uvm采用深度优先的原则,来处理叔侄关系的component,例如对于兄弟i_agt和scb,按照字典序,会先执行i_agt的build_phase,然后按照深度优先原则,再执行其中的drv,mon,sequencer的build_phase,最后再执行scb的build_phase。
那么,对于兄弟关系的component,到底是按照字典序还是深度优先原则呢? 猜测:如果兄弟节点无儿子节点,那么采用字典序,如果有儿子节点,需要先按照字典序决定执行那个父节点,再按照深度优先原则,将深度方向执行完。
3、phase 的跳转
比较典型的例子是reset_phase,如下:
一个线程一直开着来监测rst_n是否为低电平,一旦为低电平,立刻跳转到reset_phase中运行。
4、sequence uvm_do 系列宏
1) `uvm_do(tr)://创建一个transaction实例, 随机化, 然后送给sequencer;
2)uvm_do_with() //在1)的基础上,在随机化时对某些字段进行约束
3)uvm_do_pri(tr, priority)--指定transaction的优先级
4)uvm_do_pri_with(tr,priority) --指定transaction的优先级
5)uvm_do_on(tr, this.m_sequencer):显示指定在哪个sequencer发送次transaction;
6)uvm_do_on_pri(tr, sequencer, 100); //最后一个参数是优先级
7)uvm_do_on_with(tr, this, {tr.size ==16;}) // 最后一个是约束
8)uvm_do_on_pri_with(tr,this,100,{tr.size==10;}) //第三个是优先级,第四个是约束
1)~7)宏都是通过uvm_do_on_pri_with来实现的。