2014-04-12 31 views
0

我在使用邮箱进行UVM SV测试并在试图在邮箱中写入时遇到了一些问题。我的代码看起来像波纹管:未能在systemverilog邮箱中写入

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(*)的功能,并最终它的失败,即使有空间的邮箱写。

回答

3

有几个问题与你的代码,但不知道你是如何协调的功能和任务的调用,很难知道什么可能是问题。

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

你应该总是使用更安全的类型参数化邮箱检查

mailbox #(some_user_defined_type) data; 
+0

我通过扩展uvm_component创建了一个分析端口。分析端口与监视器事务端口连接以接收DUT请求。在分析端口的写入实现中,我调用上述代码中提到的writetrans(*)函数来传递接收到的请求。邮箱正在写入数据。我有点失落,因为我不明白为什么get()不工作...... – newbie

0

1)anaylsis_export或anaylsis_imp用于连接到显示器的分析端口。

2)由于您的邮箱是无界的,使用的put()的而不是try_put()。根据SystemVerilog LRM的说法,try_put对于无限制的邮箱来说毫无意义。它仅用于将项目无阻塞地放入邮箱。不知道什么毫无意义的手段,但它可能意味着它没有按预期发挥作用。

从LRM -

的try_put()方法存储在邮箱中严格FIFO 顺序的消息。此方法仅对有界的邮箱有意义。

3)使用NUM()邮箱的功能,您GET()之前方法,以确保它是大于1或者,你可以做一个try_get()并检查返回值是1(0->它是空的,-1->类型不匹配)