tlm源码分析——interface class和port_base
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tlm源码分析——interface class和port_base相关的知识,希望对你有一定的参考价值。
uvm官方提供的两种interface有:uvm_sqr_ifs和uvm_tlm_ifs;
两种interface都是定义了各个TLM API function的原型;都是单独的class,并没有进行extend;
uvm_tlm_if,包含两个参数化的type定义;
put类函数,一个task,两个function:
can_put只是返回值,并不会将trans写出去;
get类函数,一个task,两个function;
peek类函数,一个task,两个function;
transport类函数,有两个参数,一个input,一个output;
transport 是一个block的task,nb_transport是一个non block的function;
write类函数,进行broadcast;
uvm_sqr_if,包含两个参数化的type定义;主要定义在driver和sequencer之间;进行item和resp的传递;
get_next_item。block的peek函数,只有在item_done返回之后,才重新get出fifo中的值;
try_next_item,只是try_peek函数,没有available的情况下,返回null;
item_done,sequencer收到之后,删除其中fifo中的值;
sequencer中的两个function;等待sequence item ready;
纯粹tlm的function,不涉及sequencer以及driver之间的item沟通,
两个item_recording的function;
virtual class uvm_port_component_base,定义function原型,从component继承过来;
继承类;参数化的类,uvm_port_component,其中的参数化type,为uvm_port_base类型;
主要是为了包含一个该type类型的变量;执行变量中的其他操作;
uvm_port_base,参数化的类,type指tlm_ifs,sqr_ifs;
内部包含一个uvm_port_component #(this_type) m_comp的变量,从而实现comp和port_base的绑定;
内部变量,有一个m_if,主要为了实现具体的ifs的操作,
m_imp_list,保存该port或export连接到的m_imp_list,
m_port_type,表示该port的类型,为extend class使用,
其中最重要的一个function;connect函数;
首先connect这个函数不能再elabration的phase执行;必须在build或者connect phase执行,由于build中执行先后顺序的问题
一般放在connect phase;参数名为provider,也就是只有主动的一方才能调用;
provider为null或this时,也会报error,接着检查m_If_mask的值是否相同,不同的port在new时,mask都是不同的;
如果调用该方法的对象是imp,直接报错;imp不允许使用connect;
检查relationship的级联关系,在将两个对象中的m_provided_by以及m_provided_to进行初始化;
主要功能只是实现内部provider和provided的赋值;
check_relationship的函数,主要检查port与port的连接,且最开始是一个port;且时child的port连接parent的port;否则报warning;
port连接到export和imp,必须是同一env下的不同comp之间;
export连接到export或者imp,必须是parent到child的;
resolve_bindings函数,在end_of_elabration的phase进行自动的递归调用,实现imp和port的组装;
uvm_root从uvm_component继承而来;重载了phase_started的function,在end_of_elaboration,自动调用
do_resolve_bindings;
uvm_component中,对child进行遍历;
port_base中的实现,更新class中的imp_list哈希,如果本身是imp,里边只有自己;
否则根据connect函数,赋值的provided_by哈希,在imp_list中添加对象;
m_resolved,防止一个port被反复添加imp;
接着判断imp的个数问题,之后更新内部的m_imp,指向第一个imp_list中的第一个;
m_add_list function,在provider中拿到他的imp_if;所以port,port,export之间可以级联;指向的imp都是同一个imp;
以上是关于tlm源码分析——interface class和port_base的主要内容,如果未能解决你的问题,请参考以下文章