【華為】verilog語言編寫規(guī)范(一)
掃描二維碼
隨時隨地手機看文章
1 目的
本規(guī)范的目的是提高書寫代碼的可讀性 可修改性 可重用性 優(yōu)化代碼綜合和仿真的結(jié) 果 指導(dǎo)設(shè)計工程師使用VerilogHDL規(guī)范代碼和優(yōu)化電路 規(guī)范化公司的ASIC設(shè)計輸入從而做到- 邏輯功能正確
- 可快速仿真
- 綜合結(jié)果最優(yōu)( 如果是hardware model)
- 可讀性較好
2 范圍
本規(guī)范涉及Verilog HDL編碼風(fēng)格 編碼中應(yīng)注意的問題 Testbench的編碼等本規(guī)范適用于Verilog model的任何一級 RTL ehavioral, gate_level) 也適用于出于仿真綜合或二者結(jié)合的目的而設(shè)計的模塊.3 定義
- Verilog HDL :Verilog 硬件描述語言
- FSM :有限狀態(tài)機
- 偽路徑:靜態(tài)時序分析 STA 認為是時序失敗 而設(shè)計者認為是正確的路徑。
4 引用標(biāo)準(zhǔn)和參考資料
下列標(biāo)準(zhǔn)包含的條文 通過在本標(biāo)準(zhǔn)中引用而構(gòu)成本標(biāo)準(zhǔn)的條文 在標(biāo)準(zhǔn)出版時 所示版本均為有效 所有標(biāo)準(zhǔn)都會被修訂 使用本標(biāo)準(zhǔn)的各方應(yīng)探討 使用下列標(biāo)準(zhǔn)最新版本的可能性。5規(guī)范內(nèi)容
5.1 Verilog 編碼風(fēng)格
本章節(jié)中提到的Verilog編碼規(guī)則和建議適應(yīng)于 Verilog model的任何一級 RTL behavioral,gate_level) 也適用于出于仿真 綜合或二者結(jié)合的目的而設(shè)計的模塊5.1.1
選擇有意義的信號和變量名 對設(shè)計是十分重要的 命名包含信號或變量諸如出處 有效狀態(tài)等基本含義 下面給出一些命名的規(guī)則- 用有意義而有效的名字 有效的命名有時并不是要求將功能描述出來 如:
For 語句中的循環(huán)指針I(yè) 就沒必要用loop_index作為指針名
For( I = 0; I < 1024; I = I + 1)
Mem[I] <= #1 32’b0;
-
用連貫的縮寫
長的名字對書寫和記憶會帶來不便 甚至帶來錯誤 采用縮寫時應(yīng)注意同一信號在模塊中的一致性 縮寫的例子如下Addr :addressPntr :pointerClk :clockRst :reset
-
用最右邊的字符下劃線表示低電平有效 高電平有效的信號不得以下劃線表示 短暫 的引擎信號建議采用高有效
如 Rst_ Trdy, Irdy Idsel.
-
大小寫原則
名字一般首字符大寫 其余小寫 但parameter, integer 定義的數(shù)值名可全部用大寫兩個詞之間要用下劃線連接。如 Packetaddr, Datain, Memwr Memce_
-
全局信號名字中應(yīng)包含信號來源的一些信息
如 D_addr[7:2] 這里的 D 指明了地址是解碼模塊(Decoder module)中的地址
-
同一信號在不同層次應(yīng)保持一致性
-
自己定義的常數(shù) 類型等用大寫標(biāo)識
如 parameter CYCLE=100
-
避免使用保留字
如 in out x z等不能夠做為變量 端口或模塊名
-
添加有意義的后綴 使信號名更加明確 常用的后綴如下:
5.1.2 Modules
-
頂層模塊應(yīng)只是內(nèi)部模塊間的互連
Verilog設(shè)計一般都是層次型的設(shè)計 也就是在設(shè)計中會出現(xiàn)一個或多個模塊 模塊間的調(diào)用在所難免 可把設(shè)計比喻成樹 被調(diào)用的模塊就是樹葉 沒被調(diào)用的模塊就是樹根 那么在這個樹根模塊中 除了內(nèi)部的互連和模塊的調(diào)用外 盡量避免再做邏輯 如不能再出現(xiàn)對reg變量賦值等 這樣做的目的是為了更有效的綜合 因為在頂層模塊中出現(xiàn)中間邏輯 Synopsys 的design compiler 就不能把子模塊中的邏輯綜合到最優(yōu)。
-
每一個模塊應(yīng)在開始處注明文件名 功能描述 引用模塊 設(shè)計者 設(shè)計時間及版權(quán)信息等,如:
Filename﹕ RX_MUX.v
Author﹕
Description﹕
Calledby﹕Topmodule
RevisionHistory﹕99-08-01
Revision1.0
Email﹕ M@sz.huawei.com.cn
Company﹕ HuaweiTechnology.Inc
Copyright(c) 1999, HuaweiTechnologyInc, All right reserved
-
不要對Inpu t進行驅(qū)動, 在module 內(nèi)不要存在沒有驅(qū)動的信號 更不能在模塊端口中出現(xiàn)沒有驅(qū)動的輸出信號,避免在仿真或綜合時產(chǎn)生warning 干擾錯誤定位。
-
每行應(yīng)限制在80個字符以內(nèi) 以保持代碼的清晰 美觀和層次感 一條語句占用一行 如果較長 超出80個字符 則要換行
-
電路中調(diào)用的 module名 用 Uxx 標(biāo) 示 向量大小表 示要清晰 采用基于名字(namebased )的調(diào)用而非基于順序的(orderbased),如:
InstanceUInstance2(
.DataOut(DOUT ),
.DataIn(DIN ),
.Cs_(Cs_)
);
-
用一個時鐘的上沿或下沿采樣信號, 不能一會兒用上沿 ,一會兒用下沿 ,如果既要用上沿又要用下沿 ,則應(yīng)分成兩個模塊設(shè)計。建議在頂層模塊中對Clock做一非門,在層次模塊中如果要用時鐘下沿就可以用非門產(chǎn)生的Posedge Clk_, 這樣的好處是在整個設(shè)計中采用同一種時鐘沿觸發(fā), 有利于綜合。基于時鐘的綜合策略
-
在模塊中增加注釋
對信號 參量 引腳 模塊 函數(shù)及進程等加以說明 便于閱讀與維護
-
Module 名要用大寫標(biāo)示 且應(yīng)與文件名保持一致, 如
Module DFF_ASYNC_RST(
Reset,
Clk,
Data,
Qout
);
-
嚴(yán)格芯片級模塊的劃分
只有頂層包括IO引腳(pads) 中間層是時鐘產(chǎn)生模塊 JTAG 芯片的內(nèi)核(CORE)這樣便于對每個模塊加以約束仿真 對時鐘也可以仔細仿真
-
模塊輸出寄存器化
對所有模塊的輸出加以寄存 如圖1 使得輸出的驅(qū)動強度和輸入的延遲可以預(yù)測 從而使得模塊的綜合過程更簡單
-
輸出驅(qū)動的強度都等于平均的觸發(fā)器驅(qū)動強度
-
將關(guān)鍵路徑邏輯和非關(guān)鍵路徑邏輯放在不同模塊
- 將相關(guān)的組合邏輯放在同一模塊 有助于DC對其進行優(yōu)化 因為DC通常不能越過模塊的邊界來優(yōu)化邏輯。





