tlm通信概述
- tlm通信的步骤:1.分辨出initiator和target,producer和consumer。
2.在target中实现tlm通信方法。
3.在俩个对象中创建tlm端口。
4.在更高层次中将俩个对象进行连接。
-端口类型有三种:1.port,一般是initiator的发起端。
2.export,作为initiator和target的中间端口。
3.imp,只能作为target接受request的末端。
4.多个port可以连接同一个export或imp,但是单个port或export不能连接多个imp。
- 端口的连接:通过connect函数进行连接,例如A(initiator)Y与B进行连接,可以使用A.port.connect(B.export)
- uvm_*_imp#(T,IMP);IMP定义中第一个参数T是这个IMP传输的数据类型,第二个参数IMP是实现这个接口所在的component。
uvm的多向通信
- uvm的analysis端口有俩种:analysis_port和analysis_export,他们与put,get系列端口类似。他们的主要区别是:1.默认情况下,analysis_port与imp之间的通信是一对多的通信。相当于广播的模式。而put,get与imp的通信是一对一的。
2.put和get有阻塞和非阻塞之分,而analysis没有阻塞和非阻塞的概念。
3.对于put系列的端口,有try_put,can_put等操作,get系列的端口也有try_get,can_get等操作,而analysis只有一种操作:write。
-当需要接受俩种及以上的数据,实现不用的imp端口时,uvm采用宏uvm_analysis_imp_decl来声明。例如:sb接收monitor和model的数据,可以使用下面的方法:
uvm_analysis_imp_decl(_monitor);
`uvm_analysis_imp_decl(_model);
通过宏声明这俩个后缀之后,uvm会自动根据他来定义俩个新的imp类,并分别例化他们。
- 此外,我们还可以使用tlm fifo 才实现这个功能。FIFO的本质就是一块缓存加上俩个IMP。
- uvm_tlm_fifo包含多个tlm端口,常用的端口如下:put_export:可以通过这个端口调用put,try_put,can_put;
-
***put_ap:调用put方法写入数据的同时,也通过该端口的write函数送出。***
-
get_peek_export:调用get,try_get,peek,try_peek等
-
***get_ap:调用get ,peek方法写入数据的同时,也通过该端口的write函数送出***
uvm_tlm_analysis_fifo提拱了uvm_analysis_port端口,uvm_analysis_imp端口和write函数。不需要自己实现write函数。需要注意的是这些export类型本质上都是imp。