找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5782|回復(fù): 0
收起左側(cè)

可維護(hù),可移植的verilog工程設(shè)計(jì)技巧

[復(fù)制鏈接]
ID:113517 發(fā)表于 2016-4-15 01:57 | 顯示全部樓層 |閱讀模式
       忙碌的一年即將結(jié)束了,去年對(duì)我來(lái)說(shuō)有痛、有糾結(jié)、有忙碌、有喜悅、有快樂(lè)、有幸福,如五彩絲綢一般,極度絢爛的一年!
        從我們創(chuàng)業(yè)以來(lái),很多朋友送來(lái)支持和祝福,當(dāng)然,也有很多朋友擔(dān)心我會(huì)慢慢放棄技術(shù)這條路,會(huì)停止我之前一直進(jìn)行的技術(shù)經(jīng)驗(yàn)共享。
        2013年的確很忙,但我仍然抽空寫(xiě)了幾篇技術(shù)文檔和經(jīng)驗(yàn)感受分享?僧吘挂粋(gè)人的精力有限,我一個(gè)人的經(jīng)驗(yàn)分享改變不了什么……最早的時(shí)候我分享設(shè)計(jì),但后來(lái)想授人魚(yú),不如授之以漁,于是開(kāi)始分享設(shè)計(jì)思路和經(jīng)驗(yàn);但現(xiàn)在想來(lái),分享設(shè)計(jì)思路和經(jīng)驗(yàn),不如分享自己樂(lè)于總結(jié)和分享的理念,在這個(gè)層面上,魚(yú)和漁又有了新的指代。
        現(xiàn)在,我們有了公司,公司技術(shù)大咖小咖都支持我的做法,開(kāi)始了技術(shù)經(jīng)驗(yàn)的總結(jié)。我會(huì)從中選出一些技術(shù)含量較高,質(zhì)量好的跟喜歡電子的朋友們一起分享。我不知道我們的公司能存活多久,但我們堅(jiān)持著從事科技前沿的東西,我們的目標(biāo)不只是單純的贏利,我們還可以把更多前沿的技術(shù)帶給更多的人。
        下面附件是我們團(tuán)隊(duì)一位“神秘咖”總結(jié)的FPGA設(shè)計(jì)技巧。因?yàn)榉止づ浜系男枰麆倓傓D(zhuǎn)入FPGA開(kāi)發(fā)不久,用他的話說(shuō),等以后寫(xiě)的文檔水平能被他自己認(rèn)可了,才署名……我覺(jué)得這篇文檔質(zhì)量挺高,可以看出總結(jié)整理的非常用心,很適FPGA剛?cè)腴T(mén)的朋友們參考。

完整的pdf文檔下載: 可維護(hù),可移植的verilog工程設(shè)計(jì)技巧.pdf (241.29 KB, 下載次數(shù): 26)





--------------------------------------------------------------
以下是pdf部分內(nèi)容預(yù)覽:
TIDERIP——新手上路 A


隨著集成電路發(fā)展的腳步,28nm 技術(shù)已經(jīng)大規(guī)模應(yīng)用在 FPGA 領(lǐng)域,F(xiàn)PGA 開(kāi)發(fā)者面 臨著日趨龐大的系統(tǒng)設(shè)計(jì)。筆者也在這段時(shí)間開(kāi)始接觸帶有硬核ARM 的 Cyclone V,Quartus 也華麗麗地升級(jí)到了 13.1 版本。隨著硬件平臺(tái)及開(kāi)發(fā)環(huán)境的更迭,項(xiàng)目版本的更新,深深 感覺(jué)到代碼的可維護(hù)性,可移植性異常重要,所以寫(xiě)下這篇筆記,筆者接觸 FPGA 的時(shí)間 并不長(zhǎng),水平有限,就當(dāng)做拋磚引玉吧。

一,工程設(shè)計(jì)層次化,結(jié)構(gòu)化


