uvm通信-uvc通信方式一之blocking/nonblocking_get/put/transport_port/export/imp

1.根据阻塞非阻塞,端口可分为uvm_blocking_*,uvm_nonblocking_*与uvm_*;

(1) nonblocking端口的所有操作都是非阻塞的,换言之,必须用函数实现,而不能用任务实现;

(2) uvm_blocking*只支持阻塞操作,uvm_nonblocking_*只支持非阻塞操作,uvm_*既支持阻塞操作,又支持非阻塞操作;

2.根据get/put/transport/peek/get_peek,端口可分为uvm_blocking/nonblocking_get_*, uvm_blocking/nonblocking_put*, uvm_blocking/nonblocking_transport*等;

 

3.根据port/export/imp,端口可分为uvm_*blocking_put/get/transport_port/export/imp;

(1) PORT, EXPORT, IMP体现的是控制流,在这种控制流中,PORT具有高优先级, EXPORT具有低优先级, IMP的优先级最低.

4.uvm_blocking_put*端口的使用

4.1不同类型port之间的连接(port/export/imp)以及imp与IMP的介绍

4.1.1PORT->EXPORT

(1) 仅有PORT与EXPORT,并实现二者的连接是不够的,需要端口IMP的参与,只有IMP可以作为连接关系的终点;

4.1.2imp与IMP

(1) 下图中的imp指的是一种tlm port类型,与port, export, imp相对应; 

(2) 下图中的IMP指的是实现这个imp接口的component; 

4.1.3PORT->EXPORT->IMP

(1)A_port连接到B_export, B_export连接到B_imp;

(2)调用A.A_port.put(transaction)操作时, 会调用B.B_export.put(transaction); B.B_export.put(transaction)会调用B.B_imp.put(transaction); B.B_imp.put(transaction)会调用B.put(transaction).

(3)最终A_port的操作会落到B.put上, 这个task是属于B的task,需要由B这个component来实现,所以IMP要和一个component相对应.

(4)port/export/imp的连接既connect函数的调用一定要在component的connect_phase实现;

4.1.4PORT->IMP(以uvm_blocking_put_*为例)

4.1.5EXPORT->IMP(以uvm_blocking_put_*为例)

(1) PORT可以与IMP相连接,同样EXPORT也可以与IMP相连接,其连接方法与PORT和IMP的连接完全一样;

4.2 同种类型port之间的连接(port与port, export与export)

4.2.1 PORT->PORT(以uvm_blocking_put_*为例)

(1) 在UVM中,支持带层次的连接关系;PORT与PORT之间的连接不止局限于两层,可以有无限多层.

4.2.2 EXPORT->EXPORT(以uvm_blocking_put_*为例)

(1) UVM同样支持EXPORT与EXPORT之间的连接;

(2) EXPORT与EXPORT之间的连接也不只限于两层,也可以有无限多层;

 

 

5.uvm_blocking_get端口的使用

(1) 与blocking_put系列端口类似, blocking_get_port也可以直接连接到blocking_get_imp,同时blocking_get_port也可以连接到blocking_get_port, blocking_get_export也可以连接到blocking_get_export; 但是在这些连接关系中,连接的终点必须是一个IMP.

(2) 在下图中,数据流仍然是从A到B,但是A由动作发起者变成了动作接收者,而B由动作接收者变成了动作发起者;

 

 

 

 

 6.uvm_blocking_transport端口的使用

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

(2) A中调用transport任务,该task有两个参数,A中把生成的transaction作为transport的第一个参数;B中的transport任务接收到这笔transaction,会根据这笔transaction做某些操作,并把操作的结果作为transport的第二个参数发送出去; A根据接收到的rsp决定后面的行为;

 

 

7.nonblocking端口的使用(以nonblocking_put为例)

(1) nonblocking端口的所有操作都是非阻塞的,换言之,必须用函数实现,而不能用任务实现;

(2) 示例:

注1:由于端口变成了非阻塞的,所以在送出transaction之前需要调用can_put函数来确认是否可以执行put操作,如上图所示;

注2:A中也可以不使用can_put,而直接调用try_put;这种情况下,即使不使用can_put,B中依然需要定义一个名字为can_put的函数,函数里可以没有任何内容;

 

posted on 2021-11-16 19:36  知北游。。  阅读(2454)  评论(0编辑  收藏  举报

导航