2. uvm_user_guide_1.2 -- TLM 通信
2.1 TLM-1的实现
2.1.1 Basics
2.1.1.1 Transactions
在UVM中,transaction是包含了两个组件之间传递的信息的类对象。例如,一个传输总线协议信息的transaction以如下方式建模:
class simple_trans extends uvm_sequence_item;
rand data_t data;
rand addr_t addr;
rand enum {WRITE, READ} kind;
constraint c1 { addr < 16'h2000; }
...
endclass
transaction对象包含变量、约束以及其他需要对transaction进行操作的域和方法。此外,上面的transaction可以被扩展到包含更多信息的transaction,也可以定义包含多个其他transaction的更高级别的transaction。
2.1.1.2 Transaction级通信
Transaction级的接口定义了一系列使用transaction对象作为参数的方法。一个TLM port 在特定的连接中定义了这些方法,TLM export 提供了这些方法的实现。将 port 连接到 export 后,在 port 中可以调用该方法进行执行。
2.1.1.3 基本TLM通信
最基本的transaction级操作允许一个组件将transaction put 到另一个组件。
producer的方块表示一个 port,consumer的圆圈表示一个 export。producer产生transaction然后通过其 put_port 发送:
class producer extends uvm_component;
uvm_blocking_put_port #(simple_trans) put_port;
...
put_port = new("put_port", this); // instantiated in build phase
...
virtual task run();
simple_trans t;
for(int i=0; i<N; i++) begin
put_port.put(t);
end
endtask
注:uvm_ * _port的参数是要传输的transaction类型
put() 方法由consumer实现:
class consumer extends uvm_component;
uvm_blocking_put_imp #(simple_trans, consumer) put_export;
...
task put(simple_trans t);
...
endtask
注:uvm_ * _imp的第一个参数是要传输的transaction类型,第二个参数是实现传输方法的对象类型
另一种与 put 操作相对应的操作是 get:
在这种情况下,consumer通过 get 端口向producer请求获取transaction。
class get_consumer extends uvm_component;
uvm_blocking_get_port #(simple_trans) get_port;
...
get_port = new("get_port", this); //