要編寫(xiě)可維護(hù)、可移植的工程首先要對(duì)設(shè)計(jì)進(jìn)行層次化、結(jié)構(gòu)化設(shè)計(jì)。不要急于 Coding,先整理思路,做好體系結(jié)構(gòu)和模塊的劃分。一個(gè)設(shè)計(jì)任務(wù)需要按照功能或者類別分 成若干個(gè)可獨(dú)立操作的模塊,每個(gè)模塊又可以細(xì)分下去,這樣可以由若干名工程師同時(shí)設(shè)計(jì), 當(dāng)然也可以選用商業(yè)模塊。通過(guò)這樣的逐次分解與模塊的例化,整個(gè)工程能以設(shè)計(jì)樹(shù)的方式 繪出。
如圖 1 所示:




0.png






這樣的設(shè)計(jì)在后期維護(hù)以及移植的時(shí)候可以根據(jù)具體要求更新部分模塊,盡量少地改 變其他部分的代碼和時(shí)序。(由于 FPGA結(jié)構(gòu)的原因,即使修改部分模塊,也會(huì)對(duì)整體的布 局布線造成改變,需要對(duì)時(shí)序進(jìn)行約束,而這又是另外一個(gè)課題了)
二,模塊及例化 設(shè)計(jì)要做到可維護(hù),可移植,對(duì)底層模塊的要求較高,要求盡量做到功能獨(dú)立、可重入。
功能獨(dú)立便于移植裁剪、系統(tǒng)維護(hù)的時(shí)候可以只對(duì)部分模塊進(jìn)行修改。而模塊的重入性
越高,維護(hù)和移植的時(shí)候修改的代碼量就越小,只對(duì)底層模塊修改即可,上層行為級(jí)模塊可 不做修改。
Verilog 中以例化的方式調(diào)用其他功能模塊,與 C 語(yǔ)言等軟件函數(shù)調(diào)用不同的是,硬件 描述語(yǔ)言的例化是實(shí)實(shí)在在的電路,同一個(gè)功能模塊的多次例化分別是獨(dú)立的實(shí)體,而不是 軟件函數(shù)簡(jiǎn)單的復(fù)用。所以,上面的兩種設(shè)計(jì)技巧只是從 coding 的方面考慮問(wèn)題,而 FPGA 向來(lái)要求從硬件的角度去考慮問(wèn)題,底層模塊的修改,意味電路結(jié)構(gòu),布局布線,時(shí)序都發(fā)生了變化,可維護(hù)性和可移植性在硬件的角度需要更多考慮。詳細(xì)的例化語(yǔ)法這里不做詳述,大家可參考夏宇聞老師的《verilog 數(shù)字系統(tǒng)設(shè)計(jì) 教程》。
Verilog 模塊有兩種編輯方法:原理圖輸入和 verilog 代碼輸入方式。原理圖輸入的方式
勝在結(jié)構(gòu)清晰,而代碼輸入方式則更便于移植和仿真。(一般我們都用 Modelsim進(jìn)行仿真, 目前還無(wú)法對(duì)原理圖輸入的方法進(jìn)行仿真。不過(guò)可以把原理圖轉(zhuǎn)換成 verilogHDL文件再進(jìn) 行仿真,方法是菜單欄 File-->Creat/Updata-->CreatHDLdesignfilesformcurrentfile

三,Parameter 參數(shù)傳遞


Verilog 中可以用 parameter 定義一個(gè)標(biāo)識(shí)符代表一個(gè)常量,有助于提高程序的可讀 性,同時(shí)也方便了模塊例化的可維護(hù)性和可擴(kuò)展性,簡(jiǎn)單舉例:可以對(duì)總線的位寬進(jìn)行 parameter 的定義,這樣就可以很方便地修改總線容量。由于它是 verilog 所特有的參數(shù)傳遞 方法,我們?cè)谶@里詳細(xì)說(shuō)明一下,Parameter語(yǔ)法格式如下:
parameter 參數(shù)名 1 = 表達(dá)式, 參數(shù)名 2 = 表達(dá)式,  .......  參數(shù)名 n = 表達(dá)式;

