2014-04-12 62 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->類型不匹配)