UVM_USERS_GUIDE_TLM

2 TLM

2.1 overview

验证生产力的关键之一是在有意义的抽象级别上考虑问题。在验证处理来回传输的数据包、处理指令或执行其他类型的功能的DUT时,必须创建支持适当抽象级别的验证环境。

UVM提供一组事务级别的通信接口和通道,您可以使用它们在事务级别连接组件。TLM接口的使用将每个组件与整个环境中其他组件的更改隔离开来。

本章讨论了UVM中事务级通信的基本要素,并说明了如何将事务级组件组装到验证环境中的机制。

2.2 TLM,TLM1.0,TLM2.0

TLM是事务级建模,是一种用于构建高度抽象的组件和系统模型的建模风格。

TLM-1和TLM-2.0是两个TLM建模系统,作为构建事务级模型的行业标准而开发。它们都是在SystemC中构建的,并在Open SystemC Initiative (OSCI)的TLM工作组中标准化。TLM-1在2005年实现了标准化,TLM-2.0在2009年成为标准。OSCI于2013年与Accellera合并,目前采用的SystemC标准为IEEE 1666-2011标准

TLM-1和TLM-2.0有共同的传统,许多开发TLM-1的人也从事TLM-2.0的工作。在其他方面,它们是完全不同的。TLM-1是一个消息传递系统。接口不是非定时的,就是依赖于目标进行定时,没有一个接口提供显式的定时注释。TLM-2.0虽然仍然支持数据传输和独立进程之间的同步,但主要用于基于内存映射总线的系统的高性能建模。这两种功能的一个子集已经在SystemVerilog中实现,可以作为UVM的一部分使用。

2.3 TLM1.0

2.3.1Basics

1.Transactions

在UVM中,事务是一个类对象,它包含建模两个组件之间通信单元所需的任何信息。在最基本的示例中,一个用于传输信息的简单总线协议事务的建模如下:

