日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Verilog 编写规范

發(fā)布時(shí)間:2025/5/22 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Verilog 编写规范 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 在學(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。