天天看點

數字IC驗證系列之基本的TLM通信

提高驗證生産力的關鍵之一就是在合适的抽象層次思考問題和完成驗證工作,為此UVM提供了事務級别(transaction level)的通信接口(Transaction-Level Modeling,TLM)。

數字IC驗證系列之基本的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操作)

數字IC驗證系列之基本的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操作)

數字IC驗證系列之基本的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
           

轉自:公衆号數字晶片實驗室