0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA研發(fā)設(shè)計規(guī)范的簡明探討

FPGA技術(shù)江湖 ? 來源:FPGA技術(shù)江湖 ? 2024-04-26 11:43 ? 次閱讀

今天和大俠聊一聊FPGA研發(fā)設(shè)計相關(guān)規(guī)范,養(yǎng)成良好的個人習(xí)慣,代碼設(shè)計風(fēng)格等,都有助于日后發(fā)展。有哪些設(shè)計規(guī)范,從文檔到工程建立等,聊一聊也許你會學(xué)到很多東西,少走很多彎路哦。話不多說,上貨。在團隊項目開發(fā)中,為了使開發(fā)的高效性、一致性、正確性,團隊?wèi)?yīng)當(dāng)要有一個規(guī)范的設(shè)計流程。按照規(guī)范來完成項目的設(shè)計開發(fā)工作,歸類清晰明了的工程文件夾級別;項目應(yīng)擁有良好風(fēng)格和完整的文檔,如設(shè)計思路與調(diào)試記錄及器件選型等;代碼書寫高效,即統(tǒng)一的書寫規(guī)范,文件頭包含的信息完整,無論自己還是團隊他人閱讀便一目了然。一、文檔命名:清晰的文檔命名能夠讓我們思路非常的清晰,所以FPGA工程文件夾的目錄要求層次鮮明,歸類清晰。一個工程必須要有一個嚴(yán)整的框架結(jié)構(gòu),用來存放相關(guān)的文檔、設(shè)計,不僅方便自己查看,也提高了項目的團隊工作效率。下面我們來舉例說明: 一級文件夾為工程名《project》二級文件夾多個:用以存放源文件《src》用以存放Testbench文件《sim》用來存放設(shè)計思路相關(guān)類的文件《doc》 用來存放IP 核的文件《core》等等…

二、設(shè)計文檔化:將自己對設(shè)計的思路和調(diào)試記錄在文檔中,有利于以后對模塊功能的添加和維護(hù),并且在項目聯(lián)調(diào)時方便項目組其他人員讀代碼。也方便不同廠家的FPGA之間移植,以及FPGA到ASIC的移植。如下圖就是設(shè)計文檔化的舉例說明,文檔介紹清晰,功能分析明確,有利于以后對模塊功能的添加和維護(hù)。

設(shè)計思路:按照項目的要求,自頂向下的分成若干模塊,分別編寫功能。頂層盡量只做行為描述,邏輯描述在底層編寫。模塊的編寫要有硬件電路思維方式,每一個模塊的設(shè)計都應(yīng)考慮是否存在該硬件電路,盡量采用同步設(shè)計。

三、編碼風(fēng)格:每個module應(yīng)存在于單獨的源文件中,源文件名應(yīng)與其所包含的模塊名相同。每個設(shè)計都應(yīng)該有一個完善的文件頭,包含公司名稱、設(shè)計者、設(shè)計時間、文件名、所屬項目、模塊名稱及功能、修改記錄及版本信息等內(nèi)容。代碼中的標(biāo)識符采用傳統(tǒng)C語言的命名方法,在單詞之間用下劃線分開,采用有意義,能反應(yīng)對象特征、作用和性質(zhì)的單詞命名標(biāo)識符,以此來增強程序的可讀性。為避免標(biāo)識符過于冗長,較長的單詞可以適當(dāng)?shù)目s寫。

四、代碼規(guī)范:

低電平有效的信號,后綴名要用“_n”,比如低電平有效的復(fù)位信號“rst_n”

模塊名和信號名統(tǒng)一小寫

變量名要小寫,如wire、reg、input、output等定義的

變量命名應(yīng)按照變量的功能用英文簡潔表示出來“xxx_xxx_xxx”,避免過長

采用大寫字母定義常量參數(shù),參數(shù)名小于20個字母,如parameter TIME=20

時鐘信號應(yīng)前綴“clk”,復(fù)位信號應(yīng)前綴“rst”