class simple_trans extends uvm_sequence_item; 
    rand data_t data; 
    rand addr_t addr; 
    rand enum { WRITE, READ} kind; 
    constraint cl { addr<16'h2000;}

    ...

endclass

事务对象包括在事务上生成和操作所需的变量、约束和其他字段和方法。显然,完全指定总线事务所需的信息通常不止这些。事务中封装的信息的数量和细节是模型抽象级别的指示。可以对事务进行组合、分解、扩展、分层以及其他操作,以在任何抽象级别上建模任何必要的通信。

2.Transaction_level Communication

事务级接口定义了一组使用事务对象作为参数的方法。TLM port 定义用于特定连接的一组方法(应用程序编程接口(API)),而TLM export 提供这些方法的实现。将端口 port 连接到 export 允许在调用端口 port 方法时执行相应的实现。

扫描二维码关注公众号,回复: 4121463 查看本文章

3.Basic TLM Communication

最基本的事务级操作允许一个组件将事务 put 到另一个组件中。

producer上的方框表示port,consumer上的圆圈表示export。生产者生成事务并将其发送到其put_port:

class producer extends uvm_component; 
    uwm_blocking_put_port #(simple_trans) put_port;//1 parameter
    function new(string name, uvm_component parent); 
    put_port=new("put_port", this); 
    endfunction

    virtual task run();

    simple_trans t; 
    for(int i=0;i<N;i++) begin
    put_port. put(t);
    end
    endtask

consumer提供put()调用的实际实现。

class consumer extends uvm component; 
    uvm_blocking_put_imp #(simple_trans, consumer) put_export;//2 parameters
    ...
    task put(simple_trans t);
        case(t. kind) 
            READ://Do read.
            WRITE://Do write.
        endcase
    endtask
endclass

相反的运算是get(),在这种情况下,consumer通过其get端口向producer请求事务:

4.Communication between process

在上面的基本put示例中,consumer只有在调用其put()方法时才会激活。在许多情况下,组件可能需要独立操作,此时producer在一个进程中创建事务,而consumer需要在另一个进程中对这些事务进行操作。UVM提供uvm_tlm_fifo通道来促进这种通信。uvm_tlm_fifo实现了所有TLM接口方法,因此生产者将事务放入uvm_tlm_fifo中,而消费者独立地从fifo中获取事务

当producer事务放入fifo中时,如果fifo满了,它将阻塞,否则它将把对象放入fifo并立即返回。如果事务可用,get操作将立即返回(然后将从fifo中删除),否则它将阻塞,直到事务可用。因此,两个连续的get()调用将为使用者产生不同的事务。相关的peek()方法返回可用事务的副本,而不删除它。两个连续的peek()调用将返回相同事务的副本。

5.Blocking versus Nonblocking

相反,非阻塞调用会立即返回。非阻塞调用的语义保证调用在发出它的相同的delta循环中返回,也就是说,不需要花费任何时间,甚至不需要一个delta循环。在UVM中,非阻塞调用被建模为函数

6.Connecting Transaction-Level Components

使用为事务级组件定义的poet和export,它们之间的实际连接通过父组件(组件或env)中的connect()方法来完成,其参数是要连接到的对象(端口或导出)。

7.Peer-to-Peer connections

8.Port/Export Compatibility

2.3.2  Encapsulation and Hierarchy

TLM接口的使用将验证环境中的每个组件与其他组件隔离开来。环境实例化一个组件,并将其端口/导出连接到它的邻居(s),而不需要进一步了解具体实现。较小的组件可以分层地分组以形成较大的组件。对子组件的访问是通过使它们的接口在父级可见来实现的。在这个级别上,父组件看起来只是一个组件,上面有一组接口,而不管它的内部实现是什么。

1.Hierarchical Connections

跨层次边界建立连接涉及到一些其他问题,本节将讨论这些问题:

C和E的连接方式与之前展示的不同。连接C是port到port的连接,连接E是export到export的连接。这两种连接是完成分层连接所必需的。连接C从外部组件导入port到内部组件。连接E export在层次结构中从内部组件向上导出到外部组件。最终,每个事务级别的连接都必须解析,以便port连接到export。但是,端口和导出终端不需要位于层次结构中的相同位置。我们使用port-port和export-export连接将连接器引入层次结构边界,以便在层次结构的下一层进行访问。

2.Connection Types

2.3.3  Analysis Communication

如上所述的put / get通信允许创建验证组件,其模拟系统的“操作”行为。 每个组件负责通过其TLM接口与系统中的其他组件进行通信,以便刺激DUT中的活动和/或响应其行为。 但是,在任何相当复杂的验证环境中,特别是在应用随机化的情况下,应将收集的事务分发到环境的其余部分,以进行端到端检查(记分板)或额外的覆盖率收集。

两种类型的TLM通信之间的关键区别在于put / get端口通常需要相应的export来提供实现。 然而,对于analysis,重点在于特定组件(例如监视器)能够产生事务流,而不管是否存在实际连接到它的目标。 然后将模块化analysis组件连接到analysis_port,每个组件以特定方式处理事务流

1 Analysis Ports

uvm_analysis_port是一个专用的TLM端口,其接口由一个函数write()组成。analysis端口包含与之连接的analysis_exports列表(广播形式)。当组件调用analysis_port.write()时,analysis_port循环遍历列表并调用每个连接导出的write()方法。如果没有连接,write()调用将返回。因此,分析端口可以连接到零个、一个或多个分析导出,但是写入到分析端口的组件的操作并不依赖于连接的导出的数量,因为write()是一个void函数。

2 Analysis Exports

与其他TLM连接一样,连接到分析端口的每个组件都可以通过analysis_export提供write()的实现。 uvm_subscriber基本组件可用于简化此操作.

当多个subscribers连接到analysis_port时,每个subscribers都被传递到同一个事务对象的指针,即write()调用的参数。每个write()实现都必须创建事务的本地副本,然后对副本进行操作,以避免为任何其他可能收到相同指针的subscribers服务器破坏事务内容。

2.4 TLM2.0

猜你喜欢

转载自blog.csdn.net/qq_41394155/article/details/84168415