- 在于規(guī)范整個(gè)設(shè)計(jì)流程,實(shí)現(xiàn)開(kāi)發(fā)的合理性、一致性、高效性。
- 形成風(fēng)格良好和完整的文檔。
- 實(shí)現(xiàn)在FPGA不同廠家之間以及從FPGA到ASIC的順利移植。
- 便于新員工快速掌握本部門(mén)FPGA的設(shè)計(jì)流程。
由于目前所用到的FPGA器件以Altera的為主,所以下面的例子也以Altera為例,工具組合為 modelsim + Leonardo Spectrum / FPGA CompilerII + Quartus,但原則和方法對(duì)于其他廠家和工具也是基本適用的。
1. 設(shè)計(jì)流程概述
1.1 設(shè)計(jì)流程圖
說(shuō)明:
1.2 關(guān)鍵步驟的實(shí)現(xiàn)
1.2.1 功能仿真
說(shuō)明:
“調(diào)用模塊的行為仿真模型”指的是RTL代碼中引用的由廠家提供的宏模塊/IP,如Altera 提供的LPM庫(kù)中的乘法器、存儲(chǔ)器等部件的行為模型。
1.2.2 邏輯綜合
說(shuō)明:
“調(diào)用模塊的黑盒子接口”的導(dǎo)入,是由于RTL代碼調(diào)用了一些外部模塊,而這些外部模塊不能被綜合或無(wú)需綜合,但邏輯綜合器需要其接口的定義來(lái)檢查邏輯并保留這些模塊的接口。
1.2.3 前仿真
一般來(lái)說(shuō),對(duì)FPGA設(shè)計(jì)這一步可以跳過(guò)不做,但可用于debug綜合有無(wú)問(wèn)題。
1.2.4 布局布線
1.2.5 后仿真(時(shí)序仿真)
2. Verilog HDL設(shè)計(jì)
基于將來(lái)設(shè)計(jì)轉(zhuǎn)向ASIC的方便,本部門(mén)的設(shè)計(jì)統(tǒng)一采用Verilog HDL,但針對(duì)混合設(shè)計(jì)和混合仿真的趨勢(shì),所有開(kāi)發(fā)人員也應(yīng)能讀懂VHDL。Verilog HDL的學(xué)習(xí)可參考[1][2]。
2.1 編程風(fēng)格(Coding Style)要求
2.1.1 文件
(1)每個(gè)模塊(module)一般應(yīng)存在于單獨(dú)的源文件中,通常源文件名與所包含模塊名相同。
(2)每個(gè)設(shè)計(jì)文件開(kāi)頭應(yīng)包含如下注釋內(nèi)容:
- 年份及公司名稱(chēng)。
- 作者。
- 文件名。
- 所屬項(xiàng)目。
- 頂層模塊。
- 模塊名稱(chēng)及其描述。
- 修改紀(jì)錄。
請(qǐng)參考標(biāo)準(zhǔn)示例程序[3]。
2.1.2 大小寫(xiě)
(1)如無(wú)特別需要,模塊名和信號(hào)名一律采用小寫(xiě)字母。
(2)為醒目起見(jiàn),常數(shù)(`define定義)/參數(shù)(parameter定義)采用大寫(xiě)字母。
2.1.3 標(biāo)識(shí)符
(1)標(biāo)識(shí)符采用傳統(tǒng)C語(yǔ)言的命名方法,即在單詞之間以“_”分開(kāi),如:max_delay、data_size等等。
(2)采用有意義的、能反映對(duì)象特征、作用和性質(zhì)的單詞命名標(biāo)識(shí)符,以增強(qiáng)程序的可讀性。
(3)為避免標(biāo)識(shí)符過(guò)于冗長(zhǎng),對(duì)較長(zhǎng)單詞的應(yīng)當(dāng)采用適當(dāng)?shù)目s寫(xiě)形式,如用‘buff’代替‘buffer’,‘ena’代替‘enable’,‘addr’代替‘a(chǎn)ddress’等。
2.1.4 參數(shù)化設(shè)計(jì)
為了源代碼的可讀性和可移植性起見(jiàn),不要在程序中直接寫(xiě)特定數(shù)值,盡可能采用`define語(yǔ)句或paramater語(yǔ)句定義常數(shù)或參數(shù)。
2.1.5 空行和空格
(1)適當(dāng)?shù)卦诖a的不同部分中插入空行,避免因程序擁擠不利閱讀。
(2)在表達(dá)式中插入空格,避免代碼擁擠,包括:
賦值符號(hào)兩邊要有空格;雙目運(yùn)算符兩邊要有空格;單目運(yùn)算符和操作數(shù)之間可沒(méi)有空格, 示例如下:
a <= b;
c <= a + b;
if (a == b) then ...
a <= ~a & c;
2.1.6 對(duì)齊和縮進(jìn)
- 不要使用連續(xù)的空格來(lái)進(jìn)行語(yǔ)句的對(duì)齊。
- 采用制表符Tab對(duì)語(yǔ)句對(duì)齊和縮進(jìn),Tab鍵采用4個(gè)字符寬度,可在編輯器中設(shè)置。
- 各種嵌套語(yǔ)句尤其是if...else語(yǔ)句,必須嚴(yán)格的逐層縮進(jìn)對(duì)齊。
2.1.7 注釋
必須加入詳細(xì)、清晰的注釋行以增強(qiáng)代碼的可讀性和可移植性,注釋內(nèi)容占代碼篇幅不應(yīng)少于30%。
2.1.8 參考C語(yǔ)言的資料
要形成良好的編程風(fēng)格,有許多細(xì)節(jié)需要注意,可以參考資料[4],雖然它是針對(duì)C語(yǔ)言的討論,但由于Verilog HDL和C語(yǔ)言的形式非常近似,所以里面提到的很多原則都是可以借鑒的。
2.1.9 可視化設(shè)計(jì)方法
為提高設(shè)計(jì)效率和適應(yīng)協(xié)同設(shè)計(jì)的方式,可采用可視化的設(shè)計(jì)方法,Mentor Grahpics的Renoir軟件提供了非常好的設(shè)計(jì)模式。
2.2 可綜合設(shè)計(jì)
用HDL實(shí)現(xiàn)電路,設(shè)計(jì)人員對(duì)可綜合風(fēng)格的RTL描述的掌握不僅會(huì)影響到仿真和綜合的一致性,也是邏輯綜合后電路可靠性和質(zhì)量好壞最主要的因素,對(duì)此應(yīng)當(dāng)予以充分的重視。學(xué)習(xí)可綜合的HDL請(qǐng)參考 [5][6] [7]。學(xué)習(xí)設(shè)計(jì)的模塊劃分請(qǐng)參考[8]。
2.3 設(shè)計(jì)目錄
采用合理、條理清晰的設(shè)計(jì)目錄結(jié)構(gòu)有助于提高設(shè)計(jì)的效率、可維護(hù)性。建議采用類(lèi)似下面的目錄結(jié)構(gòu):
3. 邏輯仿真
考慮到性能和易用性,首選的邏輯仿真器是Mentor Graphics的modelsim。
3.1 測(cè)試程序(test bench)
測(cè)試程序?qū)τ谠O(shè)計(jì)功能和時(shí)序的驗(yàn)證有著舉足輕重的影響,測(cè)試激勵(lì)的完備性和真實(shí)性是關(guān)鍵所在,有以下原則須遵循:
(1)測(cè)試激勵(lì)輸入和響應(yīng)輸出采集的時(shí)序應(yīng)當(dāng)兼顧功能仿真(無(wú)延時(shí))和時(shí)序仿真(有延時(shí))的情況。
(2)對(duì)于周期較多的測(cè)試,為提高效率,盡可能采用程序語(yǔ)句來(lái)判斷響應(yīng)與標(biāo)準(zhǔn)結(jié)果是否一致,給出成功或出錯(cuò)標(biāo)志,而不是通過(guò)觀察波形來(lái)判斷。
(3)采用基于文件的測(cè)試是很好的辦法,即由matlab或spw等系統(tǒng)工具產(chǎn)生測(cè)試數(shù)據(jù),測(cè)試程序?qū)⑵渥x入產(chǎn)生激勵(lì),再把響應(yīng)結(jié)果寫(xiě)入到文件,再交給上述工具進(jìn)行處理或分析。
(4)仿真器支持幾乎所有的Verilog HDL語(yǔ)法,而不僅僅是常用的RTL的描述,應(yīng)當(dāng)利用這一點(diǎn)使測(cè)試程序盡可能簡(jiǎn)潔、清楚,篇幅長(zhǎng)的要盡量采用task來(lái)描述。
3.2 使用預(yù)編譯庫(kù)
在進(jìn)行功能仿真和后仿真時(shí)都需要某些模塊的行為仿真模型和門(mén)級(jí)仿真模型,如Altera Quartus里的220model.v(LPM模塊行為仿真模型)和apex20ke_atoms.v(20KE系列門(mén)級(jí)仿真模型),為避免在不同的設(shè)計(jì)目錄中多次編譯這些模型,應(yīng)當(dāng)采用一次編譯,多次使用的方法。具體做法如下(以20KE門(mén)級(jí)庫(kù)為例):
1:在某個(gè)工作目錄下新建一庫(kù)名 apex20ke,將apex20ke_atoms.v編譯到其中。2:在圖形界面中的Load Design對(duì)話框中裝入仿真設(shè)計(jì)時(shí),在Verilog 標(biāo)簽下指定預(yù)編譯庫(kù)的完整路徑。(見(jiàn)下圖)
4. 邏輯綜合
目前可用的FPGA綜合工具有Mentor Graphics 的 Leonardo Spectrum,Synplicity 的 Synplify 和 Synopsys 的FPGA CompilerII / FPGA Express,Leonardo Spectrum由于性能和速度最好,成為我們首選的綜合器,F(xiàn)PGA CompilerII / FPGA Express由于可以和Design Compiler代碼兼容也可用。見(jiàn)參考[9]
4.1 邏輯綜合的一些原則
HDL代碼綜合后電路質(zhì)量的好壞主要取決于三個(gè)方面,參考[10]中有比較全面的討論。:
- RTL實(shí)現(xiàn)是否合理、
- 對(duì)廠家器件特點(diǎn)的理解
- 對(duì)綜合器掌握的程度。
4.1.1 關(guān)于LeonardoSpectrum
LeonardoSpectrum對(duì)綜合的控制能力比較強(qiáng),但使用也略為復(fù)雜,故需要在使用前盡量熟悉其功能,才能取得較好的綜合結(jié)果。當(dāng)出現(xiàn)綜合結(jié)果不能滿足約束條件時(shí),不要急于修改設(shè)計(jì)源文件,應(yīng)當(dāng)通過(guò)綜合器提供的時(shí)序和面積分析命令找出關(guān)鍵所在,然后更改綜合控制或修改代碼。
在LeonardoSpectrum 2000.1b以前的版本輸出的 .v 網(wǎng)表都不能用于仿真。
4.1.2 大規(guī)模設(shè)計(jì)的綜合
分塊綜合
當(dāng)設(shè)計(jì)規(guī)模很大時(shí),綜合也會(huì)耗費(fèi)很多時(shí)間。如果設(shè)計(jì)只更改某個(gè)模塊時(shí),可以分塊綜合。如有設(shè)計(jì) top.v 包含 a.v和b.v兩個(gè)模塊,當(dāng)只修改a.v的話,可以先單獨(dú)綜合b.v,輸出其網(wǎng)表b.edf,編寫(xiě)一個(gè)b模塊的黑盒子接口b_syn.v,每次修改a.v后只綜合top.v、a.v、b_syn.v,將綜合后的網(wǎng)表和b.edf送去布線,可以節(jié)約綜合b模塊的時(shí)間。
采用腳本命令
當(dāng)設(shè)計(jì)規(guī)模比較大時(shí),綜合控制也許會(huì)比較復(fù)雜,可以考慮采用腳本控制文件的方式進(jìn)行綜合控制,modelsim、Leonardo Spectrum 和 Quartus 都支持TCL(Tool Command Language)語(yǔ)言,采用腳本控制可以提供比圖形界面更靈活和更方便的控制手段。
4.1.3 必須重視工具產(chǎn)生的警告信息
綜合工具對(duì)設(shè)計(jì)進(jìn)行處理可能會(huì)產(chǎn)生各種警告信息,有些是可以忽略的,但設(shè)計(jì)者應(yīng)該盡量去除,不去除必須確認(rèn)每條警告的含義,避免因此使設(shè)計(jì)的實(shí)現(xiàn)產(chǎn)生隱患。這個(gè)原則對(duì)仿真和布局布線同樣適用。
4.2 調(diào)用模塊的黑盒子(Black box)方法
使用黑盒子方法的原因主要有兩點(diǎn):
一是HDL代碼中調(diào)用了一些FPGA廠家提供的模塊(如Altera的LPM模塊)或第三方提供的IP,這些模塊不需要綜合,而且有些綜合器也不能綜合(如FPGA CompilerII/FPGA Express可以綜合包含LPM的代碼而LeonardoSpectrum不能)。因此須提供一個(gè)黑盒子接口給綜合器,所調(diào)用的模塊到布局布線時(shí)才進(jìn)行連接。
二是方便代碼的移植,由于廠家提供的模塊或第三方提供的IP通常都是與工藝有關(guān)的,直接在代碼中調(diào)用的話將不利于修改,影響代碼移植。
下面以調(diào)用Altera的LPM庫(kù)中的乘法器為例來(lái)說(shuō)明。調(diào)用這樣一個(gè)模塊需要這樣一個(gè)文件:mult8x8.v(可由Quartus的MegaWizer Plug-in Manager產(chǎn)生),代碼如下:
// mult8x8.v
module mult8x8 (dataa, datab, result);
input [7:0] dataa;
input [7:0] datab;
output [15:0] result;
// exemplar translate_off
// synopsys translate_off
lpm_mult lpm_mult_component(
.dataa (dataa),
.datab (datab),
.aclr (1'b0),
.clock (1'b0),
.clken (1'b0),
.sum (1'b0),
.result (result)
);
defparam
lpm_mult_component.lpm_widtha = 8,
lpm_mult_component.lpm_widthb = 8,
lpm_mult_component.lpm_widths = 16,
lpm_mult_component.lpm_widthp = 16,
lpm_mult_component.lpm_representation = "SIGNED",
// exemplar translate_on
// synopsys translate_on
endmodule
注意上述的代碼有兩對(duì)編譯指示:
> // exemplar translate_off 和 // exemplar translate_on (Leonardo Spectrum 支持)
> // synopsys translate_off 和 // synopsys translate_on(Leonardo Spectrum 和 FPGA CompilerII都支持)
對(duì)于相應(yīng)的綜合器,在這些編譯指示中間的語(yǔ)句將會(huì)被忽略,那我們可以看到在綜合過(guò)程中模塊mult8x8實(shí)際變成了一個(gè)只有I/O定義的空盒子(即black box),所以該部分的代碼沒(méi)有連接,在Quartus布局布線的時(shí)候,lpm模塊的代碼才連接到整個(gè)設(shè)計(jì),在仿真的時(shí)候,編譯指示不影響模塊的完整性。
審核編輯:郭婷
-
FPGA
+關(guān)注
關(guān)注
1645文章
22049瀏覽量
618329 -
asic
+關(guān)注
關(guān)注
34文章
1246瀏覽量
122378 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7651瀏覽量
167365
發(fā)布評(píng)論請(qǐng)先 登錄
TCL服務(wù)技術(shù)規(guī)范
DVB條件接收同密前端系統(tǒng)結(jié)構(gòu)和同步技術(shù)規(guī)范 pdf
華為企業(yè)技術(shù)規(guī)范--防護(hù)電路設(shè)計(jì)規(guī)范
尋找irda技術(shù)規(guī)范
各種抖動(dòng)技術(shù)規(guī)范是什么?抖動(dòng)的影響有哪些?
如何更好地理解各種抖動(dòng)技術(shù)規(guī)范
LED隧道燈推薦性技術(shù)規(guī)范
電氣安全技術(shù)規(guī)范
最核心4大NFC技術(shù)規(guī)范詳解

電動(dòng)汽車(chē)交流充電樁技術(shù)規(guī)范

評(píng)論