关于uvm中的 接口port.get函数的使用 向请教一下
时间:10-02
整理:3721RD
点击:
最近在学习UVM看资料 在scoreboard中 有如下逻辑
taskmy_scb::main_phase(uvm_phase phase);
my_transaction get_expect, get_actual;
bit result;
super.main_phase(phase);
fork
while(1) begin
exp_port.get(get_expect);
expect_queue.push_back(get_expect);
end
xxxx
上面的expect_queue在scb 中已经声明过了,是个queue。
我的疑问是 TLM 接口 exp_port调用get函数,传入的transaction 给get_expect ,那么get_expect 不用实例化就直接可以用吗?
另外 expect_queue.push_back(get_expect); 也可以直接使用get_expect?
求大神解惑 ,谢谢!
taskmy_scb::main_phase(uvm_phase phase);
my_transaction get_expect, get_actual;
bit result;
super.main_phase(phase);
fork
while(1) begin
exp_port.get(get_expect);
expect_queue.push_back(get_expect);
end
xxxx
上面的expect_queue在scb 中已经声明过了,是个queue。
我的疑问是 TLM 接口 exp_port调用get函数,传入的transaction 给get_expect ,那么get_expect 不用实例化就直接可以用吗?
另外 expect_queue.push_back(get_expect); 也可以直接使用get_expect?
求大神解惑 ,谢谢!
引用传递。
这个跟你定义exp_port时的那个#my_transaction是有关的,由uvm底层搞好了
谢谢回复 我已经搞懂了
那个exp_port是个指针,指向了传入的tr,因此没有问题。所有后面的push_back是可以直接写的。
virtual task get(output T t)
Provides a new transaction of type T.
The calling thread is blocked if the requested transaction cannot be provided
immediately.The new transaction is returned in the provided output argument.
The implementation of get must regard the transaction as consumed.Subsequent calls
to get must return a different transaction instance.
个人认为这个和get这个task的定义有关,和指针没什么关系
例子中的代码可能会有问题,当你收到不同的transaction的时候,而dut 的get_actual 经过的时间长一些的话,你会发现queue里面数据全部是一样的。
想搞明白这个最好看下uvm的底层代码,看下exp_port中get是如何工作的