2017-09-25 172 views
0

我試圖驗證兩個模塊之間的一個非常簡單的握手。一個模塊處於慢速時鐘並提高「請求」,較快的模塊應該在下一個快速時鐘上提高「確認」並保持它,直到下一個慢速時鐘爲止。最終的結果是這樣的:e HVL(IEEE 1647):期望的表達意外失敗

req-ack wave diagram example

這是我寫的期待:

expect expect_ack_when_req_go is 
     (@req_rise_e) => @ack_rise_e 
     else dut_error("ERROR: ack expected to be asserted when req rises!"); 

*既@req_rise_e和@ack_rise_e是在慢時鐘採樣。

運行模擬器會產生錯誤,因爲第一個表達式似乎成功了,但第二個表達式沒有成功。儘管事件追蹤到wave時,我可以看到兩個事件一起發生(如wave:event_req,event_ack中所見)。

+0

我會先嚐試添加一個採樣時鐘給TE,即'expect ...(@req_rise_e => @ack_rise_e)@slow_clk;' – Thorsten

+0

已經嘗試過了,它沒有做任何好處...此外,我認爲這是多餘的,因爲這兩個事件已經被慢速時鐘採樣: 'event req_rise_e is rise(smp.port_req $)@slow_clk_e;' 'event ack_rise_e is rise(smp.port_ack $)@slow_clk_e;' –

+0

好吧,@ Thorsten看起來你是對的!看起來,在兩個**信號上增加一個採樣時鐘一起改變了模擬器理解檢查表達式的方式。我按照你所建議的方式改變了它,但它仍然奏效......儘管我無法解釋它......如果你能理解它,也許你應該將它作爲解決方案發布? –

回答

3

你試圖做重疊的含義,即你的事件發生在同一個週期。 =>操作員所做的是檢查結果是否發生在下一個採樣事件上,在這種情況下是下一個慢時鐘邊沿。這被稱爲SystemVerilog斷言術語中的非重疊含義。

您可以通過編寫以下得到您想要的行爲:

expect expect_ack_when_req_go is 
    (@req_rise_e) => detach({@ack_rise_e; ~[1]}) 
    else dut_error("ERROR: ack expected to be asserted when req rises!"); 

充分說明here

在方法論上,我建議不要以不同的方式編寫時態表達式。我假設您正在驗證正在驅動的模塊ack,並且此模塊在兩個時鐘均可工作。我還假設這個模塊用快速時鐘取樣req。這將是更清晰的制定你的支票:

expect expect_ack_when_req_go is 
    (@req_rise_at_fast_clock_e) => @ack_rise_at_slow_clock_e 
    else dut_error("ERROR: ack expected to be asserted when req rises!"); 

這樣你就不必更動detach(...)expect你想要的行爲的自然語言描述更匹配。

+0

好,很好的回答!我隱約想起在SVA上有兩個蘊涵運算符,但是自從我處理了任何SystemVerilog代碼後,這已經有一段時間了。在您的博客上也有很好的技術解釋。此外,你在方法論上也是正確的,這就是我要做的修復。謝謝。 –