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














評論