0

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

4

2 回答 2

3

您的代码存在一些问题,但在不确切知道如何协调函数和任务的调用的情况下,很难知道可能是什么问题。

您应该始终测试结果try_put()try_get()查看它们是否成功。

您应该始终使用参数化邮箱进行更安全的类型检查

mailbox #(some_user_defined_type) data;
于 2014-04-12T03:40:45.663 回答
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->类型不匹配)

于 2016-10-14T14:33:19.930 回答