另外再提一点细节,因为我们调用的TLM端口时blocking类型的,所以可以有延时,因此我们使用的put函数是一个task类型,如果我们定义的TLM端口时non-blocking类型的,那么就要定义function try_get和can_put等,同样的后面也要加上对应的宏定义后缀。不仅如此,使用旗语semaphore也不能使用key.get,而是使用key.try_get(),如果ge...
所有metnod(包括get()、try-get和can-get)都必须在producer中实现,并且method调用需要从consumer调用。 Imp端口具有该method的实现。 uvm_get_port/ imp using int `include"uvm_macros.svh"importuvm_pkg::*;classproducerextendsuvm_component;uvm_get_imp#(int,producer)tlm_imp;`uvm_component_utils(producer)...
所以说,TLM促进了验证环境开发的模块化,因为一个清晰的接口定义,所以组件很容易复用。 相反的操作是get。 在这种情况下,consumer 通过其get端口向producer 请求transactions : class get_consumer extends uvm_component; uvm_blocking_get_port #(simple_trans) get_port; function new( string name, uvm_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_...
2.uvm_put/get_port与uvm_tlm_fifo使用示例(nonblocking) 2.1 top.sv 1interface clk_bfm;2bit clk;3initialclk =0;4always#7clk = ~clk;5endinterface : clk_bfm678moduletop;9import uvm_pkg::*;10`include"uvm_macros.svh"1112import example_pkg::*;1314clk_bfm clk_bfm_i();1516initialbegin17...
this.nbg_port.try_get(otr); #调用imp端的try_get()方法,拿到otr end endclass class comp2 extends uvm_compoent; uvm_blocking_put_imp #(itrans,comp2) bp_port; uvm_nonblocking_put_imp #(otrans,comp2) nbg_port; itrans itr_q[$]; ... task put(itrans t); #定义imp端的put方法 itr_...
TLM里的各种port、export、imp连接时必须要严格配对使用。 uvm_block_get_port必须要连接到实现了get算法的imp上去,并且调用的通信算法必须是get(task),因为源代码里对类uvm_block_get_port里面的通信方法已经规定死了,如下图所示: 下图为port相关的几个类的定义 UVM_PORT_COMMON宏的定义: UVM_BLOCKING_PUT_IMP...
UVM之TLM通信中的PORT、EXPORT和IMP 1、PORT、EXPORT和IMP端口简介 LTM通信有三种常用的操作:put操作、get操作和transport操作。其中发起者具有的端口是PORT,接收者具有的端口是EXPORT。这三种操作都有阻塞与非阻塞之分。 常用的PORT端口有: 常用的EXPORT端口有: 常用的IMP端口有: PORT具有高优先级,EXPORT具有中优先...
下面是tlm_fifo的端口。 put_export:用户可以调用put,try_put,can_put。 put_ap:调用put方法写入数据的同时也会通过改端口的write函数送出。 get_peek_export:get,try_get,can_get,peek,try_peek,can_peek get_ap:调用get,peek读出数据通过write送出...
get()是从TLM FIFO获取事务的阻塞调用。因此如果FIFO中没有可用的事务,则任务get()将等待。 try_get()是一个非阻塞调用,即使FIFO中没有可用的事务,也会立即返回。try_get()的返回值指示是否返回有效事务项。 16、analysisports和TLM ports之间有什么区别?analysisFIFOs和TLM FIFO有什么区别?analysis ports/ FIFO...