关于Verilog的可综合性
生活随笔
收集整理的這篇文章主要介紹了
关于Verilog的可综合性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可綜合模型的結構
如果程序只用于仿真,那么幾乎所有的語法和編程語句都可以使用。但如果程序是用于硬件實現,那么我們就必須保證程序的可綜合性,即所編寫的程序能被綜合器 轉化為相應的電路結構。不可綜合的HDL語句在用綜合工具綜合時將被忽略或者報錯。作為設計者,應該對可綜合模型的結構有所了解。 雖然不同的綜合工具對Verilog HDL語法結構的支持不盡相同,但Verilog HDL中某些典型的結構是很明確地被所有綜合工具支持或不支持的。 (1)所有綜合工具都支持的結 構:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有綜合工具都不支持的結構:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的結構:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 因此,要編寫出可綜合的模型,應盡量采用所有綜合工具都支持的結構來描述,這樣才能保證設計的正確性和縮短設計周期。 建立可綜合模型的原則 要保證Verilog HDL賦值語句的可綜合性,在建模時應注意以下要點: (1)不使用初始化語句。 (2)不使用帶有延時的描述。 (3)不使用循環次數不確定的循環語句,如forever、while等。 (4)不使用用戶自定義原語(UDP元件)。 (5)盡量使用同步方式設計電路。 (6)除非是關鍵路徑的設計,一般不采用調用門級元件來描述設計的方法,建議采用行為語句來完成設計。 (7)用always過程塊描述組合邏輯,應在敏感信號列表中列出所有的輸入信號。 (8)所有的內部寄存器都應該能夠被復位,在使用FPGA實現設計時,應盡量使用器件的全局復位端作為系統總的復位。 (9)對時序邏輯描述和建模,應盡量使用非阻塞賦值方式。對組合邏輯描述和建模,既可以用阻塞賦值,也可以用非阻塞賦值。但在同一個過程塊中,最好不要同時用阻塞賦值和非阻塞賦值。 (10)不能在一個以上的always過程塊中對同一個變量賦值。而對同一個賦值對象不能既使用阻塞式賦值,又使用非阻塞式賦值。 (11)如果不打算把變量推導成鎖存器,那么必須在if語句或case語句的所有條件分支中都對變量明確地賦值。 (12)避免混合使用上升沿和下降沿觸發的觸發器。 (13)同一個變量的賦值不能受多個時鐘控制,也不能受兩種不同的時鐘條件(或者不同的時鐘沿)控制。 (14)避免在case語句的分支項中使用x值或z值。 阻塞與非阻塞 建議在時序邏輯建模時使用非阻塞式賦值。因為對于阻塞式賦值來說,賦值語句的順序對最后的綜合結果有著直接的影響,設計者稍不留意就會使綜合結果與設計本 意大相徑庭。而如果采用非阻塞式賦值,則可以不考慮賦值語句的排列順序,只需將其連接關系描述清楚即可。如下面的模型: always @ (posedge clkA)?? //Label? AwA … = DataOut;????????????? //讀DataOut的值 always @ (posedge clkA)?? //Label? AwB DataOut <= …;??????? //采用非阻塞式賦值 如果將上述模型改為阻塞式賦值“DataOut = …”,按照程序中的書寫順序模擬這些always語句,在clkA上升沿處,always語句AwA讀取了DataOut的當前值,然后always語句 AwB再向DataOut賦新值。如果顛倒了這兩條always語句的順序(或仿真器選擇重新排定這兩條always語句的執行順序),那么先執行 always語句AwB,導致零時間內將新值賦給DataOut,隨后always語句AwA讀取的便是更新后的DataOut值。這看起來是由于 always語句都可以執行時,向DataOut的賦值是在零時間內發生并完成的。因此根據先執行哪一條always語句,AwA中讀取的DataOut 值可能是其原值,也可能是其新值。 使用非阻塞賦值就可以消除這種仿真行為的依賴性,這時,讀取DataOut發生在當前時刻,而在當前仿真周期結束時(即所有的變量讀取都已完成)才將新值 賦給DataOut。這樣上述模型的行為不再受always語句執行順序的影響。因此,在某條always語句內對變量賦值而在該always語句外讀取 變量,那么賦值語句應是非阻塞式賦值。總結
以上是生活随笔為你收集整理的关于Verilog的可综合性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Verilog的数据流、行为、结构化与R
- 下一篇: 谈VHDL/Verilog的可综合性以及