仿真和綜合
本節(jié)的文檔編號(hào):001100000035
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):?001000000049
1、本節(jié)主要介紹使用綜合器對(duì)Verilog代碼進(jìn)行解釋并將代碼轉(zhuǎn)化成實(shí)際電路來(lái)表示,最終產(chǎn)生實(shí)際電路(網(wǎng)表),即綜合;為了避免在編寫(xiě)好代碼、綜合成電路、燒寫(xiě)到FPGA后才發(fā)現(xiàn)問(wèn)題,此時(shí)再去定位問(wèn)題就會(huì)非常的地困難,所以,在綜合前,設(shè)計(jì)師可以通過(guò)仿真軟件對(duì)代碼進(jìn)行仿真測(cè)試,檢測(cè)出BUG并將其解決,最后再將程序燒寫(xiě)進(jìn)FPGA,即仿真;在Veriglog語(yǔ)言中,有些語(yǔ)法結(jié)構(gòu)只是以仿真測(cè)試為目的,是不能與實(shí)際硬件電路對(duì)應(yīng)起來(lái)的,也稱之為不可綜合語(yǔ)法,本節(jié)整理了不可綜合或者不推薦使用的代碼。
2、這是ALTERA和VIVADO文檔
第2節(jié)?綜合和仿真
2.1?綜合
?Verilog是硬件描述語(yǔ)言,顧名思義,就是用代碼的形式描述硬件的功能,最終在硬件電路上實(shí)現(xiàn)該功能。
在Verilog描述出硬件功能后需要使用綜合器對(duì)Verilog代碼進(jìn)行解釋并將代碼轉(zhuǎn)化成實(shí)際的電路來(lái)表示,
最終產(chǎn)生實(shí)際的電路,也被稱為網(wǎng)表。這種將Verilog代碼轉(zhuǎn)成網(wǎng)表的工具就是綜合器。

?上圖左上角是一段Verilog代碼,該代碼實(shí)現(xiàn)了一個(gè)加法器的功能。
在經(jīng)過(guò)綜合器解釋后該代碼被轉(zhuǎn)化成一個(gè)加法器電路。
QUARTUS、ISE和VIVADO等FPGA開(kāi)發(fā)工具都是綜合器,而在集成電路設(shè)計(jì)領(lǐng)域常用的綜合器是DC。
2.2?仿真
?在FPGA設(shè)計(jì)的過(guò)程中,不可避免會(huì)出現(xiàn)各種BUG。如果在編寫(xiě)好代碼、綜合成電路、燒寫(xiě)到FPGA后才發(fā)現(xiàn)問(wèn)題,
此時(shí)再去定位問(wèn)題就會(huì)非常地困難。而在綜合前,設(shè)計(jì)師可以在電腦里通過(guò)仿真軟件對(duì)代碼進(jìn)行仿真測(cè)試,
檢測(cè)出BUG并將其解決,最后再將程序燒寫(xiě)進(jìn)FPGA。一般情況下可以認(rèn)為沒(méi)有經(jīng)過(guò)仿真驗(yàn)證的代碼,一定是存在BUG的。