對于頂層模塊的輸出信號盡量被寄存

三態(tài)邏輯避免在子模塊使用,可以在頂層模塊使用

到其它模塊的接口信號按:輸入、(雙向)、輸出的順序定義端口

一個模塊至少要有一個輸入、輸出,避免書寫空模塊

時鐘事件的表達(dá)式用“posedge”或“negedge”的形式

If語句嵌套不能太多

建議不要使用include語句

建議每個模塊添加timescale

代碼中給出必要的注釋

每個文件有個一頭文件

每個文件只包含一個模塊

模塊名和文件名保持一致

異步復(fù)位,用if(xxx==1’b1) 或 if(xxx==1’b0)

同步時序邏輯的always block中有且只有一個時鐘信號,并且在同一個沿動作

采用同步設(shè)計,避免使用異步邏輯

一般不要將時鐘信號作為數(shù)據(jù)信號的輸入

不要在時鐘路徑上添加任何buffer

在頂層模塊中,時鐘信號必須可見

不要采用向量定義的方式定義一組時鐘信號

不要在模塊內(nèi)部生成時鐘信號,使用pll產(chǎn)生

盡量不使用任務(wù)

不使用事件變量

不使用系統(tǒng)函數(shù)

不使用disable語句

盡量不使用forever、repeat、while等循環(huán)語句

不使用不可綜合的運算符

在一個always語句中有且只能有一個事件列表

移位變量必須是一個常數(shù)

時序邏輯語塊中統(tǒng)一使用非阻塞型賦值

組合邏輯語塊中使用阻塞型賦值

五、注釋規(guī)則1、每個文件有一個文件頭,文件頭中注明文件名、功能描述、引用模塊、設(shè)計者、設(shè)計時間、版權(quán)信息以及修改信息等;2、對信號、參量、引腳、模塊、函數(shù)及進(jìn)程等加以說明,便于閱讀與維護(hù),如信號的作用、頻率、占空比、高低電平寬度等。用“//”做小于1行的注釋,用“/* */”做多于1行的注釋。更新的內(nèi)容要做注釋,記錄修改原因,修改日期和修改人。

六、模塊規(guī)則1、module例化名用u_xx_x標(biāo)示;2、建議給每個模塊要加timescale;3、不要書寫空的模塊,即:一個模塊至少要有一個輸入和一個輸出;4、為了保持代碼的清晰、美觀和層次感,一條語句應(yīng)占用一行,每行限制在80個字符以內(nèi),如果較長(超出80個字符)則換行;5、采用基于名字(name_based)的調(diào)用而不是基于順序的(order_based)的調(diào)用;6、模塊的接口信號按輸入、雙向、輸出順序定義;7、使用降序定義向量有效位順序,最低位為0;8、管腳和信號說明部分:一個管腳和一組總線占用一行,說明要清晰;9、不要采用向量的方式定義一組時鐘信號;10、邏輯內(nèi)部不對input進(jìn)行驅(qū)動,在module內(nèi)不存在沒有驅(qū)動源的信號,更不能在模塊端口存在沒有驅(qū)動的輸出信號,避免在elabarate和compile時產(chǎn)生warning;11、在頂層模塊中,除了內(nèi)部的互連和module的例化外,避免在做其他邏輯;12、出于層次設(shè)計和同步設(shè)計的考慮,子模塊輸出信號建議用寄存器;13、內(nèi)部模塊端口避免inout,最好在最頂層模塊處理雙向總線;14、子模塊中禁止使用三態(tài)邏輯,可以在頂層模塊使用;15、禁止出現(xiàn)未連接的端口;16、為邏輯升級保留的無用端口和信號要注釋;對于層次化設(shè)計的邏輯,在升級中采用增量編譯;建議采用層次化設(shè)計,模塊之間相對獨立。

