Verilog 编写规范
? ? 在學(xué)習(xí)Python時(shí),作者有一句話對我影響很大。作者希望我們在學(xué)習(xí)編寫程序的時(shí)候注意一些業(yè)內(nèi)約定的規(guī)范。在內(nèi)行人眼中,你的編寫格式,就已經(jīng)暴露了你的程度。學(xué)習(xí)verilog也是一樣的道理,一段好的verilog代碼,在完成設(shè)計(jì)要求的前提下,還需要條理清晰,有對應(yīng)的注解,對非作者而言應(yīng)該是友好的。因?yàn)閷?shù)字IC設(shè)計(jì)也處于初級(jí)階段,前期所寫的基本是在搜集資料的基礎(chǔ)上,添加一部分個(gè)人的理解,希望通過自己的不斷學(xué)習(xí),沉淀出自己獨(dú)到的見解。
? ? 對于Verilog編寫規(guī)范,網(wǎng)上的資料比較散,其中較好的我覺得是2001版華為的編寫規(guī)范。下面簡稱規(guī)范(https://wenku.baidu.com/view/bbad6339fe00bed5b9f3f90f76c66137ee064fc8.html)百度文庫
? ? 我將在次規(guī)范的基礎(chǔ)上加入一些補(bǔ)充:
1.低電平有效信號(hào),信號(hào)后加‘_n’。
2.模塊名小寫。
3.module例化名用U_xx_x表示(多次例化用次序號(hào)0.1.2...)。
4.使用降序排列定義向量有效位順序,最低位為0。
5.采用小寫字母定義reg,wire和input/output/inout。
6.采用大寫字母定義參數(shù),參數(shù)名小于20個(gè)字母。
7.時(shí)鐘信號(hào)應(yīng)前綴‘clk’,復(fù)位信號(hào)應(yīng)前綴‘rst’。
8.三態(tài)輸出寄存器信號(hào)應(yīng)后綴‘_z’。
9.代碼中不能使用VHDL保留字,更不能使用Verilog保留字。 ps:具體有哪些保留字可以百度搜索,這里不列舉。
10.輸出信號(hào)必須被寄存(只對頂層模塊)。ps:在查閱的各種資料中,都有提及這一點(diǎn)。
11.三態(tài)邏輯可以在頂層模塊中使用,子模塊中避免使用三態(tài)。
12.沒有未連接的端口。
13.到其他模塊的接口信號(hào),按如下順序定義端口信號(hào):輸入,(雙向),輸出。
14.建議使用coregen生成乘法電路。
15.采用基于名字的調(diào)用,而非基于順序的調(diào)用。
16.不要書寫空的模塊,即用一個(gè)模塊至少要有一個(gè)輸入和一個(gè)輸出。
17.時(shí)鐘事件的表達(dá)要用‘negedge<clk_name>’ 或 'posedge<clk_name>'的形式。
18.異步復(fù)位,高電平用‘if(<rst_name> == 1'b1)’,低電平有效用‘if(<rst_name> == 1'b0)’。 ps:if 內(nèi)的判斷條件位寬為1。
19.if語句不能嵌套太多。
20.建議不使用include語句。
21.建議每個(gè)模塊加timescale。
22.代碼中給出必要的注釋。
23.每個(gè)文件有一個(gè)文件頭。ps:我的理解是每個(gè)文件最開頭應(yīng)用注釋好,所寫模塊的名字、功能、版本、時(shí)間等。
24.每個(gè)文件只包含一個(gè)模塊。
25.模塊名與文件名保持一致。
26.同步時(shí)序邏輯的always block中有且只有一個(gè)時(shí)鐘信號(hào),并且在同一個(gè)沿動(dòng)作(如上升沿)。
27.同步時(shí)序邏輯的module中,在時(shí)鐘信號(hào)的同一個(gè)沿動(dòng)作。
28.采用同步設(shè)計(jì),避免使用異步邏輯(全局信號(hào)復(fù)位除外)。
29.一般不要將時(shí)鐘信號(hào)作為數(shù)據(jù)的信號(hào)輸入。
30.不要在時(shí)鐘路徑上添加任何的buffer。
31.不要門控時(shí)鐘。ps:
32.在頂層模塊中,時(shí)鐘信號(hào)必須可見。
33.不要采用向量的方式定義一組時(shí)鐘信號(hào)。
34.不要在模塊內(nèi)部生成時(shí)鐘信號(hào),使用DLL/PLL產(chǎn)生的時(shí)鐘信號(hào)。
35.建議使用單一的全局同步復(fù)位電路或者單一的全部異步復(fù)位電路。
36.不要在復(fù)位路徑上添加任何的buffer,也不要使用任何門控復(fù)位信號(hào)。ps:復(fù)位路徑上添加buffer,會(huì)使得復(fù)位信號(hào)到觸發(fā)器復(fù)位接收端口產(chǎn)生延遲,skew的產(chǎn)生,可能無法滿足復(fù)位恢復(fù)時(shí)間,從而導(dǎo)致亞穩(wěn)態(tài)的產(chǎn)生。 門控會(huì)使得復(fù)位信號(hào)產(chǎn)生毛刺,增加亞穩(wěn)態(tài)發(fā)生的可能性。
37.不使用PLI函數(shù)。
38.不使用事件變量。
39.不使用系統(tǒng)函數(shù)。
40.建議不使用任務(wù)。
41.不使用用戶自定義單元(UDP)。
42.不使用===,!==等不可綜合運(yùn)算符。
ps: 補(bǔ)充Verilog不可綜合語句。
initial(只在testbench中使用)、events(在同步testbench時(shí)更有用)、real time、assign和deassign(reg型無法綜合,但是wire型可以)、fork join、primitives(只支持門級(jí)原語綜合)、table、敏感列表中同時(shí)帶有posedge和negedge(如always@(posedge clk or negedge clk)begin end 這個(gè)無法綜合)、同一個(gè)reg被多個(gè)always塊驅(qū)動(dòng)、延時(shí) #time ,比如a = #5 b ,此處仿真時(shí)候是可以的,但是在綜合時(shí)會(huì)自動(dòng)忽略掉#time,相當(dāng)于a = b、X或Z(未知態(tài)和高阻態(tài)),在條件表達(dá)式中不要使用它們,確保可以綜合。
43.不使用disable語句。
44.建議不使用forever,repeat,while循環(huán)語句。
45.避免產(chǎn)生latch(除CPU接口)。 ps:在if語句或者case語句中的所有條件分支中都有對變量有明確的賦值,不然會(huì)綜合出latch。
46.組合邏輯語句塊敏感列表中敏感變量必須和該模塊中使用的相一致,不能多也不能少。
47.在一個(gè)always語句中,有且僅有一個(gè)事件列表。
48.在時(shí)序always塊的敏感事件列表中,必須都是沿觸發(fā)事件,不允許出現(xiàn)電平觸發(fā)事件。
49.數(shù)據(jù)位寬要相匹配。
50.不使用real,time,realtime類型。
51.建議不使用integer類型。
52.位移變量必須是一個(gè)常數(shù)。
53.避免使用異步反饋電路。
54.時(shí)序邏輯語句塊中統(tǒng)一使用非阻塞型賦值。
55.組合邏輯語句塊使用阻塞型賦值。 ps:對于54 55需要了解一下阻塞和非阻塞的區(qū)別。 非阻塞賦值語句,右端表達(dá)式計(jì)算完并不會(huì)立刻傳遞給左端,而是等待下一個(gè)事件觸發(fā)前一刻再傳遞給左端,且它們是并行的。就是說,在所有的右端表達(dá)式在時(shí)鐘有效沿到來之時(shí)開始計(jì)算,等到下一個(gè)時(shí)鐘有效沿到來之前一刻,將值同時(shí)賦值給了左端。可以想象出它對時(shí)鐘沿觸發(fā)描述的恰到好處,所以用在時(shí)序邏輯中。 阻塞賦值語句,在每個(gè)右端表達(dá)式計(jì)算完之后,立刻傳遞給左端,并且后面的式子只能在前面完成后,方可運(yùn)行。所以說是一個(gè)串行過程,而組合邏輯恰恰需要這樣的一個(gè)表達(dá)方式。
56.非阻塞賦值語句不加單位延時(shí),尤其是對于寄存器類型的變量賦值時(shí)。
57.整型常量基數(shù)格式中不能有‘?’。
58.字符串中不能包含有控制字符(如CTRL鏈)。
59.禁止使用空的時(shí)序電路塊以及非法的always結(jié)構(gòu)。
60.不要在連續(xù)賦值語句中引入驅(qū)動(dòng)強(qiáng)度和延時(shí)。
61.不要為net,n_input,n_output,enable_gate型變量定義驅(qū)動(dòng)強(qiáng)度,電荷保持強(qiáng)度以及延時(shí)。
62.禁止使用trireg(具有電荷保持特性的連接)NET型定義。
63.禁止使用tri0,tri1,triand和trior型連接。
64.在RTL級(jí)代碼中不能包含有initial結(jié)構(gòu),也不能對任何信號(hào)進(jìn)行初始化賦值,應(yīng)該采用復(fù)位的方式進(jìn)行初始化。
65.不要在過程語句中使用assign,deassign,force,release等語句。
66.不要使用wait語句。
67.不要使用fork join語句塊。
68.不要為驅(qū)動(dòng)類型為supply0和supply1型的連線(net)賦值。
69.設(shè)計(jì)中不使用macro_module。
70不要在RTL代碼中實(shí)例門級(jí)單元,尤其是下列單元:CMOS開關(guān),RCMOS開關(guān),NMOS開關(guān),PMOS開關(guān),RNOMS開關(guān),RPMOS開關(guān),trans雙向開關(guān),rtrans雙向開關(guān),tranif0,tranif1,rtranif0,rtranif1,pull_gate。
71.不要使用specify模塊。
? ? 這些規(guī)則中有一些我還沒有弄清楚,等到更多的實(shí)際應(yīng)用中出現(xiàn)的時(shí)候,應(yīng)該會(huì)有一種恍然大悟的感覺,實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。
轉(zhuǎn)載于:https://www.cnblogs.com/Jamesjiang/p/8933694.html
總結(jié)
以上是生活随笔為你收集整理的Verilog 编写规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python抓取头条文章
- 下一篇: 51Nod 1007 正整数分组(01背