-1

我想合成延遲寫爲## 1的SystemVerilog代碼,但合成器給出了語法錯誤,因爲延遲是不可合成的。我想知道有什麼方法可以延遲合成嗎? (req1 == 1)## 1(req1 == 1)## 1!(req2 == 1)||(gnt1)(0) == 0));Verilog中的可合成延遲

我怎樣才能綜合這個而不會失去它的行爲?

回答

1

屬性不是Verilog的一部分,而是SystemVerilog的一部分。更重要的是,屬性本身也不可綜合。屬性用於模擬環境中的coverassert語句。

至於延遲,您唯一的選擇是使用觸發器來延遲信號。在你的財產##1意味着「在下一個邊緣」假設你的財產有一些與它有關的時鐘(無論是在蓋/斷言陳述或它是在一個時鐘塊內)。

要以其他方式合成的代碼創建綜合的週期延遲:

[email protected](posedge ck or posedge arst) begin 
    if(arst) 
    data_delayed <= '0; 
    else 
    data_delayed <= data; 
end 
+0

是的,你是正確的代碼中的屬性是使用SystemVerilog斷言指定的。我實際上是試圖將硬件描述代碼轉換爲可正式驗證的代碼。這就是爲什麼我使用斷言來指定屬性並將它們傳遞給合成器以進行驗證轉換。合成器只是不接受在屬性中使用的延遲語法,即## 1。上面提到的是模擬合成器延遲的唯一方法嗎? – mii9

+0

您無法綜合屬性,我懷疑這不是您的正式驗證程序的工作方式。在我的(有限的)正式驗證經驗中,正式工具將您的實現作爲一個輸入,並將HDL屬性作爲另一個輸入。因此這些屬性不會被合成,並且可以以正常的方式寫入。也許你應該提出另一個問題,提供更多關於你正在使用哪種工具的信息,以及你如何使用它。 – Hida

1

你寫了沒有任何意義的財產。您不能在布爾表達式的中間添加延遲。你的意思是寫一連串的表達式嗎?那麼正確的語法是

sequence s1; 
((req1 == 0) ##1(req1 == 1) ##1 !(req2 == 1) || (gnt1 == 0)); 
endsequence 
+0

是的,你是對的。這是正確的方式,對不起我的錯誤。非常感謝。但延遲語法仍然用於指定的行爲,並且合成器因此產生語法錯誤。它適用於沒有延遲語法的屬性。 – mii9