数字IC验证系列之基本的TLM通信

提高验证生产力的关键之一就是在合适的抽象层次思考问题和完成验证工作,为此UVM提供了事务级别(transaction level)的通信接口(Transaction-Level Modeling,TLM)

在这里插入图片描述

在UVM中,Transactions建模了两个组件之间通信所需的信息(变量、约束等等)。下面是一个简单的总线协议事务示例:

class simple_trans extends uvm_transaction;
  rand data_t data;
  rand addr_t addr;
  rand enum {WRITE,READ} kind;
  constraint c1 { addr < 16’h2000; }
  ...
endclass

有了Transactions之后,还需要定义操作Transactions的接口。

TLM port 发起Transactions操作,TLM export提供这些操作Transactions方法的具体实现

Basic TLM Communication(put操作)

在这里插入图片描述

最基本的事务级别操作是一个**组件(component)**将事务put给另一个组件(component)。

producer上的方框表示port,consumer上的圆圈表示export。

producer组件代码如下

class producer extends uvm_component;
  uvm_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
      // Generate t.
      put_port.put(t);
    end
  endtask
endclass

producer组件首先定义了uvm_blocking_put_port,指定参数化事务为simple_trans。然后在run()函数内发起put操作。

consumer组件代码如下

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

consumer组件首先定义了uvm_blocking_put_imp,指定参数化事务为simple_trans,同时指定put函数的具体实现组件。put()函数的具体实现是在consumer内完成的。

Basic TLM Communication(get操作)

在这里插入图片描述

get事务级操作和put类似,

get_consumer上的方框表示port,get_producer上的圆圈表示export。

由get_consumer这个port处定义uvm_blocking_get_port,指定事务类型,发起get操作。

class get_consumer extends uvm_component;
  uvm_blocking_get_port #(simple_trans) get_port;
  function new( string name, uvm_component parent);
    get_port = new(“get_port”, this);
    ...
  endfunction

  virtual task run();
    simple_trans t;
    for(int i = 0; i < N; i++) begin
      // Generate t.
      get_port.get(t);
    end
  endtask
endclass

然后在export处完成get操作的具体实现

class get_producer extends uvm_component;
  uvm_blocking_get_imp #(simple_trans, get_producer) get_export;
  ...
  task get(output simple_trans t);
    simple_trans tmp = new();
    // Assign values to tmp.
    t = tmp;
  endtask
endclass

转自:公众号数字芯片实验室

おすすめ

転載: blog.csdn.net/weixin_44582960/article/details/106958277