2 TLM

1 TLM basic

Transaction-level interface有 两种,一种是port/export,另一种是analysis port/analysis export。

1.1 port/export

1.1.1 using put() and get() method实现blocking通信

先说port/export,又分为两种即blocking和non-blocking,以下图作为一个例子,写法如下:

在这里插入图片描述

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

注意这里调用的put_port.put()定义在后面consumer里的put_export里面。

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

这个例子讲了port和export的put method,下面的例子讲port和export的get method。
在这里插入图片描述
在这个例子中,get_consumer发起request(get_port.get(t)),但是transaction方向还是有producer向consumer。

   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

这个get的实现是在producer里面。

    class get_producer extends uvm_component;
    	uvm_blocking_get_imp #(simple_trans, get_producer) get_export;
    	...
    	task get(output simple_trans t);
    		simple_trans tmp = new();
    		// Assign values to tmp.
    		t = tmp;
    	endtask
   endclass

结论一:由于put和get method的implement都在对方component中实现,所以必须等对对方component中处理完才能进行下一个transaction的通信,故此体现出blocking的特点。

1.1.2 using try_get/put/peer method实现non-blocking通信

对于non_blocking的port/export,写法如下:

class consumer extends uvm_component;
	uvm_get_port #(simple_trans) get_port;
	task run;
		...
		for(int i=0; i<10; i++)
		if(get_port.try_get(t))
		//Do something with t.
		...
	endtask
endclass

这里用if(get_port.try_get(t))来request。

1.1.3 using fifo

在这里插入图片描述
不同的verfication component之间也可以用uvm_tlm_fifo来实现通信。
值得注意的是,如果用两个连续的get,那么consumer将得到两个不同的transaction,如果用两个连续的peer,那个consumer将得到两个相同的transaction,这是英文peer method返回available transaction的copy。

1.1.4 层次化和封装带来的connection类型问题

通常一个port connect一个 export,但是由于testbench中component之间的层次化封装带来了一些问题,如下图所示:
在这里插入图片描述
A、B、D、F都是port和export的连接,这种类型一般称为peer-to-peer connection,C和E则不是,C是port-to-port,E是export-to-export,
port-to-port 的rule是:subcomponent.port.connect(port);
export-to-export 的rule是:export.connect(subcomponent.export);
总结如下:
在这里插入图片描述

1.2 analysis port/export(imp)

analysis port/export(imp)提供了另外一种interface,其与port/export不同之处在于:
port需要有一个对应的export来提供put函数的实现(implementation), 而analysis port则不一定需要。
uvm_analysis_port调用write函数,而write函数的实现则在target export/imp里。
在实际实践中,一个典型应用是在monitor里使用uvm_analysis_port,调用write函数来实现transaction发送,在uvm_scoreboard里使用uvm_analysis_export(imp),并实现write函数实现transaction接收。但是有时候scoreboard不单要用一个uvm_analysis_imp来接收来自monitor的transaction,还要有另外一个uvm_analysis_imp来接收reference model或者predictor输出的transaction,所以要有两个write函数实现,为了避免名字冲突,UVM采用的方法是首先用宏码声明两个后缀不一样的imp, UVM会根据两个后缀内建两个新的imp

`uvm_analysis_imp_decl(_ep1)
`uvm_analysis_imp_decl(_ep2)
uvm_analysis_imp_ep1 #(transaction, scoreboard)     scb_imp1;
uvm_analysis_imp_ep2#(transaction, scoreboard)      scb_imp2;

然后分别定义两个port的write函数实现
function void write_ep1(transaction txn);
function void write_ep2(transaction txn);

需要注意的一点是
analysis port广播出去的是handle,并没有为每一个export/imp的transaction分配alloction,如果两个imp都接收transaction, 那么其中一个imp修改transaction会导致另一个imp看到修改后的transaction. 所以好的习惯是在write function里面首先 new一个 transaction,并对传输过来的transaction进行copy后,再进行后面的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在UVM TLM中,push模式是一种传输方式,用于模块之间的通信。在push模式下,一个模块可以将事务推送给另一个模块,而不需要等待另一个模块主动请求。这种方式可以实现异步通信,提高系统的并发性和效率。 在具体实现上,push模式通过调用put方法将事务推送给目标模块。在UVM中,可以使用put方法将事务放入一个消息队列或传输对象中,然后通过分析接口或端口传递给目标模块。这样目标模块就可以在适当的时候从队列或传输对象中获取事务进行处理。 例如,在UVM TLM中的邮箱中存取事务的实现中,put方法被用来将事务存入邮箱,以供其他模块使用。具体实现可以类似于下面的代码: virtual task put(input T t); m.put(t); // 将事务存入邮箱 put_ap.write(t); // 分析接口传递事务给目标模块 endtask 通过使用push模式,模块之间可以实现高效的异步通信,提高系统的灵活性和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UVM TLM1.0简单介绍](https://blog.csdn.net/hh199203/article/details/118019910)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [UVM之TLM port基础](https://blog.csdn.net/hungtaowu/article/details/126021945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [[UVM]UVM TLM1.0 Interface归纳总结 — 图解UVM TLM1.0 Interface](https://download.csdn.net/download/weixin_38620314/14031191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值