VERILOG語(yǔ)言編寫規(guī)范_第1頁(yè)
VERILOG語(yǔ)言編寫規(guī)范_第2頁(yè)
VERILOG語(yǔ)言編寫規(guī)范_第3頁(yè)
VERILOG語(yǔ)言編寫規(guī)范_第4頁(yè)
VERILOG語(yǔ)言編寫規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、VERILOG語(yǔ)言編寫規(guī)范1 目的本規(guī)范的目的是提高書寫代碼的可讀性 可修改性 可重用性,優(yōu)化代碼綜合和仿真結(jié)果,指導(dǎo)設(shè)計(jì)工程師使用VerilogHDL規(guī)范代碼和優(yōu)化電路 ,規(guī)范化公司的ASIC設(shè)計(jì)輸入 從而做到 1. 邏輯功能正確 2.可快速仿真 3. 綜合結(jié)果最優(yōu) 如果是hardware model)4. 可讀性較好。2 范圍本規(guī)范涉及Verilog HDL編碼風(fēng)格, 編碼中應(yīng)注意的問(wèn)題, Testbench的編碼等。本規(guī)范適用于Verilog model的任何一級(jí)( RTL behavioral, gate_level), 也適用于出于仿真,綜合或二者結(jié)合的目的而設(shè)計(jì)的模塊。3 定義Ve

2、rilog HDL : Verilog 硬件描述語(yǔ)言FSM : 有限狀態(tài)機(jī)偽路徑 : 靜態(tài)時(shí)序分析( STA) 認(rèn)為是時(shí)序失敗, 而設(shè)計(jì)者認(rèn)為是正確的路徑4 引用標(biāo)準(zhǔn)和參考資料下列標(biāo)準(zhǔn)包含的條文 通過(guò)在本標(biāo)準(zhǔn)中引用而構(gòu)成本標(biāo)準(zhǔn)的條文 在標(biāo)準(zhǔn)出版時(shí) 所示版本均為有效 所有標(biāo)準(zhǔn)都會(huì)被修訂 使用本標(biāo)準(zhǔn)的各方應(yīng)探討 使用下列標(biāo)準(zhǔn)最新版本的可能性Actel HDLCoding Style GuiderSun MicrosystemsRevision 1.0VerilogStyle and Coding Guidelines5 規(guī)范內(nèi)容5.1 Verilog 編碼風(fēng)格本章節(jié)中提到的Verilog編碼規(guī)則和

3、建議適應(yīng)于 Verilog model的任何一級(jí)( RTL behavioral,gate_level) 也適用于出于仿真, 綜合或二者結(jié)合的目的而設(shè)計(jì)的模塊。5.1.1 命名規(guī)范選擇有意義的信號(hào)和變量名, 對(duì)設(shè)計(jì)是十分重要的。 命名包含信號(hào)或變量諸如出處, 有效狀態(tài)等基本含義 下面給出一些命名的規(guī)則。1. 用有意義而有效的名字有效的命名有時(shí)并不是要求將功能描述出來(lái) 如For ( I = 0; I < 1024; I = I + 1 )MemI<= #1 32b0;For 語(yǔ)句中的循環(huán)指針I(yè) 就沒(méi)必要用loop_index作為指針名。2. 用連貫的縮寫長(zhǎng)的名字對(duì)書寫和記憶會(huì)帶來(lái)不便

4、, 甚至帶來(lái)錯(cuò)誤 采用縮寫時(shí)應(yīng)注意同一信號(hào)在模塊中的一致性。 縮寫的例子如下:Addr address Pntr pointerClk clockRst reset3. 用名字前加小寫n表示低電平有效 高電平有效的信號(hào)不得以下劃線表示 短暫的引擎信號(hào)建議采用高有效如 nRst, nTrdy, nIrdy nIdsel.4. 大小寫原則名字一般首字符大寫 ,其余小寫 (但parameter, integer 定義的數(shù)值名可全部用大寫),兩個(gè)詞之間要用下劃線連接(或第二個(gè)單詞首字母大寫)如 :Packet_addr, Data_in, Mem_wr , Mem_ce_Or: PacketAddr,