為了模擬真實(shí)的情況,需要編寫(xiě)測(cè)試文件。該文件也是用Verilog編寫(xiě)的,其描述了仿真對(duì)象的輸入激勵(lì)情況。
該激勵(lì)力求模仿最真實(shí)的情況,產(chǎn)生最接近的激勵(lì)信號(hào),將該信號(hào)的波形輸入給仿真對(duì)象,
查看仿真對(duì)象的輸出是否與預(yù)期一致。需要注意的是:在仿真過(guò)程中沒(méi)有將代碼轉(zhuǎn)成電路,
仿真器只是對(duì)代碼進(jìn)行仿真驗(yàn)證。至于該代碼是否可轉(zhuǎn)成電路,仿真器并不關(guān)心。
由此可見(jiàn),Verilog的代碼不僅可以描述電路,還可以用于測(cè)試。事實(shí)上,Verilog定義的語(yǔ)法非常之多,
但絕大部分都是為了仿真測(cè)試來(lái)使用的,只有少部分才是用于電路設(shè)計(jì),詳細(xì)可以參考本書(shū)的“可綜合邏輯設(shè)計(jì)”一節(jié)。
Verilog中用于設(shè)計(jì)的語(yǔ)法是學(xué)習(xí)的重點(diǎn),掌握好設(shè)計(jì)的語(yǔ)法并熟練應(yīng)用于各種復(fù)雜的項(xiàng)目是技能的核心。
而其他測(cè)試用的語(yǔ)法,在需要時(shí)查找和參考就已經(jīng)足夠了。本書(shū)旨在方便本科、研究生的教學(xué),因此將重點(diǎn)講解設(shè)計(jì)用的語(yǔ)法。
2.3?可綜合設(shè)計(jì)
Verilog硬件描述語(yǔ)言有類似高級(jí)語(yǔ)言的完整語(yǔ)法結(jié)構(gòu)和系統(tǒng),這些語(yǔ)法結(jié)構(gòu)的應(yīng)用給設(shè)計(jì)描述帶來(lái)很多方便。
但是,Verilog是描述硬件電路的,其建立在硬件電路的基礎(chǔ)之上。而有些語(yǔ)法結(jié)構(gòu)只是以仿真測(cè)試為目的,
是不能與實(shí)際硬件電路對(duì)應(yīng)起來(lái)的。也就是說(shuō)在使用這些語(yǔ)法時(shí),
將一個(gè)語(yǔ)言描述的程序映射成實(shí)際硬件電路中的結(jié)構(gòu)是不能實(shí)現(xiàn)的,也稱為不可綜合語(yǔ)法。
綜合就是把編寫(xiě)的rtl代碼轉(zhuǎn)換成對(duì)應(yīng)的實(shí)際電路。
比如編寫(xiě)代碼assign a=b&c;EDA綜合工具就會(huì)去元件庫(kù)里調(diào)用一個(gè)二輸入與門(mén),
將輸入端分別接上b和c,輸出端接上a。
同樣地,如果設(shè)計(jì)師編寫(xiě)了一些如下所示的語(yǔ)句
assign a=b&c;
assign c=e|f;
assign e=x^y;
……
綜合工具就會(huì)像搭積木一樣把這些“邏輯”電路用一些“門(mén)”電路來(lái)搭起來(lái)。
當(dāng)然,工具會(huì)對(duì)必要的地方做一些優(yōu)化,比如編寫(xiě)一個(gè)電路assing a=b&~b,工具就會(huì)將a恒接為0,
而不會(huì)去調(diào)用一個(gè)與門(mén)來(lái)搭這個(gè)電路。
綜上所述,“綜合”要做的事情有:編譯rtl代碼,從庫(kù)里選擇用到的門(mén)器件,
把這些器件按照“邏輯”搭建成“門(mén)”電路。
不可綜合,是指找不到對(duì)應(yīng)的“門(mén)”器件來(lái)實(shí)現(xiàn)相應(yīng)的代碼。比如“#100”之類的延時(shí)功能,
簡(jiǎn)單的門(mén)器件是無(wú)法實(shí)現(xiàn)延時(shí)100個(gè)單元的,還有打印語(yǔ)句等,也是門(mén)器件無(wú)法實(shí)現(xiàn)的。
在設(shè)計(jì)的時(shí)候要確保所寫(xiě)的代碼是可以綜合的,這就依賴于設(shè)計(jì)者的能力,知道什么是可綜合的代碼,
什么是不可綜合的代碼。對(duì)于初學(xué)者來(lái)說(shuō),最好是先記住規(guī)則,遵守規(guī)則,
先按規(guī)則來(lái)設(shè)計(jì)電路并在這一過(guò)程中逐漸理解,這是最好的學(xué)習(xí)路徑。
下面表格中列出了不可綜合或者不推薦使用的代碼。

下表是筆者推薦使用的設(shè)計(jì)。

相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=4