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的函数,函数里可以没有任何内容;