七、線網(wǎng)和寄存器規(guī)則1、鎖存器和觸發(fā)器不允許在不同的always塊中賦值,造成多重驅(qū)動;2、出于功能仿真考慮,非阻塞賦值應(yīng)該增加單位延時,對于寄存器類型的變量賦值時,尤其要注意這一點;阻塞賦值不允許使用單位延時;3、always語句實現(xiàn)時序邏輯采用非阻塞賦值;always語句實現(xiàn)的組合邏輯和assign語句塊中使用阻塞賦值;4、同一信號賦值不能同時使用阻塞和非阻塞兩種方式;5、不允許出現(xiàn)定義了parameter、wire、reg卻沒有使用的情況;6、不建議使用integer類型寄存器;7、寄存器類型的信號要初始化;8、除移位寄存器外,每個always語句只對一個變量賦值,盡量避免在一個always語句出現(xiàn)多個變量進(jìn)行運算或賦值。

八、表達(dá)式規(guī)則1、在表達(dá)式內(nèi)使用括號表示運算的優(yōu)先級,一行中不能出現(xiàn)多個表達(dá)式;2、不要給信號賦“x”態(tài),以免x值傳遞;3、設(shè)計中使用到的0,1,z等常數(shù)采用基數(shù)表示法書寫(即表示為1‘b0,1’b1,1‘bz或十六進(jìn)制);4、端口申明、比較、賦值等操作時,數(shù)據(jù)位寬要匹配。

九、條件語句規(guī)則1、if 都有else和它對應(yīng),變量在if-else或case語句中所有變量在所有分支中都賦值;2、如果用到case語句,記得default項;3、禁止使用casex,case語句item必須使用常數(shù);4、不允許使用常數(shù)作為if語句的條件表達(dá)式;5、條件表達(dá)式必須是1bit value;6、如異步復(fù)位:高電平有效使用“if(asynch_reset==1’b1)”,低電平“if(asynch_reset==1‘b0)”,不要寫成:“if(!asynch_reset)”或者“if(asynch_reset==0)”;

7、不推薦嵌套使用5級以上if…else if…結(jié)構(gòu)。

十、可綜合部分規(guī)則1、不要使用include語句;2、不要使用disable、initial等綜合工具不支持的電路,而應(yīng)采用復(fù)位方式進(jìn)行初始化,但在testbench電路中可以使用;3、不使用specify模塊,不使用===、!==等不可綜合的操作符;4、除仿真外,不使用fork-join語句;5、除仿真外,不使用while語句;6、除仿真外,不使用repeat語句;7、除仿真外,不使用forever語句;8、除仿真外,不使用系統(tǒng)任務(wù)($);9、除仿真外,不使用deassign語句;10、除仿真外,不使用force,release語句;11、除仿真外,不使用named events語句;不在連續(xù)賦值語句中引入驅(qū)動強度和延時;12、禁止使用trireg型線網(wǎng);13、制止使用tri1、tri0、triand和trior型的連接;14、不要給驅(qū)動supply0和supply1型的線網(wǎng)賦值;15、設(shè)計中不使用macro_module;16、不要在RTL代碼中實例化門級單元,其下列單元:(CMOS/RCOMS/NMOS/PMOS/RNMOS/RPMOS/trans/rtrans/tranif0/tranif1/rtranif0/tranif1/pull_gate)。

十一、可重用部分規(guī)則1、考慮未使用的輸入信號power_down,避免傳入不穩(wěn)定態(tài);2、接口信號盡量少,接口時序盡量簡單;3、將狀態(tài)機(FSM)電路與其它電路分開,便于綜合和后端約束;4、將異步電路和同步電路區(qū)分開,便于綜合和后端約束,將相關(guān)的邏輯放在一個模塊內(nèi);5、合理劃分設(shè)計的功能模塊,保證模塊功能的獨立性;6、合理劃分模塊的大小,避免模塊過大;7、在設(shè)計的頂層(top)模塊,將I/O口、Boundary scan電路、以及設(shè)計邏輯(corelogic)區(qū)分開。

