1、命名規則
① 首先每個文件只包含一個module,而且module名要小寫,并且與文件名保持一致;
② 除parameter外,信號名全部小寫,名字中的兩個詞之間用下劃線連接,如receive_clk_b;
③ 由parameter定義的常量要求全部字母大寫,自己定義的參數、類型用大寫標識,推薦使用parameter來定義有實際意義的常數,包括單位延時、版本號、板類型、單板在位信息、LED亮燈狀態、電源狀態、電扇狀態等;
④ 信號名長度不超過20字符,并且避免使用Verilog和VHDL保留字命令,建議給信號名添加有意義的前綴或后綴,命名符合常用命名規范(如_clk 或clk_表示時鐘, n表示低電平有效, z表示三態信號, en表示使能控制,rst 表示復位);
⑤ 保持縮寫意義在模塊中的一致性,同一信號在不同層次應該保持一致性。
2、注釋規則
① 每個文件有一個文件頭,文件頭中注明文件名、功能描述、引用模塊、設計者、設計時間、版權信息以及修改信息等;
② 對信號、參量、引腳、模塊、函數及進程等加以說明,便于閱讀與維護,如信號的作用、頻率、占空比、高低電平寬度等。用“//”做小于1行的注釋,用“/* */”做多于1行的注釋。更新的內容要做注釋,記錄修改原因,修改日期和修改人。
3、模塊規則
① module例化名用u_xx_x標示;
② 建議給每個模塊要加timescale;
③ 不要書寫空的模塊,即:一個模塊至少要有一個輸入和一個輸出;
④ 為了保持代碼的清晰、美觀和層次感,一條語句應占用一行,每行限制在80個字符以內,如果較長(超出80個字符)則換行;
⑤ 采用基于名字(name_based)的調用而不是基于順序的(order_based)的調用;
⑥ 模塊的接口信號按輸入、雙向、輸出順序定義;
⑦ 使用降序定義向量有效位順序,最低位為0;
⑧ 管腳和信號說明部分:一個管腳和一組總線占用一行,說明要清晰;
⑨ 不要采用向量的方式定義一組時鐘信號;
⑩ 邏輯內部不對input進行驅動,在module內不存在沒有驅動源的信號,更不能在模塊端口存在沒有驅動的輸出信號,避免在elabarate和compile時產生warning;
? 在頂層模塊中,除了內部的互連和module的例化外,避免在做其他邏輯;
? 出于層次設計和同步設計的考慮,子模塊輸出信號建議用寄存器;
? 內部模塊端口避免inout,最好在最頂層模塊處理雙向總線;
? 子模塊中禁止使用三態邏輯,可以在頂層模塊使用;
? 如果能確保該信號不會被其它子模塊使用,而是直接通過頂層模塊輸出I/O口,可以在子模塊中使用三態;
? 禁止出現未連接的端口;
? 為邏輯升級保留的無用端口和信號要注釋;對于層次化設計的邏輯,在升級中采用增量編譯;建議采用層次化設計,模塊之間相對獨立。
4、線網和寄存規則
① 鎖存器和觸發器不允許在不同的always塊中賦值,造成多重驅動;
② 出于功能仿真考慮,非阻塞賦值應該增加單位延時,對于寄存器類型的變量賦值時,尤其要注意這一點;阻塞賦值不允許使用單位延時;
③ always語句實現時序邏輯采用非阻塞賦值;always語句實現的組合邏輯和assign語句塊中使用阻塞賦值;
④ 同一信號賦值不能同時使用阻塞和非阻塞兩種方式;
⑤ 不允許出現定義了parameter、wire、reg卻沒有使用的情況;
⑥ 不建議使用integer類型寄存器;
⑦ 寄存器類型的信號要初始化;
⑧ 除移位寄存器外,每個always語句只對一個變量賦值,盡量避免在一個always語句出現多個變量進行運算或賦值。
5、表達式規則
① 在表達式內使用括號表示運算的優先級,一行中不能出現多個表達式;
② 不要給信號賦“x”態,以免x值傳遞;
③ 設計中使用到的0,1,z等常數采用基數表示法書寫(即表示為1'b0,1'b1,1'bz或十六進制);
④ 端口申明、比較、賦值等操作時,數據位寬要匹配。
6、條件語句規則
① if 都有else和它對應,變量在if-else或case語句中所有變量在所有分支中都賦值;
② 如果用到case語句,記得default項;
③ 禁止使用casex,case語句item必須使用常數;
④ 不允許使用常數作為if語句的條件表達式;
⑤ 條件表達式必須是1bit value;
⑥ 如異步復位:
高電平有效使用“if(asynch_reset==1'b1)”,
低電平“if(asynch_reset==1'b0)”,
不要寫成:
“if(!asynch_reset)”或者“if(asynch_reset==0)”;
⑦ 不推薦嵌套使用5級以上if…else if…結構。
7、可綜合部分規則
① 不要使用include語句;
② 不要使用disable、initial等綜合工具不支持的電路,而應采用復位方式進行初時化,但在testbench電路中可以使用;
③ 不使用specify模塊,不使用===、!==等不可綜合的操作符;
④ 除仿真外,不使用fork-join語句;
⑤ 除仿真外,不使用while語句;
⑥ 除仿真外,不使用repeat語句;
⑦ 除仿真外,不使用forever語句;
⑧ 除仿真外,不使用系統任務($);
⑨ 除仿真外,不使用deassign語句;
⑩ 除仿真外,不使用force,release語句;
? 除仿真外,不使用named events語句;不在連續賦值語句中引入驅動強度和延時;
? 禁止使用trireg型線網;
? 制止使用tri1、tri0、triand和trior型的連接;
? 不要位驅動supply0和supply1型的線網賦值;
? 設計中不使用macro_module;
? 不要在RTL代碼中實例門級單元尤,其下列單元:(CMOS/RCOMS/NMOS/PMOS/RNMOS/RPMOS/trans/rtrans/tranif0/tranif1/rtranif0/tranif1/pull_gate)。
8、可重用的部分規則
① 考慮未使用的輸入信號power_down,避免傳入不穩定態;
② 接口信號盡量少,接口時序盡量簡單;
③ 將狀態機(FSM)電路與其它電路分開,便于綜合和后端約束;
④ 將異步電路和同步電路區分開,便于綜合和后端約束,將相關的邏輯放在一個模塊內;
⑤ 合理劃分設計的功能模塊,保證模塊功能的獨立性;
⑥ 合理劃分模塊的大小,避免模塊過大;
⑦ 在設計的頂層(top)模塊,將I/O口、Boundary scan電路、以及設計邏輯(corelogic)區分開。
9、同步設計規則
① 同一個module中,要在時鐘信號的同一個沿動作;
② 如果必須使用時鐘上升沿和時鐘下降沿,則要分兩個module設計;
③ 在頂層模塊中,時鐘信號必須可見,不在模塊內部生成時鐘信號,而要使用DCM/PLL產生的時鐘信號;
④ 避免使用門控時鐘和門控復位;
⑤ 同步復位電路,建議在同一時鐘域使用單一的全局同步復位電路;
異步復位電路,建議使用單一的全局異步復位電路;
⑥ 不在時鐘路徑上添加任何buffer;
⑦ 不在復位路徑上添加任何buffer;
⑧ 避免使用latch;
⑨ 寄存器的異步復位和異步置位信號不能同時有效;
⑩ 避免使用組合反饋電路;
?always有且僅有一個的敏感事件列表,敏感事件列表要完整,否則可能會造成前后仿真的結果不一致;
? 異步復位情況下需要異步復位信號和時鐘沿做敏感量,同步復位情況下只需要時鐘沿做敏感量;
? 時鐘事件的表達式要用:
“negedge
或
“posedge
? 復雜電路將組合邏輯和時序邏輯電路分成獨立的always描述。
10、循環語句規則
① 在設計中不推薦使用循環語句;
② 在非常有必要使用的循環語句時,可以使用for語句。
11、約束規則
① 對所有時鐘頻率和占空比都進行約束;
② 對全局時鐘skew進行約束;
③ 對于時序要求的路徑需要針對特殊要求進行約束,如鎖相環鑒相信號;
④ 要根據輸出管腳驅動要求進行約束,包括驅動電流和信號邊沿特性;
⑤ 要根據輸入和輸出信號的特性進行管腳上下拉約束;
⑥ 針對關鍵I/O是否約束了輸入信號和輸入時鐘的相位關系,控制輸入信號在CLK信號之后或之前多少ns到達輸入pad;
⑦ 綜合設置時,fanout建議設置為3030;
⑧ 要使用輸入輸出模塊中的寄存器,如Xinlinx公司的IOB,map properties選項pack I/O register/latches into IOBsactor需要設置成為“for input and output”,這樣可以控制管腳到內部觸發器的延時時間;
⑨ 布局布線報告中IOB、LUTs、RAM等資源利用率應小于百分之八十;
⑩ 對于邏輯芯片對外輸入接口,進行tsu/th約束;對于邏輯芯片對外輸出接口,進行約束。
12、PLL/DCM規則
① 如果使用FPGA內部DCM和PLL時,應該保證輸入時鐘的抖動小于300ps,防止DCM/PLL失鎖;如果輸入時鐘瞬斷后必須復位PLL/DCM。
② 對于所有廠家的FPGA,其片內鎖相環只能使用同頻率的時鐘信號進行鎖相,如果特殊情況下需要使用不同頻率的信號進行鎖相,需要得到廠家的認可,以避免出時鐘。
13、代碼編輯規則
① 由于不同編輯器處理不同,對齊代碼使用空格,而不是tab鍵。
編輯:hfy
-
Verilog
+關注
關注
28文章
1351瀏覽量
110189 -
鎖存器
+關注
關注
8文章
906瀏覽量
41563 -
觸發器
+關注
關注
14文章
2000瀏覽量
61256 -
編輯器
+關注
關注
1文章
806瀏覽量
31228
發布評論請先 登錄
相關推薦
評論