原野之狼的個(gè)人空間 http://selenalain.com/space-uid-36.html [收藏] [復制] [RSS]

博客

【轉載】談VHDL/Verilog的可綜合性以及對初學(xué)者的一些建議

已有 2361 次閱讀2009-9-24 13:54 |

談VHDL/Verilog的可綜合性以及對初學(xué)者的一些建議

 
一、HDL不是硬件設計語(yǔ)言
過(guò)去筆者曾碰到過(guò)不少VHDL或Verilog HDL的初學(xué)者問(wèn)一些相似的問(wèn)題,諸如如何實(shí)現除法、開(kāi)根號,如何寫(xiě)循環(huán)語(yǔ)句等等。在這個(gè)論壇上,也時(shí)常能看到一些網(wǎng)友提出這一類(lèi)的問(wèn)題。
對于這些問(wèn)題,首先要明確的是VHDL和Veriglog并非是針對硬件設計而開(kāi)發(fā)的語(yǔ)言,只不過(guò)目前被我們用來(lái)設計硬件。HDL是Hardware Description Language的縮寫(xiě),正式中文名稱(chēng)是“硬件描述語(yǔ)言”。也就是說(shuō),HDL并不是“硬件設計語(yǔ)言(Hardware Design Language)”。別看只差這一個(gè)單詞,正是這一個(gè)單詞才決定了絕大部分電路設計必須遵循RTL的模式來(lái)編寫(xiě)代碼,而不能隨心所欲得寫(xiě)僅僅符合語(yǔ)法的 HDL代碼。
二、HDL的來(lái)歷
之所以是“硬件描述語(yǔ)言”,要從HDL的來(lái)歷說(shuō)起。
VHDL于1980年開(kāi)始在美國國防部的指導下開(kāi)發(fā),完成于1983年,并于1987年成為IEEE的標準。當初開(kāi)發(fā)這種語(yǔ)言,是出于美國國防部采購電子設備的需要。美軍的裝備采購自私人企業(yè),時(shí)常要面對這樣一種風(fēng)險:如果某種武器大量裝備部隊,而其中某個(gè)零件的供應商卻在幾年后倒閉了,那這種武器的再生產(chǎn)、維修和保養都會(huì )出現大問(wèn)題。而電子設備、尤其是集成電路的內部結構較為復雜,若出現前面所說(shuō)的情況要找其他公司生產(chǎn)代用品非常困難。于是美國防部希望供應商能以某種形式留下其產(chǎn)品的信息,以保證一旦其破產(chǎn)后能由其他廠(chǎng)商迅速生產(chǎn)出代用品。
顯然,當初的設計文檔顯然是不能交出來(lái)的,這在美國會(huì )涉及商業(yè)機密和知識產(chǎn)權問(wèn)題。于是美國防部就想出了一種折衷的方法——描述硬件的語(yǔ)言,也就是 VHDL。通過(guò)VHDL,供應商要把自己生產(chǎn)的集成電路芯片的行為描述出來(lái):比如說(shuō),加了什么樣的信號后過(guò)多少時(shí)間它能輸出什么等等。這樣,如果有必要讓其他廠(chǎng)商生產(chǎn)代用品,他們只需照著(zhù)VHDL文檔,設計出行為與其相同的芯片即可。這樣的代用品相當于是新廠(chǎng)商在不了解原產(chǎn)品結構的情況下獨立設計的,所以不太會(huì )涉及知識侵權。
Verilog HDL也形成于差不多的年代,是由Gateway Design Automation公司大約在1983年左右開(kāi)發(fā)的。其架構同VHDL相似,但主要被用來(lái)進(jìn)行硬件仿真;蛟S私人公司更注重實(shí)用,Verilog要比VHDL簡(jiǎn)潔得多。
由此可見(jiàn),這兩種最流行的用于電路設計的語(yǔ)言,沒(méi)有一種是為了設計硬件而開(kāi)發(fā)的(更何況80年代還沒(méi)有現在的那些功能強大的EDA軟件呢)。因此,當初制訂HDL語(yǔ)言標準的時(shí)候,并沒(méi)有考慮這些代碼如何用硬件來(lái)實(shí)現。換句話(huà)說(shuō),有些代碼寫(xiě)起來(lái)簡(jiǎn)單,實(shí)現起來(lái)卻可能非常復雜,或者幾乎不可能實(shí)現。
三、HDL代碼的可綜合性
現在回到最初的問(wèn)題上。為什么諸如除法、循環(huán)之類(lèi)的HDL代碼總是會(huì )出錯?
由上一部分可知,任何符合HDL語(yǔ)法標準的代碼都是對硬件行為的一種描述,但不一定是可直接對應成電路的設計信息。行為描述可以基于不同的層次,如系統級,算法級,寄存器傳輸級(RTL)、門(mén)級等等。以目前大部分EDA軟件的綜合能力來(lái)說(shuō),只有RTL或更低層次的行為描述才能保證是可綜合的。而眾多初學(xué)者試圖做的,卻是想讓軟件去綜合算法級或者更加抽象的硬件行為描述。
比如說(shuō),要想實(shí)現兩個(gè)變量相除的運算,若在代碼中寫(xiě)下C=A/B,你將會(huì )發(fā)現只有一些模擬軟件在前仿真中能正確執行這句代碼,但幾乎任何軟件都不能將其綜合成硬件。不要怪軟件太笨。試想一下,如果我們自己筆算除法是怎么做的?從高位到低位逐次試除、求余、移位。試除和求余需要減法器,商數和余數的中間結果必須有寄存器存儲;而此運算顯然不能在一個(gè)時(shí)鐘周期里完成,還需要一個(gè)狀態(tài)機來(lái)控制時(shí)序。一句簡(jiǎn)單的C=A/B同所有這些相比顯得太抽象,對于只能接受 RTL或更低層次描述的EDA軟件來(lái)說(shuō)確實(shí)太難實(shí)現。而如果代碼是類(lèi)似于(Verilog)
always @(posedge clk)
c<=A/B; 這樣的,要求除法在一個(gè)時(shí)鐘延上完成,那更是不可能實(shí)現的。(注:有些FPGA的配套軟件提供乘除法的運算模塊,但也只能支持直接調用,不支持把形如C=A/B的語(yǔ)句綜合成除法模塊。)
又比如,一個(gè)很多初學(xué)者常見(jiàn)的問(wèn)題是試圖讓HDL進(jìn)行循環(huán)運算,形同(Verilog):
for (i=0; iparity = parity xor data
;
一些功能比較簡(jiǎn)單的綜合軟件會(huì )完全拒絕綜合循環(huán)語(yǔ)句;而一些功能較強的軟件僅當wordlength是常數的時(shí)候能綜合;當wordlength為變量時(shí),任何軟件都不能綜合上面的語(yǔ)句。這是因為硬件規模必須是有限的、固定的。當綜合軟件遇到循環(huán)語(yǔ)句時(shí),總是將其展開(kāi)成若干條順序執行的語(yǔ)句,然后再綜合成電路。若wordlength是常數,則展開(kāi)的語(yǔ)句數是確定的,具有可綜合性;而若它是變量時(shí),展開(kāi)的語(yǔ)句數不確定,對應的硬件電路數量也不能確定,無(wú)法被綜合;蛟S有人說(shuō)用計數器就能實(shí)現變量循環(huán),但這情形又和上面的除法運算相同。那需要額外的硬件,用來(lái)存儲中間結果和進(jìn)行時(shí)序控制,象上面那樣的循環(huán)語(yǔ)句對此描述得太抽象,軟件接受不了。
四、如何判斷自己寫(xiě)的代碼是可綜合的?
用一句簡(jiǎn)單的話(huà)概括:電腦永遠沒(méi)有你聰明。具體來(lái)說(shuō),通常EDA軟件對HDL代碼的綜合能力總是比人差。對于一段代碼,如果你不能想象出一個(gè)較直觀(guān)的硬件實(shí)現方法,那EDA軟件肯定也不行。比如說(shuō),加法器、多路選擇器是大家都很熟悉的電路,所以類(lèi)似A B-C,(A>B)?C這樣的運算一定可以綜合。而除法、開(kāi)根、對數等等較復雜的運算,必須通過(guò)一定的算法實(shí)現,沒(méi)有直觀(guān)簡(jiǎn)單的實(shí)現方法,則可以判斷那些計算式是不能綜合的,必須按它們的算法寫(xiě)出更具體的代碼才能實(shí)現。此外,硬件無(wú)法支持的行為描述,當然也不能被綜合(比如想在FPGA上實(shí)現DDR內存那樣的雙延觸發(fā)邏輯,代碼很容易寫(xiě),但卻不能實(shí)現)。
不過(guò),這樣的判斷標準非常主觀(guān)模糊,遇到具體情況還得按設計人員自己的經(jīng)驗來(lái)判斷。如果要一個(gè)相對客觀(guān)的標準,一般來(lái)說(shuō):在RTL級的描述中,所有邏輯運算和加減法運算、以及他們的有限次組合,基本上是可綜合的,否則就有無(wú)法綜合的可能性。當然,這樣的標準仍然有缺陷,更況且EDA的技術(shù)也在不斷發(fā)展,過(guò)去無(wú)法綜合的代碼或許將來(lái)行,某些軟件不支持的代碼換個(gè)軟件或許行。比如固定次數的循環(huán),含一個(gè)常數參數的乘法運算等等,有些EDA軟件支持對它們的綜合,而有些軟件不行。
所以,正確的判斷仍然要靠實(shí)踐來(lái)積累經(jīng)驗。當你可以較準確判斷代碼的可綜合性的時(shí)候,你對HDL的掌握就算完全入門(mén)了。
作者:董培良
電機和電子工程系博士生
英國University of Nottingham
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
返回頂部
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页