(這里建議參數(shù)名使用大寫(xiě)字母,方便和變量區(qū)分開(kāi),而表達(dá)式必須是常量表達(dá)式。)
舉例
module Box( X,Y);
parameter LENTH = 100, WIDTH = 50, HIGH = 25;
......

...... endmodule


以下是在 verilog 文件中例化模塊時(shí)傳遞參數(shù)常用的兩種方法:
1、module_name #( parameter1, parameter2) inst_name( port_map);
例如例化上面模塊 Box              #(80,40,20)              box_1( X1, Y1) ;
Box_1 中實(shí)際引用的 LENTH , WIDTH, HIGH 分別為 80,40,20。
2、defparam
defparam heirarchy_path.parameter_name = value;
還是用上面的例子:
module Top( X,Y);
Box box_2( X2,Y2);
endmodule


module Annotate;
defparam
Top.box_2. LENTH =80; Top.box_2. WIDTH =40; Top.box_2. HIGH =20;
endmodule
Box_2 中實(shí)際引用的 LENTH , WIDTH, HIGH 分別為 80,40,20。


在原理圖文件中傳遞參數(shù)的方法比較簡(jiǎn)單,例化的 Box 模塊如下圖,參數(shù)以表格的方 式在例化的 block/symbol 旁邊出現(xiàn),我們只需要修改表格中的值就可以了。




(這里需要注意的是,如果在表格中修改了參數(shù)的值,即使我們修改該模塊的源文件中 parameter的初始值,再重新生成 block/symbol,然后 update原理圖中的該 block/symbol,也 無(wú)法改變實(shí)際使用中引用的 parameter的值,也就是說(shuō),一切以表格中的值為準(zhǔn))
1.003.jpg

