单向通信
单向通信(unidirection communication)指的是从initiator到target之间的数据流向是单一方向的或者说initiator和target只能扮演producer和consumer中的一个角色。
端口类型
PORT代表了三种端口名:port、export、imp
按照UVM端口名的命名规则,指出了通信的两个要素:是否阻塞(是否可以等待延时);何种通信方法。
端口方法
阻塞传输方式将blocking前缀作为函数名的一部分,而非阻塞方式则名为nonblocking。阻塞端口的方法类型为task,这保证了可以实现事件等待和延时;非阻塞端口的方式类型为function,这确保了方法调用可以立即返回。
从方法名可以发现,例如uvm_blocking_put_PORT提供的方法task put()会在数据传送完后返回,uvm_nonblocking_put_PORT对应的两个函数try_put()和can_put()是立刻返回的。
uvm_put_PORT则分别提供了blocking和nonblocking的方法,这为通讯方式提供了更多选择。blocking阻塞传输方法包含:
- put():initiator先生成数据T t,同时将该数据传送至target
- get():initiator从target获取数据T t,而target中的数据T t应被消耗
- peek():initiator从target获取数据T t,而target中的数据T t应被保留
与上述三种任务对应的nonblocking非阻塞方法是:
- try_put()
- can_put()
- try_get()
- can_get()
- try_peek()
- can_peek()
这六个非阻塞函数与对应阻塞任务的区别在于,它们必须立即返回,如果try_xxx函数可以发送或者获取数据,那么函数应该返回1,如果执行失败则应返回0。或者can_xxx先试探target是否可以接收数据,如果可以,在通过try_xxx函数发送,提高数据发送的成功率。
//实例
class itrans extends uvm_transaction;
int id;
int data;
...
endclass
class otrans extends uvm_transaction;
int id;
int data;
...
endclass
class comp1 extends uvm_component;
uvm_blocking_put_port #(itrans) bp_port; //组件一把数据给组件二
uvm_nonblocking_get_port #(