十二、同步設(shè)計規(guī)則1、同一個module中,要在時鐘信號的同一個沿動作;2、如果必須使用時鐘上升沿和時鐘下降沿,則要分兩個module設(shè)計;3、在頂層模塊中,時鐘信號必須可見,不在模塊內(nèi)部生成時鐘信號,而要使用DCM/PLL產(chǎn)生的時鐘信號;4、避免使用門控時鐘和門控復(fù)位;5、同步復(fù)位電路,建議在同一時鐘域使用單一的全局同步復(fù)位電路;異步復(fù)位電路,建議使用單一的全局異步復(fù)位電路;6、不在時鐘路徑上添加任何buffer;7、不在復(fù)位路徑上添加任何buffer;8、避免使用latch;9、寄存器的異步復(fù)位和異步置位信號不能同時有效;10、避免使用組合反饋電路;11、always有且僅有一個的敏感事件列表,敏感事件列表要完整,否則可能會造成前后仿真的結(jié)果不一致;12、異步復(fù)位情況下需要異步復(fù)位信號和時鐘沿做敏感量,同步復(fù)位情況下只需要時鐘沿做敏感量;13、時鐘事件的表達(dá)式要用:“negedge《clk_name》”或“posedge《clock_name》”的形式;14、復(fù)雜電路將組合邏輯和時序邏輯電路分成獨立的always描述。

十三、循環(huán)語句規(guī)則1、在設(shè)計中不推薦使用循環(huán)語句;2、在非常有必要使用的循環(huán)語句時,可以使用for語句。

十四、約束規(guī)則1、對所有時鐘頻率和占空比都進(jìn)行約束;2、對全局時鐘skew進(jìn)行約束;3、對于時序要求的路徑需要針對特殊要求進(jìn)行約束,如鎖相環(huán)鑒相信號;4、要根據(jù)輸出管腳驅(qū)動要求進(jìn)行約束,包括驅(qū)動電流和信號邊沿特性;5、要根據(jù)輸入和輸出信號的特性進(jìn)行管腳上下拉約束;6、針對關(guān)鍵I/O是否約束了輸入信號和輸入時鐘的相位關(guān)系,控制輸入信號在CLK信號之后或之前多少ns到達(dá)輸入pad;7、綜合設(shè)置時,fanout建議設(shè)置為3030;8、要使用輸入輸出模塊中的寄存器,如Xinlinx公司的IOB,map properties選項pack I/O register/latches into IOBsactor需要設(shè)置成為“for input and output”,這樣可以控制管腳到內(nèi)部觸發(fā)器的延時時間;9、布局布線報告中IOB、LUTs、RAM等資源利用率應(yīng)小于百分之八十;10、對于邏輯芯片對外輸入接口,進(jìn)行tsu/th約束;對于邏輯芯片對外輸出接口,進(jìn)行約束。

十五、PLL/DCM1、如果使用FPGA內(nèi)部DCM和PLL時,應(yīng)該保證輸入時鐘的抖動小于300ps,防止DCM/PLL失鎖;如果輸入時鐘瞬斷后必須復(fù)位PLL/DCM。2、對于所有廠家的FPGA,其片內(nèi)鎖相環(huán)只能使用同頻率的時鐘信號進(jìn)行鎖相,如果特殊情況下需要使用不同頻率的信號進(jìn)行鎖相,需要得到廠家的認(rèn)可,以避免出時鐘。

十六、代碼編輯由于不同編輯器處理不同,對齊代碼使用空格,而不是tab鍵。

***可綜合和不可綜合詳解***(1)所有綜合工具都支持的結(jié)構(gòu):always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not, bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。(2)所有綜合工具都不支持的結(jié)構(gòu):time,defparam,$finish,fork,join,initial,delays,UDP,wait。(3)有些工具支持有些工具不支持的結(jié)構(gòu):casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。

