之前我看了一個很簡單的Verilog代碼,里面用到 initial:
然后綜合得到如下電路:
我一直誤解為這些不可綜合的語句是不能出現在設計里面,只能出現在仿真里面的。我以為如果出現在設計里面了也會被忽略掉。但是我發現 initial 里面的語句實際中確實起了作用,它初始化了counter,我把代碼(sof)下載到FPGA開發板進 確實是從0開始計數的。然后我咨詢了公司的研發工程師,他是這樣解答的:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
當然我在網絡上找到了些可綜合和不可綜合的解釋 感覺也很有參考價值:
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個單元的。還有打印語句等,也是門器件無法實現的,這個應該很好理解。