UVM通信篇之三:单向、双向及多向通信(下)

本文转自:http://www.eetop.cn/blog/html/28/1561828-5940100.html

多向通信(multi-directional communication)

多向通信这个概念听起来容易让读者产生歧义,因为这种通信方式解决的仍然是两个组件之间的通信,而不是多个组件之间的通信方式。毕竟,多个组件的通信方式仍然可以由基础的两个组件之间的通信方式来构建。这里的多向通信指的是,如果initiator与target之间的相同TLM端口超过一个时的处理解决办法。

 

例如下面这个结构中comp1有两个uvm_blocking_put_port,而comp2有两个uvm_blocking_put_imp端口,对于端口的例化可以给不同的名字,而连接也可以通过不同的名字来索引,但是问题在于comp2中需要实现两个task put(itrans t)。因为不同的端口组之间要求在imp端口一侧实现专属的方法,这种要求造成了暂时的方法命名冲突,即无法在comp2中定义两个同名的put任务。

 

UVM通过延伸的端口宏声明方式来解决这一问题,而它解决问题的核心在于让不同的端口之间对应着不同命的任务,这样便不会造成方法名的冲突。而UMV为解决多向通信的宏也按照上述的端口名的命名方式可以参考,它们分别是:

  • `uvm_blocking_put_imp_decl(SFX)

  • `uvm_nonblocking_put_imp_decl(SFX)

  • `uvm_put_imp_decl(SFX)

  • `uvm_blocking_get_imp_decl(SFX)

  • `uvm_nonblocking_get_imp_decl(SFX)

  • `uvm_get_imp_decl(SFX)

  • `uvm_blocking_peek_imp_decl(SFX)

  • `uvm_nonblocking_peek_imp_decl(SFX)

  • `uvm_peek_imp_decl(SFX)

  • `uvm_blocking_get_peek_imp_decl(SFX)

  • `uvm_nonblocking_get_peek_imp_decl(SFX)

  • `uvm_get_peek_imp_decl(SFX)

  • `uvm_blocking_transport_imp_decl(SFX)

  • `uvm_nonblocking_transport_imp_decl(SFX)

  • `uvm_transport_imp_decl(SFX)

  • `uvm_blocking_master_imp_decl(SFX)

  • `uvm_nonblocking_master_imp_decl(SFX)

  • `uvm_peek_master_decl(SFX)

  • `uvm_blocking_slave_imp_decl(SFX)

  • `uvm_nonblocking_slave_imp_decl(SFX)

  • `uvm_peek_slave_decl(SFX)

 

下面这段例码就通过这些宏来解决多个同类端口连接和方法定义的问题:

 

 

 

仿真结果:

 

 

从上面这段例码可以看到,当一个组件到另外一个组件,通过相同的传输方法(譬如task put()),那么就需要使用上述的宏,分别来声明两个不同的imp类型。完整的步骤包括:

  1. 选择正确的imp宏来定义不同的imp端口类型,而宏的参数SFX(后缀名)也会转化为相应的imp端口类型名。

  2. 在imp所例化的组件当中,分别实现不同的put_SFX方法。

  3. 在port端口例化的组件中,不对目标imp端口类型做以区分,例如comp1中的bp_port1和bp_port2为相同的端口类型。

  4. 而对于comp1调用put方法而言,它只需要选择bp_port1或者bp_port2,而不需要更替put方法名,即仍然按照put()来调用而不是put_p1或者put_p2。

  5. 在上层应该连接comp1和comp2的TLM端口。

 

通过这种方式,用户只需要在例化多个imp端口的组件中,实现不同名称的方法,与imp类型名保持一致。而对于port端口一侧的组件,则不需关心调用的方法名称,因为该名称并不会发生改变。所以,通过这种方式,可以解决多向通信的需要,而防止通信方法名的冲突。

 

下一节《通信管道应用》我们将带领读者认识TLM通信中的一大利器——通信管道及其analysis interface。

你可能感兴趣的:(IC_UVM)