5、 DataIn, MemWr , MemCe5.全局信號(hào)名字中應(yīng)包含信號(hào)來(lái)源的一些信息如: D_addr7:2 這里的 D 指明了地址是解碼模塊(Decoder module)中的地址.6. 同一信號(hào)在不同層次應(yīng)保持一致性7. 自己定義的常數(shù) 類型等用大寫標(biāo)識(shí)如: parameter CYCLE=100.8 避免使用保留字如 in out x z等不能夠做為變量 端口或模塊名9. 添加有意義的后綴 使信號(hào)名更加明確 常用的后綴如下芯片的雙向信號(hào) -xbio芯片的三態(tài)輸出 _xz芯片的漏極開(kāi)路輸出 _xod芯片原始輸出信號(hào) _xo芯片原始輸入信號(hào) _xi下降沿有效的寄存器 _f連到三態(tài)輸出的信號(hào)

6、 _z寄存前的信號(hào) _next時(shí)鐘信號(hào) _Clk5.1.2 Modules1.頂層模塊應(yīng)只是內(nèi)部模塊間的互連Verilog設(shè)計(jì)一般都是層次型的設(shè)計(jì), 也就是在設(shè)計(jì)中會(huì)出現(xiàn)一個(gè)或多個(gè)模塊, 模塊間的調(diào)用在所難免。 可把設(shè)計(jì)比喻成樹(shù), 被調(diào)用的模塊就是樹(shù)葉, 沒(méi)被調(diào)用的模塊就是樹(shù)根, 那么在這個(gè)樹(shù)根模塊中, 除了內(nèi)部的互連和模塊的調(diào)用外, 盡量避免再做邏輯, 如:不能再出現(xiàn)對(duì)reg變量賦值等, 這樣做的目的是為了更有效的綜合, 因?yàn)樵陧攲幽K中出現(xiàn)中間邏輯 ,Synopsys 的design compiler 就不能把子模塊中的邏輯綜合到最優(yōu)。2. 每一個(gè)模塊應(yīng)在開(kāi)始處注明文件名 功能描述 引用模

