微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 利用mailbox怎么传递数据

利用mailbox怎么传递数据

时间:10-02 整理:3721RD 点击:
小弟有两个UVC(A_UVC和B_UVC),A_UVC的driver里有一个cfg的类,我想通过mailbox机制将这个cfg传送到B_UVC的Driver。
我在A的driver里面定义一个mailbox_A,然后把cfg put进去,在B的driver中定义一个mailbox_B;然后我在B的driver里面怎么get都拿不到东西啊?

除了在两个driver里面定义mailbox之外,还应该怎么处理才能让B的driver拿到A通过mailbox发送的数据呢?

没有用过mailbox,求高人指点一下!
不甚感激!

你需要在一个顶层中将mailbox_A和mailbox_B连接起来,你这么做了吗?
下面是我提出来的一些代码,你看看吧。
在生成器gen.sv中定义mailbox,其中gen是类,所以在构造函数中将其端口连接
mailbox gen2mas;
function new(mailbox gen2mas, );
this.gen2mas= gen2mas; //将外部的mailbox和class中的mailbox连接
endfunction
task put;
gen2mas.put(my_tr);
endtask


//由于程序要求,有用到interface,你不用管它。
在master.sv中使用mailbox//class
mailbox apb_mbox();
function new (virtual apb_if.Master apb,mailbox apb_mbox);
this.apb= apb;
this.apb_mbox = apb_mbox; //将外部的mailbox和class中的mailbox连接
endfunction

task get();
apb_mbox.get(tr);
endtask

在顶层Test.sv中将mailbox连接起来。
program automatic test(apb_if.Master apb);
apb_gengen;
apb_mastermst;

apb_mbox= new();
gen= new(apb_mbox);
mst= new(apb, apb_mbox);

endprogram

一直使用TLM port,没怎么用mailbox。
我来追问一句,这种场景下,mailbox和TLM port用什么区别呢?

用UVM的话为什么不直接create A_UVC对应的cfg 然后使用config_db机制把这个cfg 分别setA_UVC和B_UVC ,还使用SV 底层的mailbox .
如果是A_UVC中要在run_phase 动态的改变 cfg, 建议使用uvm_event trigger然后B_UVC里面wait trigger data

不需要2楼说的那样在将两个邮箱接起来,有些地方应该也是有些不准确的。
在A_UVC的driver中:
mailbox mbx;
cfg cfg0;function new(mailbox mbx);
this.mbx = mbx;
endfunction
task mbx_put;
cfg0 = new();
mbx.put(cfg0);
endtask
在B_UVC的Driver中:
mailbox mbx;
cfg cfg0;
function new(mailbox mbx);
this.mbx = mbx;
endfunction
task mbx_get;
mbx.get(cfg0);
endtask
这样就可以了,在B_UVC的Driver中后续中调用cfg0,就是你之前从邮箱中取出来的。
只需要在A_UVC和B_UVC共同的顶层实例化mbx即可

你都用 UVM 了, 何不用uvm_config_db

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top