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

EDA/IC设计

1048人已加入

描述

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

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操作)

TLM

最基本的事务级别操作是一个 组件(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操作)

TLM

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
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分