我在UVM SV测试平台上使用邮箱,并且在尝试写入邮箱时遇到了一些问题。我的代码看起来像吼叫:
class my_seqyuence extends uvm_sequence;
mailbox data;
some_user_defined_type mydata;
function new(string name = "my_sequence");
super.new(name);
data=new();
endfunction
task body();
forever begin
// blocking-get. program is blocked here... not why get is not returning...!
data.get(mydata);
decode_mydata_and_do_something_here;
end
endtask
function void writetrans(some_user_defined_type trans);
// I used print statements with mailbox size and i can see that valid trans is arriving here and successfully writing to mailbox.
data.try_put(trans)
endfunction
endclass
我不太确定出了什么问题......数据一直到达writetrans(*)函数,并且即使邮箱中有空格,它也最终无法写入。
答案 0 :(得分:3)
您的代码存在一些问题,但如果不确切知道如何协调调用函数和任务,则很难知道可能存在什么问题。
您应该始终测试try_put()
和try_get()
的结果,看看它们是否成功。
您应始终使用参数化邮箱进行更安全的类型检查
mailbox #(some_user_defined_type) data;
答案 1 :(得分:0)
1)anaylsis_export或anaylsis_imp用于连接监视器的分析端口。
2)由于您的邮箱无限制,请使用 put()而不是 try_put()。根据SystemVerilog LRM,try_put对于无界邮箱毫无意义。它仅用于非阻塞放入邮箱的项目。不确定什么是无意义的意思,但它可能意味着它没有按预期运作。
来自LRM -
try_put()方法在严格的FIFO中将邮件存储在邮箱中 订购。此方法仅对有界邮箱有意义。
3)在 get()方法之前使用邮箱的num()函数以确保它大于1.或者,您可以执行 try_get()并检查返回值是否为1(0->它为空,-1->类型不匹配)