什么是Verilog HDL?
Verilog HDL (Hardware Description Language) 是一種硬件描述語言,可以在算法級、門級到開關級的多種抽象設計層次上對數字系統建模。它可以描述設計的行為特性、數據流特性、結構組成以及包含響應監控和設計驗證方面的時延和波形產生機制。此外,verilog提供了編程語言接口,通過該接口用戶可以在模擬、驗證期間從外部訪問設計,包括模擬的具體控制和運行。
Verilog 不僅定義了語法,而且對每個語法結構都定義了清晰的模擬、仿真語義。因此,用這種語言編寫的模型能夠使用 Verilog 仿真器進行驗證。Verilog 從C語言中繼承了多種操作符和結構,所以從結構上看兩者有很多相似之處。
Verilog HDL是你在開發 FPGA 、ASIC 時使用的語言,跟開發軟件使用 C語言一個道理。
Verilog是一種思維方式
先來談一下怎樣才能學好Verilog這個問題。有人說學Verilog很難,好像比C語言還要難學。有一定難度是真的,但并沒有比別的語言更難學。我們剛開始學C語言的時候也覺得C語言很難,直到我們把思維方式轉變過來了,把微機原理學好了,能模擬CPU的運行方式來思考問題了,就會發現C語言也沒那么難了。所以這里面存在一個思維方式的轉換的過程。這對于學Verilog來說也是一樣的,只不過Verilog比C語言還要更加底層,我們只掌握了CPU的思維模式還不行,還需要再往下學一層“硬件電路的思維模式”,才能更好的掌握硬件編程語言。
Verilog設計謹記
在學習Verilog過程中,總結了一些經驗,為了保證Verilog HDL賦值語句的可綜合性,在建模時應注意以下要點:
不使用初始化語句;
不使用延時語句;
不使用initial。
不使用#10
不使用循環次數不確定的語句,如:forever,while等;
強烈建議同步方式設計電路;
盡量采用行為語句完成設計;
always過程塊描述組合邏輯,應在敏感信號表中列出所有的輸入信號;
不能在一個以上的always過程塊中對同一個變量賦值。而對同一個賦值對象不能既使用阻塞式賦值,又使用非阻塞式賦值;
除非是關鍵路徑的設計,一般不采用調用門級元件來描述設計的方法,建議采用行為語句來完成設計;
所有的內部寄存器都應該可以被復位;
用戶自定義原件(UDP元件)是不能被綜合的;
在設計時總是記住時序問題 ;
在一個設計開始就要考慮到地電平或高電平復位、同步或異步復位、上升沿或下降沿觸發等問題,在所有模塊中都要遵守它 ;
在不同的情況下用if和case,最好少用if的多層嵌套(1層或2層比較合適,當在3層以上時,最好修改寫法,因為這樣不僅可以reduce area,而且可以獲得好的timing);
同一個變量的賦值不能受多個時鐘控制,也不能受兩種不同的時鐘條件(或者不同的時鐘沿)控制。
所有的內部寄存器都應該能夠被復位,在使用FPGA實現設計時,應盡量使用器件的全局復位端作為系統總的復位;
在鎖存一個信號或總線時要小心,對于整個design,盡量避免使用latch,因為在DFT時很難test;
確信所有的信號被復位,在DFT時,所有的FlipFlop都是controllable;
永遠不要再寫入之前讀取任何內部存儲器(如SRAM);
從一個時鐘到另一個不同的時鐘傳輸數據時用數據緩沖,他工作像一個雙時鐘FIFO(是異步的),可以用Async SRAM搭建Async FIFO;
對時序邏輯描述和建模,應盡量使用非阻塞賦值方式。對組合邏輯描述和建模,既可以用阻塞賦值,也可以用非阻塞賦值。但在同一個過程塊中,最好不要同時用阻塞賦值和非阻塞賦值;
在VHDL中二維數組可以使用,它是非常有用的。在VERILOG中他僅僅可以使用在測試模塊中,不能被綜合 ;
遵守register-in register-out規則 ;
像synopsys的DC的綜合工具是非常穩定的,任何bugs都不會從綜合工具中產生 ;
確保FPGA版本與ASIC的版本盡可能的相似,特別是SRAM類型,若版本一致是最理想的,但是在工作中FPGA版本一般用FPGA自帶的SRAM,ASIC版本一般用廠商提供的SRAM;
如果不打算把變量推導成鎖存器,那么必須在if語句或case語句的所有條件分支中都對變量明確地賦值。
在嵌入式存儲器中使用BIST ;
避免混合使用上升沿和下降沿觸發的觸發器;
虛單元和一些修正電路是必需的 ;
一些簡單的測試電路也是需要的,經常在一個芯片中有許多測試模塊 ;
除非低功耗不要用門控時鐘,強烈建議不要在design中使用gate clock ;
不要依靠腳本來保證設計。但是在腳本中的一些好的約束能夠起到更好的性能(例如前向加法器);
如果時間充裕,通過時鐘做一個多鎖存器來取代用MUX ;
不要用內部tri-state, ASIC需要總線保持器來處理內部tri-state,如IO cell;
在top level中作pad insertion ;
選擇pad時要小心(如上拉能力,施密特觸發器,5伏耐壓等),選擇合適的IO cell ;
小心由時鐘偏差引起的問題 ;
不要試著產生半周期信號 ;
如果有很多函數要修正,請一個一個地作,修正一個函數檢查一個函數 ;
在一個計算等式中排列每個信號的位數是一個好習慣,即使綜合工具能做 ;
不要使用HDL提供的除法器 ;
削減不必要的時鐘。它會在設計和布局中引起很多麻煩,大多數FPGA有1-4個專門的時鐘通道。
評論
查看更多