提高驗證生産力的關鍵之一就是在合适的抽象層次思考問題和完成驗證工作,為此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
轉自:公衆号數字晶片實驗室