TLM
使用事务级模型非常重要,因为任何事情在某一个抽象层面的思考会比陷入一堆琐碎的细节里效率要高得多。
UVM提供了TLM的接口从而可以将各个组件通过事务级的方式连接在一起。
Transaction
两个组件之间事务处理所需要的封装数据包。
TLM-1
基本的TLM通信
![image-20201016165601793](https://i-blog.csdnimg.cn/blog_migrate/892b121c79f343cbf6151a08fd2b80d4.png)
producer产生transaction并通过put端口发送给consumer。
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
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的put完成之后producer的put才能执行,否则将被阻塞。
![image-20201016170802180](https://i-blog.csdnimg.cn/blog_migrate/d8b360fd48aa851a2627e7219f1fbea9.png)
这个时候consumer通过get端口向producer请求transaction。
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
<