Loading

uvm实战:uvm TLM1.0 通信复习

TLM复习

put等函数是在哪里实现的?

A_port被连接到B_export,而B_export被连接到B_imp。当写下 A.A_port.put(transaction)时,此时B.B_imp会通知B有transaction过来了,这个过程是如何进行的呢?可以简单理解成 A.A_port.put(transaction)这个任务会调用B.B_export的put,B.B_export的put(transaction)又会调用B.B_imp的 put(transaction),而B_imp.put最终又会调用B的相关任务,如B.put(transaction)。所以关于A_port的操作最终会落到B.put这个 任务上,这个任务是属于B的一个任务,与A无关,与A的PORT无关,也与B的EXPORT和IMP无关。也就是说,这些put操作最终 还是要由B这个component来实现,即要由一个component来实现接口的操作。所以每一个IMP要和一个component相对应。

  • 当A_port的类型是nonblocking_put(为了方便,省略了前缀uvm_和后缀_port,下同),B_imp的类型是nonblocking_put(为了 方便,省略了前缀uvm_和后缀_imp,下同)时,那么就要在B中定义一个名字为try_put的函数和一个名为can_put的函数。

  • 当A_port的类型是nonblocking_get,B_imp的类型是nonblocking_get时,那么就要在B中定义一个名字为try_get的函数和一个名 为can_get的函数。

  • 当A_port的类型是peek,B_imp的类型是peek时,那么就要在B中定义3个接口,一个是peek任务/函数,一个是try_peek函数, 一个是can_peek函数。

  • 当A_port的类型是transport,B_imp的类型是transport时,那么就要在B中定义两个接口,一个是transport任务/函数,一个是 nb_transport函数。

transport端口使用

双向端口,transport系列端口与put和get系列端口都不一样。在put和get系列端口中,所有的通信都是单向的,而在transport系列端口中, 通信变成了双向的。

声明:

uvm_blocking_transport_port#(my_transaction, my_transaction) A_transport;

对应在另一端需要声明uvm_blocking_transport_imp,并且实现transport函数,在其中实现req接收和rsp发送,参数B对应的是所在组件。

uvm_blocking_transport_imp#(my_transaction, my_transaction, B) B_imp;

非阻塞时候的情况

需要实现try_xxx and can_xxx的函数,由于端口变为了非阻塞的,所以在送出transaction之前需要调用can_put函数来确认是否能够执行put操作。

能够一对多的analysis port

对应连接的需要是analysis_imp;需要在imp所在组件里面实现write函数。

component里面有多个组件,使用

scoreboard 和 monitor的连接

三种连接方式:

  • 在env中连接:o_agt.mon.ap.connect(scb.scb_imp);

  • 在agent中声明例化一个ap,然后在agent里mon.ap.connect(this.ap)让port 和port先连接,然后在env中o_agt.ap.connect(scb.scb_imp)

  • 在agent中声明但不例化

posted @ 2022-07-28 23:13  pu1se  阅读(178)  评论(0)    收藏  举报