建立可綜合模型的原則要保證Verilog HDL賦值語句的可綜合性,在建模時應(yīng)注意以下要點:(1)不使用initial。 (2)不使用#10。 (3)不使用循環(huán)次數(shù)不確定的循環(huán)語句,如forever、while等。 (4)不使用用戶自定義原語(UDP元件)。 (5)盡量使用同步方式設(shè)計電路。 (6)除非是關(guān)鍵路徑的設(shè)計,一般不采用調(diào)用門級元件來描述設(shè)計的方法,建議采用行為語句來完成設(shè)計。 (7)用always過程塊描述組合邏輯,應(yīng)在敏感信號列表中列出所有的輸入信號。 (8)所有的內(nèi)部寄存器都應(yīng)該能夠被復(fù)位,在使用FPGA實現(xiàn)設(shè)計時,應(yīng)盡量使用器件的全局復(fù)位端作為系統(tǒng)總的復(fù)位。 (9)對時序邏輯描述和建模,應(yīng)盡量使用非阻塞賦值方式。對組合邏輯描述和建模,既可以用阻塞賦值,也可以用非阻塞賦值。但在同一個過程塊中,最好不要同時用阻塞賦值和非阻塞賦值。 (10)不能在一個以上的always過程塊中對同一個變量賦值。而對同一個賦值對象不能既使用阻塞式賦值,又使用非阻塞式賦值。 (11)如果不打算把變量推導(dǎo)成鎖存器,那么必須在if語句或case語句的所有條件分支中都對變量明確地賦值。 (12)避免混合使用上升沿和下降沿觸發(fā)的觸發(fā)器。 (13)同一個變量的賦值不能受多個時鐘控制,也不能受兩種不同的時鐘條件(或者不同的時鐘沿)控制。 (14)避免在case語句的分支項中使用x值或z值。

1、initial 只能在test bench中使用,不能綜合。(用ISE9.1綜合時,有的簡單的initial也可以綜合,不知道為什么)

2、events event在同步test bench時更有用,不能綜合。3、real 不支持real數(shù)據(jù)類型的綜合。4、time 不支持time數(shù)據(jù)類型的綜合。5、force 和release 不支持force和release的綜合。6、assign 和deassign 不支持對reg 數(shù)據(jù)類型的assign或deassign進(jìn)行綜合,支持對wire數(shù)據(jù)類型的assign或deassign進(jìn)行綜合。7、fork join 不可綜合,可以使用非塊語句達(dá)到同樣的效果。 8、primitives 支持門級原語的綜合,不支持非門級原語的綜合。9、table 不支持UDP 和table的綜合。10、敏感列表里同時帶有posedge和negedge如:always @(posedge clk or negedge clk) begin.。.end這個always塊不可綜合。11、同一個reg變量被多個always塊驅(qū)動12、延時以#開頭的延時不可綜合成硬件電路延時,綜合工具會忽略所有延時代碼,但不會報錯。如:a=#10 b;這里的#10是用于仿真時的延時,在綜合的時候綜合工具會忽略它。也就是說,在綜合的時候上式等同于a=b;13、與X、Z的比較可能會有人喜歡在條件表達(dá)式中把數(shù)據(jù)和X(或Z)進(jìn)行比較,殊不知這是不可綜合的,綜合工具同樣會忽略。所以要確保信號只有兩個狀態(tài):0或1。如:

以上是個人整理出來的一些設(shè)計規(guī)范,有些部分有重復(fù),但無傷大雅,適用于FPGA Verilog HDL設(shè)計,VHDL的話設(shè)計思想是一樣,大同小異,大家可以舉一反三。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598879

