Verilog 可綜合和不可綜合的理解


之前我看了一個很簡單的Verilog代碼,里面用到 initial:

然后綜合得到如下電路:

我一直誤解為這些不可綜合的語句是不能出現在設計里面,只能出現在仿真里面的。我以為如果出現在設計里面了也會被忽略掉。但是我發現 initial 里面的語句實際中確實起了作用,它初始化了counter,我把代碼(sof)下載到FPGA開發板進 確實是從0開始計數的。然后我咨詢了公司的研發工程師,他是這樣解答的:

initial 是不可綜合,但是這里只是賦了一個初值(初始化寄存器的值)。沒有行為描述。說的不可綜合是指的不能生成實際的電路,不是說設計里面寫了 initial 會報錯 或者被忽略。
 
這里initial之所以不能綜合,是因為它只能執行一次,而always會根據時鍾條件無限次觸發,所以always里面語句就像硬件電路,來一個時鍾,執行一次。而initial就像是初始化程序,最開始把變量初始化,執行一次后不能再執行,直到再次復位。
 
這里綜合的含義是指能生成對應的硬件電路,而這里的initial就像是一個純軟件的初始化。
 
你提到的有些設計會被忽略是因為綜合器認為這個地方是無效的,沒有必要的,所以忽略掉,不生成電路,自動優化掉。
 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

當然我在網絡上找到了些可綜合和不可綜合的解釋 感覺也很有參考價值:

https://wenda.so.com/q/1378362174074040

綜合就是把你寫的rtl代碼轉換成對應的實際電路。
比如你寫代碼assign a=b&c;
EDA綜合工具就會去元件庫里拿一個二輸入與門出來,然后輸入端分別接上b和c,輸出端接上a

假如你寫了很多這樣的語句
assign a=b&c;
assign c=e|f;
assign e=x^y;
……
綜合工具就會像搭積木一樣的把你這些“邏輯”電路用一些“門”電路來搭起來。當然,工具會對必要的地方做一些優化,比如你寫一個電路assing a=b&~b,這樣工具就吧a恆接為0了,而不會去給你找一個與門來搭這個電路。
所以,“綜合”要做的事情有:編譯rtl代碼,從庫里選擇用到的門器件,把這些器件按照“邏輯”搭建成“門”電路。

不可綜合,是指找不到對應的“門”器件來實現相應的代碼。比如#100之類的延時功能,簡單的門器件是無法實現延時100個單元的。還有打印語句等,也是門器件無法實現的,這個應該很好理解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM