2017-07-27 12 views
1

我有一個「而」循環爲OVM測試,看起來像這樣的部分:如何檢查特定超時條件後退出在OVM/Verilog的一個「而」循環

while (signal_val == 0) begin 
    signal_val = sla_vpi_get_value_by_name ("blah"); 
end 

我想限制此循環120微秒,然後退出。如果(signal_val == 0)在120μs結束時仍不滿足,我想退出測試。我如何實現這一目標?

我想我必須調用'global_stop_request()'退出測試,但試圖檢查while循環中的固定超時值(120μs)的現有條件似乎很棘手。此外,'休息'似乎並沒有工作。有任何想法嗎?

使用「休息」這樣一來,但「破」試圖給出一個語法錯誤:如您所期望

while (signal_val == 0) begin 
    signal_val = sla_vpi_get_value_by_name ("blah"); 
    #120us; 
    break; 
end 
+0

'break'不能正常工作?你是如何應用它的? – Serge

+0

但我在這裏意識到了兩件事:1.'break'給出了語法錯誤。 2.正在添加120微秒的延遲,但條件未被檢查120微秒。 – chmod

+0

你收到了什麼樣的錯誤信息? – Serge

回答

2

您的代碼將無法正常工作。讓我們一起來看看:

while (signal_val == 0) begin 
    signal_val = sla_vpi_get_value_by_name ("blah"); 
    #120us; 
    break; 
end 

signal_val在while語句初步評價只有一次,而且因爲它是0,你進入while循環

signal_val得到你的函數調用的返回值。這發生在與之前的while評估相同的模擬週期中。假設沒有變化,你會得到0作爲返回值再次

現在,函數等待120us

最後,它擺脫了while循環。 signal_val不會再次評估。

達到你想要的功能,您將需要使用fork...join和一個看門狗任務

fork 
    begin: wait_signal_val 
    while (signal_val == 0) begin 
     signal_val = sla_vpi_get_value_by_name ("blah"); 
     if (signal_val == 1) begin 
     `uvm_info(get_name(), "YES!! signal_val was seen as 1", UVM_LOW); 
     end 
     else begin 
     #20ns; // (or some clocking mechanism) 
     end 
    end 
    end 

    begin: watchdog 
    #120us; 
    `uvm_fatal(get_name(), "NOPE!! signal_val is still 0 after 120us. Killing test"); 
    end 
join_any 
disable fork 

在上面的代碼,無論是watchdogwait_signal_val完成。當發生這種情況時,fork ... join_any完成並禁用fork。

我在我的測試平臺中使用了很多功能,就像你描述的那樣,它可以無縫工作。

+0

Got it!在你回答之前,我剛剛在這個問題上搜索了類似的東西。你認爲這是相似的嗎?哪種方法更好? '* fork looping_code; //進程1 #120us; //處理2 join_any global_stop_request(); *' – chmod

+0

嘿,如果它能完成這項工作,那很好!你的解決方案看起來更優雅如果你喜歡這個答案,請接受:) – noobuntu