uvm通信-TLM源码分析(uvm_sqr_if_base,uvm_tlm_if_base,uvm_port_base)
1.常见两类TLM端口
1.1用于driver和sequencer之间
1.2用于其他component之间
2.uvm_sqr_if_base
(1) 这个类没有派生自任何类;
(2) 类里面定义了如下几个task/function: get_next_item, try_next_item, item_done等;
3.uvm_tlm_if_base
(1) 该类没有派生自任何类;
(2) 该类内部定义了三类task/function:
(2.1) 阻塞性质的方法,如 task .*put/ get/ peek/ transport(T1,T2);
(2.2)非阻塞性质的方法,如 function .* try_put/ try_get/ try_peek/ nb_transport(T1,T2);
(2.3)用于广播的write;
(3) 这三类函数都需要在派生类里重新定义才能使用;
4.uvm_port_component_base
(1) 该类提供几个接口: get_connected_to, get_provided_to, is_port, is_export, is_imp;
(2) 这几个接口都需要在派生类里重载才能使用;
5.uvm_port_component(uvm_port_base的成员变量)
(1) 定义了一个比较重要的成员变量-PORT m_port;
(2) 实现了uvm_port_component_base定义的各种方法;
6.uvm_port_base
(1) uvm_tlm_if_base是一个单独的类,它没有派生自任何的类;
(2) uvm_analysis_port最终派生自uvm_tlm_if_base,所以uvm_analysis_port既不是一个component,也不是一个object.
(3) 一个uvm_port_base内部有一个m_comp指针(类型为uvm_port_component #(this_type)),而uvm_port_component内有一个m_port指针,该指针指向uvm_port_base,所以一个uvm_port_base和一个uvm_port_component一一对应.
(4) uvm_port_base的两个变量m_min_size与m_max_size分别标明最少要有多少个其它的端口连接到此port上.
(4.1) 对于PORT和EXPORT来说,这两个值默认为1,表明只能由一个连接到上面;
(4.2) 对于uvm_analysis_port来说,m_min_size为0,而m_max_size没有限制(因为analysis_port本身就是广播性质,作为广播来说,不会对受众做出限制);
(5) 对于一个port来说,如uvm_put_port,它会调用UVM_PORT_COMMON宏;在宏内部调用super.new函数时,会传入UVM_PORT来表明这是一个PORT. 同样,EXPORT和IMP也都会在new的时候传入相应的参数.
(6) uvm_port_base实现了is_port, is_export, is_imp等成员函数;
(7) 确保connect函数在end_of_elaboration_phase之前调用,即connect_phase or build_phase(由于存在实例的实例化先后顺序问题,都在connect_phase中调用此函数);
(8) 避免要连接的port为null的情况;
(9) 一个IMP不能主动调用connect函数,它只能作为connect函数的参数,被别的port连接;
(10) export.connect(port)不被允许;
(11) 调用m_check_relationship,用于再次检测两个端口之间的连接是否合法;
(11.1)检查port-to-port connection是否满足要求-CHILD.port.connect(PARENT.port);
(11.2)检查port-to-export connection是否满足要求SIBLING.port.connect(SIBLING.export);
(11.3)检查port-to-imp connection是否满足要求SIBLING.port.connect(SIBLING.imp);
(11.4)检查export-to-export connection是否满足要求PARENT.export.connect(CHILD.export);
(11.5)检查export-to-imp connection是否满足要求PARENT.export.connect(CHILD.imp);
(12) m_provided_by与m_provided_to是两个联合数组(索引是string类型,存放的内容是uvm_port_base类型);
(12.1)以A.connect(B)为例,A的m_provided_by中将会有一条B的记录,而B的m_provided_to中将会有一条A的记录;
(12.2)对于IMP而言,由于IMP只能作为connect的参数,所以IMP的m_provided_by将永远是空的,不会有任何记录存在.