第四章 UVM中的TLM1.0通信

TLM1.0

验证平台内部的通信

如果要在两个uvm_component之间通信,如一个monitor向一个scoreboard传递一个数据(如图4-1所示)有哪些方法呢?

transdata

transdata

最简单就是全局变量,但是这种方法不能乱用。

第二种是在scoreboard中设置一个变量,但是是可以外部直接访问(public类型),要完成这个任务,需要给monitor留一个指针,但是也容易改变scoreboard中的变量。

通过config_db将值传递到scorebard里面,(不就是一个单项的传数据的过程嘛)

出自之外还有阻塞非阻塞,scoreboard想向monitor发送数据的场景怎么办?

因为有这个需求所以下面介绍的TLM就是解决这个问题的办法。

TLM定义

TLM是Transaction Level Modeling(事务级建模)的缩写,它起源于SystemC的一种通信标准。所谓transaction level是相对 DUT中各个模块之间信号线级别的通信来说的。简单来说,一个transaction就是把具有某一特定功能的一组信息封装在一起而成为的一个类。如my_transaction就是把一个MAC帧里的各个字段封装在了一起。

  • put操作:通信的发起者A把一个transaction发送给B。
  • get操作:A向B索取一个transaction。
  • transport操作:transport操作相当于一次put操作加一次get操作,这两次操作的“发起者”都是A,目标都是B。

UVM中的PORT与EXPORT

来源:UVM
源代码
uvm_blocking_put_port#(T);
uvm_nonblocking_put_port#(T);
uvm_put_port#(T);
uvm_blocking_get_port#(T);
uvm_nonblocking_get_port#(T);
uvm_get_port#(T);
uvm_blocking_peek_port#(T);
uvm_nonblocking_peek_port#(T);
uvm_peek_port#(T);
uvm_blocking_get_peek_port#(T);
uvm_nonblocking_get_peek_port#(T);
uvm_get_peek_port#(T);
uvm_blocking_transport_port#(REQ, RSP);
uvm_nonblocking_transport_port#(REQ, RSP);
uvm_transport_port#(REQ, RSP);

UVM中各种端口的互连

UVM中使用connect函数来建立连接关系。如A要和B通信(A是发起者),那么可以这么写:A.port.connect(B.export),但是不能写成B.export.connect(A.port)。因为在通信的过程中,A是发起者,B是被动承担者。这种通信时的主次顺序也适用于连接时,只有发起者才能调用connect函数,而被动承担者则作为connect的参数。

port和export的作用就是一道门,无法完成后续的存储功能,完成这一功能的是IMP。

IMP

除了TLM中定义的PORT与EXPORT外,UVM中加入了第三种端口:IMP。IMP才是UVM中的精髓,承担了UVM中TLM的绝大部分实现代码。UVM中的IMP如下所示:

来源:UVM
源代码
uvm_blocking_put_imp#(T, IMP);
uvm_nonblocking_put_imp#(T, IMP);
uvm_put_imp#(T, IMP);
uvm_blocking_get_imp#(T, IMP);
uvm_nonblocking_get_imp#(T, IMP);
uvm_get_imp#(T, IMP);
uvm_blocking_peek_imp#(T, IMP);
uvm_nonblocking_peek_imp#(T, IMP);
uvm_peek_imp#(T, IMP);
uvm_blocking_get_peek_imp#(T, IMP);
uvm_nonblocking_get_peek_imp#(T, IMP);
uvm_get_peek_imp#(T, IMP);
uvm_blocking_transport_imp#(REQ, RSP, IMP);
uvm_nonblocking_transport_imp#(REQ, RSP, IMP);
uvm_transport_imp#(REQ, RSP, IMP);

IMP定义中的blocking、nonblocking、put、get、peek、get_peek、transport等关键字的意思并不是它们发起做相应类型的操作,而只意味着它们可以和相应类型的PORT或者EXPORT进行通信,且通信时作为被动承担者。按照控制流的优先级排序,UVM中三种端口顺序为:PORT、EXPORT、IMP。IMP的优先级最低,一个PORT可以连接到一个IMP,并发起三种操作,反之则不行。

IMP

IMP

PORT与IMP的连接

EXPORT与IMP的连接

PORT与PORT的连接

EXPORT与EXPORT的连接

blocking_get端口的使用

blocking_transport端口的使用

nonblocking端口的使用

nonblocking端口的所有操作都是非阻塞的,换言之,必须用函数实现,而不能用任务实现。

UVM中的通信方式

UVM中的analysis端口

analysis_port和analysis_export。这两者其实与put和get系列端口类似,都用于传递transaction。它们的区别是:

第一,默认情况下,一个analysis_port(analysis_export)可以连接多个IMP,也就是说,analysis_port(analysis_export)与IMP之间的通信是一对多的通信,而put和get系列端口与相应IMP的通信是一对一的通信(除非在实例化时指定可以连接的数量,参照4.2.1节A_port的new函数原型代码清单4-4)。analysis_port(analysis_export)更像是一个广播。

第二,put与get系列端口都有阻塞和非阻塞的区分。但是对于analysis_port和analysis_export来说,没有阻塞和非阻塞的概念。因为它本身就是广播,不必等待与其相连的其他端口的响应,所以不存在阻塞和非阻塞。

使用FIFO通信

FIFO

FIFO

用FIFO还是用IMP

每个人对于这个问题都有各自不同的答案。在用FIFO通信的方法中,完全隐藏了IMP这个UVM中特有、而TLM中根本就没有的东西。用户可以完全不关心IMP。因此,对于用户来说,只需要知道analysis_port、blocking_get_port即可。这大大简化了初学者的工作量。尤其是在scoreboard面临多个IMP,且需要为IMP声明一个后缀时,这种优势更加明显。

Last modification:February 24, 2022
恰饭环节