UVM中各种port的链接:按照控制流的优先级排序,UVM中三种port为:PORT,EXPORT,IMP。这三种port之间并不是互相之间都可以连接的。
如图所示,四个端口,我们要在A和B之间通信,在C和D之间通信,为了实现这个目标,必须要在A和B之间,C和D之间建立一种连接关系,否则的话,A如何知道是与B通信而不是C或者D呢?
UVM中使用connect函数建立连接关系。如A要和B通信(A是发起者),那么可以这么写:
A.connect(B);
但是不能写B.connect(A)。因为在通信的过程中,A是发起者,A是被动承担者。这种通信时的主次顺序也适用于连接时,只有发起者才能调用connect函数,而被动承担者则作为connect的参数。
在UVM三种端口按照控制流优先级排列中,PORT是最高优先级,IMP是最低优先级。理所当然的,一个PORT可以调用connect函数并把IMP作为端口调用时的参数。假设有三个component A,B和C,其中C是A和B的parent,现在要把A中的PORT和B中的IMP链接起来,如下图:
在A中有如下定义:
其中A_port在实例化的时候比较奇怪,第一个参数是名字,而第二个参数则是一个uvm_component类型的parent变量。
B中的定义如下:
由于A中采用了blocking put的PORT,所以在B中IMP相应的类型是uvm_blocking_put_imp。同时,这个IMP有两个参数,第一个参数是要将传输的transaction,第二个参数前面说过,就是实现接口的uvm_component。在这里就是B_imp所在的uvm_component B。IM的new函数与PORT的相似,第一个参数是名字,第二个参数是一个uvm_component变量,一般填写this即可。
PORT可以与IMP相连接,统一的EXPORT也可以与IMP相连接,其连接方法与PORT和IMP的连接完全一样。
有了PORT和IMP的连接,EXPORT和IMP的连接,我们自然也期待着PORT和EXPORT能够相连接。因为在TLM中,PORT和EXPORT相连接是贯穿始终的。
一定要使用IMP来终结连接关系。PORT和EXPORT都不能作为连接关系的终点。