原文標(biāo)題:簡談FPGA研發(fā)設(shè)計相關(guān)規(guī)范(很實用)

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    資源分享季 (4)——華為FPGA設(shè)計規(guī)范及指導(dǎo)

    本帖最后由 upmcu 于 2012-7-28 15:06 編輯 截圖:華為_大規(guī)模邏輯設(shè)計指導(dǎo)書.pdf華為fpga設(shè)計規(guī)范(Verilog_Hdl).docx
    發(fā)表于 07-28 13:50

    華為FPGA設(shè)計規(guī)范

    華為FPGA設(shè)計規(guī)范
    發(fā)表于 08-17 10:58

    華為FPGA設(shè)計規(guī)范

    華為FPGA設(shè)計規(guī)范
    發(fā)表于 08-20 23:35

    研發(fā)PCB工藝設(shè)計規(guī)范資料

    研發(fā)PCB工藝設(shè)計規(guī)范資料,有經(jīng)驗的人寫的,搞PCB設(shè)計的都用的著
    發(fā)表于 03-14 19:31

    PCB設(shè)計規(guī)范

    PCB設(shè)計規(guī)范
    發(fā)表于 03-19 10:41

    PCB設(shè)計規(guī)范大全

    PCB工藝參數(shù)PCB工藝設(shè)計規(guī)范華碩內(nèi)部的PCB設(shè)計規(guī)范華為印刷電路板PCB設(shè)計規(guī)范上海貝爾PCB設(shè)計規(guī)范數(shù)字電路PCB設(shè)計的抗干擾分布印制板PCB
    發(fā)表于 10-24 14:54

    altium designer 設(shè)計規(guī)范

    altium designer 設(shè)計規(guī)范
    發(fā)表于 04-26 10:24

    接地設(shè)計規(guī)范與指南---PCB接地設(shè)計規(guī)范

    接地設(shè)計規(guī)范與指南---PCB接地設(shè)計規(guī)范
    發(fā)表于 08-15 07:35

    電氣設(shè)計規(guī)范

    電氣設(shè)計規(guī)范:本匯編搜集了綜合類規(guī)范、供配電設(shè)計規(guī)范、電力系統(tǒng)裝置設(shè)計規(guī)范、照明設(shè)計規(guī)范、消防報警系統(tǒng)設(shè)
    發(fā)表于 06-25 08:05 ?165次下載
    電氣<b class='flag-5'>設(shè)計規(guī)范</b>

    JTAG電路設(shè)計規(guī)范

    JTAG電路設(shè)計規(guī)范:本技術(shù)設(shè)計規(guī)范根據(jù)國家標(biāo)準(zhǔn)和原郵電部標(biāo)準(zhǔn)以及國際標(biāo)準(zhǔn)IEEE STD 1149.1 系列標(biāo)準(zhǔn)編制而成。 目前,使用的芯片中越來越多的CPU、EPLD、FPGA、DSP 以及一些
    發(fā)表于 09-19 07:40 ?94次下載

    PCB設(shè)計規(guī)范—設(shè)計要點

    DDR4 PCB設(shè)計規(guī)范&設(shè)計要點,DDR4 PCB設(shè)計規(guī)范&設(shè)計要點
    發(fā)表于 07-26 14:09 ?0次下載

    華為PCBLayout設(shè)計規(guī)范

    華為PCBLayout設(shè)計規(guī)范
    發(fā)表于 06-13 14:54 ?0次下載

    詳解FPGA設(shè)計規(guī)范與應(yīng)用

    點擊上方 藍(lán)字 關(guān)注我們 FPGA設(shè)計規(guī)范 ? ? ? ?1.設(shè)計必須文檔化。要將設(shè)計思路,詳細(xì)實現(xiàn)等寫入文檔,然后經(jīng)過嚴(yán)格評審?fù)ㄟ^后才能進(jìn)行下一步的工作。這樣做乍看起來很花時間,但是從整個項目過程
    的頭像 發(fā)表于 06-19 09:35 ?1449次閱讀

    FPGA芯片外圍電路設(shè)計規(guī)范和配置過程

    小編在本節(jié)介紹FPGA芯片外圍電路設(shè)計規(guī)范和配置過程,篇幅比較大,時鐘的設(shè)計原則就有17條,伙伴們耐心讀一讀。
    的頭像 發(fā)表于 08-15 16:18 ?6395次閱讀
    <b class='flag-5'>FPGA</b>芯片外圍電路<b class='flag-5'>設(shè)計規(guī)范</b>和配置過程

    (FPC)設(shè)計規(guī)范.zip

    (FPC)設(shè)計規(guī)范
    發(fā)表于 03-01 15:37 ?4次下載