四,宏定義 和 條件編譯
`define 宏定義對(duì)系統(tǒng)的可維護(hù),可移植上的作用和 parameter 類似,區(qū)別是兩者的作 用域不同,parameter 作用于聲明的那個(gè)文件,`define 從編譯器讀到這條指令開(kāi)始到編譯結(jié) 束都有效,或者遇到`undef 命令使之失效。(還有一個(gè)小區(qū)別是 parameter前面沒(méi)有“`”)
`define 和 C 語(yǔ)言上的 define 用法很類似,所以在這里不作詳述。 條件編譯常常和宏定義配合使用,用來(lái)對(duì)一部分程序內(nèi)容進(jìn)行選擇性編譯。語(yǔ)法如下:
`ifdef 宏名(標(biāo)識(shí)符) 程序段
`endif
條件編譯可以很好地增強(qiáng)程序的可移植性,比如 Verilog 代碼中的一部分可能適用于某 個(gè)編譯環(huán)境,但不適用于另一個(gè)編譯環(huán)境。如設(shè)計(jì)者不想為兩個(gè)環(huán)境設(shè)計(jì)兩個(gè)版本的 verilog 設(shè)計(jì),就需要對(duì)部分代碼進(jìn)行條件編譯。

五,代碼可讀性 代碼的可讀性不會(huì)影響到程序的功能,但是維護(hù)和移植的工作畢竟要人來(lái)做,所以能
以更少的時(shí)間讀懂代碼,就能更效率地完成工作。在使用 verilog 進(jìn)行 Coding 的過(guò)程中,以 更少的代碼,完成更多的工作,并不一定表示代碼的效率更高,因?yàn)榫幾g器和綜合器會(huì)對(duì)代 碼進(jìn)行優(yōu)化。
代碼的可讀性要求寫(xiě)代碼要規(guī)范,風(fēng)格統(tǒng)一,注釋簡(jiǎn)潔,verilog 的風(fēng)格和 C 語(yǔ)言類 似,所以在此我不對(duì)代碼規(guī)范作過(guò)多的筆墨,大家有興趣可以參考Altera 官網(wǎng)上的 Code style 相關(guān)的 PPT。
(我個(gè)人的一個(gè)設(shè)計(jì)小習(xí)慣是在工程中新建一個(gè)文本文檔,菜單欄 File-->New-->Textfile,在這個(gè)文檔中詳細(xì)記錄一些設(shè)計(jì)思路和版本更新記錄,配合代碼中的注釋,可以很快 對(duì)工程進(jìn)行深入理解)
原理圖輸入才是 FPGA 設(shè)計(jì)與其他編程語(yǔ)言不一樣的地方,所以我詳細(xì)的講一下如 何在 Quartus 中完成可讀性更高,條理結(jié)構(gòu)清晰的原理圖輸入方式,下面簡(jiǎn)單介紹下如何使 用原理圖輸入的方式完成圖 1 的設(shè)計(jì):
底層功能模塊還是采用 verilog 代碼輸入,如圖 1 所示的模塊 A1,A2,B1,C1,C2,需要 將它們生成 block/symbol 以方便原理圖輸入的時(shí)候例化,方法是在工程管理器窗口的 file 頁(yè) 右鍵點(diǎn)擊要生成 block/symbol 的文件,選擇 Creat symbol files for current file。如圖 2

1.004.jpg
圖 2 verilog 文件生成 block/symbol


圖 1 所示的中間模塊 A,B,C 同樣采用原理圖輸入方式,可以使用底層模塊剛剛生成 的 block/symbol。方法為雙擊原理圖的空白處,在彈出的窗口中,雙擊 library 中 Project 目 錄下的 block/symbol


1.005.jpg 圖 3 放置 block/symbol

以模塊 A 為例,需要例化 A1,A2 模塊,根據(jù)功能連接,并放置輸入輸出端口(方法: 可在圖 3 所示的 name 輸入 input 放置輸入端口,輸入 output 放置輸出端口),圖 4 是編輯完 的模塊 A:




1.006.jpg
圖 4              模塊 A


模塊 A 的原理圖編輯完成后,也需要生成 block/symbol 以便頂層模塊 Top 例化,方法 和底層模塊生成 block/symbol 的方式不同,需要在該原理圖為當(dāng)前頁(yè)的時(shí)候,在 Quartus 菜 單欄選擇 File,在 File 的下拉菜單中選擇 Creat/Updata 中的 Creat block/symbol files for current file,將會(huì)在工程目錄下生成和模塊同名的.bsf 文件。如圖 5 所示

1.007.jpg
圖 5 原理圖文件生成 block/symbol



之后就可以在頂層模塊的原理圖文件中添加相應(yīng) block/symbol 了。圖 1 中的模塊 B,C 可以選
擇同樣的辦法。
頂層模塊選擇采用原理圖輸入,例化 A,B,C 后,加入相關(guān)功能邏輯和端口后完成 全部設(shè)計(jì),如圖 6:


1.008.jpg 圖 6 頂層模塊 Top

在頂層模塊原理圖中,只有模塊 A,B,C 可見(jiàn),結(jié)構(gòu)簡(jiǎn)單?梢噪p擊 A,B,C 任一模塊 就可以看到下一層的構(gòu)成,由此可見(jiàn)系統(tǒng)層次分明,有助于對(duì)系統(tǒng)的理解和維護(hù)。
原理圖輸入的方法更貼近硬件工程師的思維,所以層次感很強(qiáng),對(duì)系統(tǒng)理解也沒(méi)有 verilog 代碼文件那么抽象。但是構(gòu)建可維護(hù),可移植的設(shè)計(jì)思想和什么方式輸入是沒(méi)有關(guān) 系的,模塊 A,B,C 以及 TOP 使用 verilog 代碼輸入的方式也同樣能實(shí)現(xiàn)相應(yīng)的功能,關(guān)鍵是 對(duì)模塊功能的理解及分類,這無(wú)關(guān)于編輯和例化模塊的形式。



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表