无法在systemverilog邮箱中写入

时间:2014-04-12 00:59:45

标签: verilog system-verilog uvm

我在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(*)函数,并且即使邮箱中有空格,它也最终无法写入。

2 个答案:

答案 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->类型不匹配)