7、塊 設(shè)計(jì)者 設(shè)計(jì)時(shí)間及版權(quán)信息等如 /* = *Filename SPI_M.vAuthor whqDescription File descriptionCalled by Top module Revision History time yy-mm-ddRevision 1.0Email wuhaoqian1Copyright(c)1999, ,All right reserved/* = *3. 不要對(duì)Inpu t進(jìn)行驅(qū)動(dòng), 在module 內(nèi)不要存在沒(méi)有驅(qū)動(dòng)的信號(hào), 更不能在模塊端口中出現(xiàn)沒(méi)有驅(qū)動(dòng)的輸出信號(hào), 避免在仿真或綜合時(shí)產(chǎn)生warning, 干擾錯(cuò)誤定位4. 每行應(yīng)限制在80個(gè)

8、字符以內(nèi) 以保持代碼的清晰 美觀和層次感一條語(yǔ)句占用一行 如果較長(zhǎng),超出80個(gè)字符 則要換行。5. 電路中調(diào)用的 module 名用 Uxx 標(biāo)示。 向量大小表示要清晰, 采用基于名字(name_based) 的調(diào)用而非基于順序的 (order_based)。Instance UInstance2(.DataOut (DOUT ),.DataIn (DIN ),.Cs_ (Cs_ );6. 用一個(gè)時(shí)鐘的上沿或下沿采樣信號(hào), 不能一會(huì)兒用上沿, 一會(huì)兒用下沿。 如果既要用上沿又要用下沿, 則應(yīng)分成兩個(gè)模塊設(shè)計(jì)。 建議在頂層模塊中對(duì)Clock做一非門,在層次模塊中如果要用時(shí)鐘下沿就可以用非門產(chǎn)生的

9、PosedgeClk_ , 這樣的好處是在整個(gè)設(shè)計(jì)中采用同一種時(shí)鐘沿觸發(fā), 有利于綜合。 基于時(shí)鐘的綜合策略7. 在模塊中增加注釋對(duì)信號(hào), 參量, 引腳, 模塊, 函數(shù)及進(jìn)程等加以說(shuō)明, 便于閱讀與維護(hù)。8. Module 名要用大寫標(biāo)示, 且應(yīng)與文件名保持一致。如 Module DFF_ASYNC_RST(Reset,Clk,Data,Qout);嚴(yán)格芯片級(jí)模塊的劃分只有頂層包括IO引腳(pads), 中間層是時(shí)鐘產(chǎn)生模塊, JTAG, 芯片的內(nèi)核(CORE),這樣便于對(duì)每個(gè)模塊加以約束仿真, 對(duì)時(shí)鐘也可以仔細(xì)仿真。模塊輸出寄存器化對(duì)所有模塊的輸出加以寄存( 如圖1) 使得輸出的驅(qū)動(dòng)強(qiáng)度和輸

10、入的延遲可以預(yù)測(cè), 從而使得模塊的綜合過(guò)程更簡(jiǎn)單- 輸出驅(qū)動(dòng)的強(qiáng)度都等于平均的觸發(fā)器驅(qū)動(dòng)強(qiáng)度圖19.將關(guān)鍵路徑邏輯和非關(guān)鍵路徑邏輯放在不同模塊保證DC可以對(duì)關(guān)鍵路徑模塊實(shí)現(xiàn)速度優(yōu)化, 而對(duì)非關(guān)鍵路徑模塊實(shí)施面積優(yōu)化 在。同一模塊DC無(wú)法實(shí)現(xiàn)不同的綜合策略,將相關(guān)的組合邏輯放在同一模塊,有助于DC對(duì)其進(jìn)行優(yōu)化 因?yàn)镈C通常不能越過(guò)模塊的邊界來(lái)優(yōu)化邏輯。5.1.3 Net and Register1. 一個(gè)reg變量只能在一個(gè)always語(yǔ)句中賦值2. 向量有效位順序的定義一般是從大數(shù)到小數(shù)盡管定義有效位的順序很自由, 但如果采用毫無(wú)規(guī)則的定義勢(shì)必會(huì)給作者和讀代碼的人帶來(lái)困惑 ,如 Data-4:

11、 0, 則 LSB0-1-2-3-4MSB, 或 Data0: 4 則LSB43210MSB 這兩種情況的定義都不太好, 推薦Data4: 0這種格式的定義。3.對(duì)net和register類型的輸出要做聲明 在PORT中。如果一個(gè)信號(hào)名沒(méi)做聲明 Verilog將假定它為一位寬的wire變量。4. 線網(wǎng)的多種類型。 寄存器的類型。5.1.4 Expressions1. 用括號(hào)來(lái)表示執(zhí)行的優(yōu)先級(jí)盡管操作符本身有優(yōu)先順序, 但用括號(hào)來(lái)表示優(yōu)先級(jí)對(duì)讀者更清晰, 更有意義。If (alpha < beta) && (gamma >= delta). 比下面的表達(dá)更合意If (

12、alpha < beta && gamma >= delta).(判斷邏輯應(yīng)是化簡(jiǎn)過(guò)后的最簡(jiǎn)形式!)2. 用一個(gè)函數(shù)(function)來(lái)代替表達(dá)式的多次重復(fù)如果代碼中發(fā)現(xiàn)多次使用一個(gè)特殊的表達(dá)式 ,那么就用一個(gè)函數(shù)來(lái)代替, 這樣在以后的版本升級(jí)時(shí)更便利, 這種概念在做行為級(jí)的代碼設(shè)計(jì)時(shí)同樣使用, 經(jīng)常使用的一組描述可以寫到一個(gè)任務(wù)(task)中。5.1.5 IF 語(yǔ)句1. 向量比較時(shí) 比較的向量要相等當(dāng)比較向量時(shí) verilog將對(duì)位數(shù)小的向量做0 擴(kuò)展以使它們的長(zhǎng)度相匹配 它的自動(dòng)擴(kuò)展為隱式的 建議采用顯示擴(kuò)展 這個(gè)規(guī)律同樣適用于向量同常量的比較Reg Abc7

13、:0;Reg Bca3:0;.If (Abc= = 4b0, Bca)begin.If (Abc= = 8b0) begin2. 每一個(gè)If 都應(yīng)有一個(gè)else 和它相對(duì)應(yīng)在做硬件設(shè)計(jì)時(shí), 常要求條件為真時(shí)執(zhí)行一種動(dòng)作而條件為假時(shí)執(zhí)行另一動(dòng)作 即使認(rèn)為條件為假不可能發(fā)生, 沒(méi)有else可能會(huì)使綜合出的邏輯和,RTL級(jí)的邏輯不同。如果條件為假時(shí)不進(jìn)行任何操作, 則用一條空語(yǔ)句。always (Cond)beginif (Cond)DataOut<= DataIn;End/ Else以上語(yǔ)句DataOut會(huì)綜合成鎖存器.3. 應(yīng)注意If .else if .else if .else 的優(yōu)先

14、級(jí)4. 如果變量在If-else 或case 語(yǔ)句中做非完全賦值 則應(yīng)給變量一個(gè)缺省值。即V1 = 2b00;V2 = 2b00;V3 = 2b00;If (a = = b) beginV1 = 2b01; /V3 is not assignedV2 = 2b10;EndElse if (a = = c) beginV2 = 2b10; /V1 is not assignedV3 = 2b11;EndElse 5.1.6 case 語(yǔ)句1. case語(yǔ)句通常綜合成一級(jí)多路復(fù)用器 (圖的右邊部分), 而if-then-else則綜合成優(yōu)先編碼的串接的多個(gè)多路復(fù)用器, 如圖的左邊部分 通常 使用c

15、ase 語(yǔ)句要比if語(yǔ)句快, 優(yōu)先編碼器的結(jié)構(gòu)僅在信號(hào)的到達(dá)有先后時(shí)使用。 條件賦值語(yǔ)句也能綜合成多路復(fù)用器, 而case 語(yǔ)句仿真要比條件賦值語(yǔ)句快。2 所有的Case 應(yīng)該有一個(gè)default case 允許空語(yǔ)句Default : ;5.1.7 Writing functions1. 在function的最后給function賦值Function CompareVectors;/ (Vector1, Vector2,Length)Input 199:0 Vector1, Vector2;Input 31:0 Length;/local variablesInteger i;RegEqua

16、l;Begini= 0;Equal = 1;While (i<Length)&& Equal) beginIf (Vector 2i != 1bx)beginIf (Vector1i!= Vector2i)Equal = 0;Else ;Endi= i+ 1;EndCompareVectors= Equal;EndEndfunction /compareVectors/比較器3. 函數(shù)中避免使用全局變量否則容易引起HDL行為級(jí)仿真和門級(jí)仿真的差異。如function ByteCompareinput 15:0 Vector1input 15:0 Vector2input

17、7:0 Lengthbeginif (ByteSel)/ compare the upper byteelse/ compare the lower byteendendfunction/ ByteCompare中使用了全局變量ByteSel 可能無(wú)意在別處修改了, 導(dǎo)致錯(cuò)誤結(jié)果 。最好直接在端口加以定義。 ( 注意 函數(shù)與任務(wù)的調(diào)用均為靜態(tài)調(diào)用。)5.1.8 Assignment1. Verilog 支持兩種賦值 過(guò)程賦值(procedural) 和連續(xù)賦值(continuous。 過(guò)程賦值用于過(guò)程代碼( initial, always, task or function) 中給reg 和

18、integer 變量timrealtimereal賦值, 而連續(xù)賦值一般給wire 變量賦值。2. Always (敏感表) 敏感表要完整, 如果不完整, 將會(huì)引起仿真和綜合結(jié)果不一致always (d or Clr)if (Clr)q = 1'b0;else if (e)q = d;以上語(yǔ)句在行為級(jí)仿真時(shí)e的變化將不會(huì)使仿真器進(jìn)入該進(jìn)程,導(dǎo)致仿真結(jié)果錯(cuò)誤3. Assign/deassign 僅用于仿真加速 僅對(duì)寄存器有用4. Force/release 僅用于debug 對(duì)寄存器和線網(wǎng)均有用5. 避免使用Disable6.對(duì)任何reg賦值用非阻塞賦值代替阻塞賦值 reg 的非阻塞賦值

19、要加單位延遲 但異步復(fù)位可加可不加 =與 =的區(qū)別Always (posedge Clkor negedge Rst_)BeginIf (!Rst_)/ prioritize the “if conditions”in if statementBeginRega <=0; /non_blockingassignmentRegb <=0;EndElse if (Soft_rst_all)BeginRega <= #u_dly0; /add unit delayRegb <= #u_dly0;EndElse if (Load_init)BeginRega <= #u_

20、dly init_rega;Regb <= #u_dly init_regb;EndElseBeginRega <= #u_dly Rega<< 1;Regb <= #u_dly St_1;EndEnd/ end Rega, Regbassignment.5.1.9 Combinatorial Vs Sequential Logic1. 如果一個(gè)事件持續(xù)幾個(gè)時(shí)鐘周期 ,設(shè)計(jì)時(shí)就用時(shí)序邏輯代替組合邏輯。如 Wire Ct_24_e4; /it ccarriesinfo. Last over several clock cyclesAssign Ct_24_e4= (

21、count8bit7:0>= 8h24) & (count8bit7:0<= 8he4);那么這種設(shè)計(jì)將綜合出兩個(gè)8 比特的加法器 而且會(huì)產(chǎn)生毛刺, 對(duì)于這樣的電路, 要采用時(shí)序設(shè)計(jì), 代碼如下;Reg Ct_24_e4;Always (poseddge Clk or negedge Rst_)BeginIf (!Rst_)Ct_24_e4<= 1b0;Else if (count8bit7:0= = 8he4)Ct_24_e4<= #u_dly1b0;Else if (count8bit7:0= = 8h23)Ct_24_e4<= #u_dly1b1;E

22、sle; 2. 內(nèi)部總線不要懸空 在default狀態(tài) 要把它上拉或下拉Wire OE_default;Assign OE_default= !(oe1| oe2| oe3);Assign bus31:0= oe1? Data131:0:oe2? Data231:0:oe3? Data331:0:oe_default? 32h0000_0000 :32hzzzz_zzzz;5.1.10Macros1. 為了保持代碼的可讀性, 常用 “define” 做常數(shù)聲明2. 把“define”放在一個(gè)獨(dú)立的文件中參數(shù)( parameter) 必須在一個(gè)模塊中定義, 不要傳替參數(shù)到模塊( 仿真測(cè)試向量例外

23、)“define”可以在任何地方定義, 要把所有的“define”定義在一個(gè)文件中. 在編譯原代碼時(shí)首先要把這個(gè)文件讀入, 如果希望宏的作用域僅在一個(gè)模塊中, 就用參數(shù)來(lái)代替。5.1.11Comments1. 對(duì)更新的內(nèi)容更新要做注釋2. 在語(yǔ)法塊的結(jié)尾做標(biāo)記/style 1If (OE_&& (state != PENDING) begin.End / if enable = = tureand ready/style 2 - identical lableson begin and endIf (OE_&& (state != PENDING) begin

24、/drive data.End /drive data/ Comment end<unit>with the name of the <unit>Function Calcparity /Data, ParityErr.Endfunction/ Calcparity3. 每一個(gè)模塊都應(yīng)在模塊開(kāi)始處做模塊級(jí)的注釋, 參考前面標(biāo)準(zhǔn)模塊頭。4. 在模塊端口列表中出現(xiàn)的端口信號(hào) 都應(yīng)做簡(jiǎn)要的功能描述。5.1.12FSM1. VerilogHDL狀態(tài)機(jī)的狀態(tài)分配。VerilogHDL描述狀態(tài)機(jī)時(shí)必須由parameter分配好狀態(tài),這與VHDL不同 VHDL狀態(tài)機(jī)狀態(tài)可以在綜合時(shí)分

25、配產(chǎn)生。2. 組合邏輯和時(shí)序邏輯分開(kāi)用不同的進(jìn)程組合邏輯包括狀態(tài)譯碼和輸出, 時(shí)序邏輯則是狀態(tài)寄存器的切換。3. 必須包括對(duì)所有狀態(tài)都處理, 不能出現(xiàn)無(wú)法處理的狀態(tài), 使?fàn)顟B(tài)機(jī)失控。4. Mealy機(jī)的狀態(tài)和輸入有關(guān),而Moore機(jī)的狀態(tài)轉(zhuǎn)換和輸入無(wú)關(guān)Mealy 狀態(tài)機(jī)的例子如下:.reg CurrentState, NextState, Out1;Parameter S0=0,S1=1;always (posedge Clkor negedge Rst_)/ state vector flip-flops (sequential)if (!Reset)CurrentState= S0;els

26、eCurrentState<= #u_dly NextState;always (In1or In2or CurrentState)/ output and state vector decode (combinational)case (CurrentState)S0: beginNextState<= #u_dly S1;Out1<= #u_dly1'b0;endS1: if (In1)beginNextState<= #u_dly S0;Out1<= #u_dly In2;endelse beginNextState<= #u_dly S1;O

27、ut1<= #u_dly !In2;endendcaseendmodule5.2 代碼編寫中容易出現(xiàn)的問(wèn)題1. 在for-loop中包括不變的表達(dá)式 浪費(fèi)運(yùn)算時(shí)間for (i=0;i<4;i=i+1)beginSig1= Sig2;DataOuti= DataIni;endfor-loop中第一條語(yǔ)句始終不變,浪費(fèi)運(yùn)算時(shí)間.2. 資源共享問(wèn)題條件算子中不存在資源共享 如z = (cond)? (a + b) : (c + d);必須使用兩個(gè)加法器;而等效的條件if-then-else語(yǔ)句則可以資源共享 如:if (Cond)z = a + b;elsez = c + d;只要加法器

28、的輸入端復(fù)用,就可以實(shí)現(xiàn)加法器的共享,使用一個(gè)加法器實(shí)現(xiàn)3. 由于組合邏輯的位置不同而引起過(guò)多的觸發(fā)器綜合 如下面兩個(gè)例子moduleCOUNT (AndBits, Clk, Rst);Output Andbits;Input Clk,Rst;Reg AndBits;/internal regReg 2:0 Count;always (posedge Clk)beginbeginif (Rst)Count <= #u_dly0;elseCount <= #u_dlyCount + 1;End /end ifAndBits <= #u_dly & Count;End/e

29、nd alwaysendmodule在進(jìn)程里的變量都綜合成觸發(fā)器了,有4個(gè);moduleCOUNT (AndBits, Clk, Rst);Output AndBits;Input Clk,Rst;Reg AndBits;/internal regReg 2:0 Count;always (posedge Clk)begin /synchronousif (Rst)Count <= #u_dly0;elseCount <= #u_dly Count + 1;End/end alwaysalways (Count)begin /asynchronousAndBits= & C

30、ount;End/end alwaysEndmodule/end COUNT組合邏輯單開(kāi),只有3個(gè)觸發(fā)器.4. 謹(jǐn)慎使用異步邏輯module COUNT (Z, Enable, Clk, Rst);Output 2:0 Z;Input Rst,Enable,Clk;reg2:0 Z;always (posedge Clk)beginif (Rst)beginZ <= #u_dly1'b0;endelse if (Enable = 1'b1) beginIf (Z = 3'd7) beginZ <= #u_dly1'b0;Endelse beginZ

31、<= #u_dlyZ + 1'b1;endEndElse ;End/end alwaysEndmodule/end COUNT是同步邏輯,而下例則使用了組合邏輯作時(shí)鐘,以及異步復(fù)位.實(shí)際的運(yùn)用中要加以避免.module COUNT (Z, Enable, Clk, Rst);Output 2:0 Z;Input Rst,Enable,Clk;Reg 2:0 Z;/internal wirewire GATED_Clk= Clk& Enable;always (posedge GATED_Clkor posedge Rst)beginif (Rst)beginZ <=

32、 #u_dly1'b0;endelse beginif (Z = 3'd7) beginZ <= #u_dly1'b0;endelse beginZ <= #u_dlyZ + 1'b1;endEnd/end ifEnd/end alwaysEndmodule /end module5. 對(duì)組合邏輯的描述有多種方式 ,其綜合結(jié)果是等效的c = a &b;等效于c3:0 = a3:0 & b3:0;等效于c3 = a3 & b3;c2 = a2 & b2;c1 = a1 & b1;c0 = a0 & b0;

33、等效于for ( i=0; i<=3; i= i+ 1)ci= ai& bi;可以選擇簡(jiǎn)潔的寫法.6. 考慮綜合的執(zhí)行時(shí)間通常會(huì)推薦將模塊劃分得越小越好, 事實(shí)上要從實(shí)際的設(shè)計(jì)目標(biāo) 面積和時(shí)序要求出發(fā) 好的時(shí)序規(guī)劃和合適的約束條件要比電路的大小對(duì)綜合時(shí)間的影響要大, 要依照設(shè)計(jì)的目標(biāo)來(lái)劃分模塊, 對(duì)該模塊綜合約束的scripts也可以集中在該特性上, 要選擇合適的約束條件, 過(guò)分的約束將導(dǎo)致漫長(zhǎng)的綜合時(shí)間 最好在設(shè)計(jì)階段就做好時(shí)序規(guī)劃 通過(guò)綜合的約束scripts來(lái)滿足時(shí)序規(guī)劃 。這樣就能獲得既滿足性能的結(jié)果, 又使得綜合時(shí)間最省, 從代碼設(shè)計(jì)講 5005000行的長(zhǎng)度是合適的。

34、7. 避免點(diǎn)到點(diǎn)的例外所謂點(diǎn)到點(diǎn)例外 Point-to-point exception 就是從一個(gè)寄存器的輸出到另一個(gè)寄存器的輸入的路徑不能在一個(gè)周期內(nèi)完成 多周期路徑就是其典型情況, 多周期路徑比較麻煩 在靜態(tài)時(shí)序分析中要標(biāo)注為例外, 這樣可能會(huì)因?yàn)槿藶橐蛩貙⑵渌窂藉e(cuò)誤地標(biāo)注為例外, 從而對(duì)該路徑?jīng)]有分析 造成隱患 避免使用多周期路徑 。如果確實(shí)要用, 應(yīng)將它放在單獨(dú)一個(gè)模塊, 并且在代碼中加以注釋。8. 避免偽路徑(False path)偽路徑是那些靜態(tài)時(shí)序分析 (STA) 認(rèn)為是時(shí)序失敗, 而設(shè)計(jì)者認(rèn)為是正確的路徑。 通常會(huì)人為忽略這些warning, 但如果數(shù)量較多時(shí), 就可能將其他

35、真正的問(wèn)題錯(cuò)過(guò)了。9. 避免使用Latch使用Latch 必須有所記錄, 可以用All_registers -level_sensitive 來(lái)報(bào)告設(shè)計(jì)中用到的Latch。 不希望使用Latch時(shí), 應(yīng)該對(duì)所有輸入情況都對(duì)輸出賦值, 或者將條件賦值語(yǔ)句寫全, 如在if語(yǔ)句最后加一個(gè)else, case語(yǔ)句加defaults。當(dāng)你必須使用Latch時(shí), 為了提高可測(cè)性, 需要加入測(cè)試邏輯。不完整的if和case語(yǔ)句導(dǎo)致不必要的latch的產(chǎn)生, 下面的語(yǔ)句中, DataOut會(huì)被綜合成鎖存器。 如果不希望在電路中使用鎖存器, 它就是錯(cuò)誤。always (Cond)beginif (Cond)Da

36、taOut<= DataInend10. 避免使用門控時(shí)鐘使用門控時(shí)鐘(Gated clock)不利于移植, 可能引起毛刺, 帶來(lái)時(shí)序問(wèn)題, 同時(shí)對(duì)掃描鏈的形成帶來(lái)問(wèn)題。 門控鐘在低功耗設(shè)計(jì)中要用到, 但通常不要在模塊級(jí)代碼中使用。 可以借助于Power compiler來(lái)生成, 或者在頂層產(chǎn)生。11. 避免使用內(nèi)部產(chǎn)生的時(shí)鐘在設(shè)計(jì)中最好使用同步設(shè)。 如果要使用內(nèi)部時(shí)鐘, 可以考慮使用多個(gè)時(shí)鐘。 因?yàn)槭褂脙?nèi)部時(shí)鐘的電路要加到掃描鏈中比較麻煩 ,降低了可測(cè)性, 也不利于使用約束條件來(lái)綜合。12. 避免使用內(nèi)部復(fù)位信號(hào)模塊中所有的寄存器最好同時(shí)復(fù)。 如果要使用內(nèi)部復(fù)位, 最好將其相關(guān)邏輯放在

37、單獨(dú)的模塊中, 這樣可以提高可閱讀性。13. 如果確實(shí)要使用內(nèi)部時(shí)鐘, 門控時(shí)鐘, 或內(nèi)部的復(fù)位信號(hào) 將它們放在頂層將這些信號(hào)的產(chǎn)生放在頂層的一個(gè)獨(dú)立模塊 這樣所有的子模塊分別使用單一的時(shí)鐘和復(fù)位信號(hào) 一般情況下內(nèi)部門控時(shí)鐘可以用同步置數(shù)替代 例如:module COUNT (Reset Enable Clk Qout) module COUNT (Reset EnableClk Qout)input Reset Enable Clk input Reset Enable Clkoutput 2:0 Qout output 2:0 Qoutreg2:0 Qout reg2:0 Qoutwire

38、 GATED_Clk= Clk& Enable always (posedge Clk)begin if (Reset) begin always (posedge GATED_Clkor posedgeReset) Qout= 1'b0begin end if (Reset) begin else if (Enable = 1'b1) begin Qout= 1'b0 if (Qout= 3'd7) begin end Qout= 1'b0else begin end if (Qout= 3'd7) begin else begin Q

39、out=1'b0 Qout= Qout+ 1'b1end endelse begin end Qout= Qout+ 1'b1 end end endmoduleend endendmodule6 附錄6.1 Module 編寫示例/* *Filename Author Description Called by Revision History mm/dd/yyRevision 1.0Email MCompany HuaweiTechnology .IncCopyright(c)1999, HuaweiTechnology Inc,All right reserved

40、* */Module module_name(Output_ports,/comment ; port descriptionInput_ports,/comment ; port descriptionIo_ports,/comment ; port descripttionClk_port,/comment ; port descriptionRst_port/comment ; port description);/port declarationsOutput 31:;0 Dataout;Input 31:0 Datain;Inout Bi_dir_signal;Input input1,Input2;/interrnal wire/regdeclarationsWire 31

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論