2016-08-24 119 views
4

我對FPGA相對較新,我正在尋找關於Verilog中聲明模塊的現代最佳實踐的一些指導。verilog模塊聲明的首選語法

我看到了兩種在Verilog中聲明模塊的方法。首先讓我想起Traditional C,如examples on wikipedia

module toplevel(clock,reset); 
    input clock; 
    input reset; 

    /* snip */ 
endmodule 

儘管替代語法具有輸入/輸出符作爲參數列表,而不是太不相似的VHDL的一部分,如this example

module fadder(
    input a,   //data in a 
    input b,   //data in b 
    input cin,  //carry in 
    output sum_out, //sum output 
    output c_out  //carry output 
); 

/* snip */ 
endmodule 

對於新編寫的verilog代碼,哪種語法是首選的?在這種情況下,「首選」是指用標準或相關材料寫的東西(明確書寫或通過標準中給出的示例隱式寫入)或寫入廣受好評的樣式指南。問題不在於要求個人偏好!

回答

6

第二個語法形式被縮進以替換第一個語法形式。如果您查看1364-2001 Verlog LRM以及當前的1800-2012 SystemVerilog LRM,您會注意到模塊聲明的所有示例均使用第二種形式。第一種形式僅用於遺產,但不幸的是,教科書和課程材料的轉換時間長於預期。

這種新的(或ANSI風格)語法的關鍵好處是你只需要在一個地方聲明你的端口名稱。使用較舊的語法,您必須聲明端口名稱三次;一次用於位置排序,另一次用於端口方向,並且如果端口需要不是有線的,則第三次聲明其數據類型。

+2

由於解釋理由,接受這一點。感謝這兩個答案。 – Damien

6

第二個是優選的。這是在Verilog 2001中引入的。這通常被稱爲「ANSI風格」。

當我教Verilog時,我教導了兩者,但對所有新代碼都推薦使用ANSI風格。 (並提及我只教第一種風格,以便學生能夠理解遺留代碼。)

如果你進入System-Verilog,你會發現有些東西只能用ANSI風格工作。

+0

的SystemVerilog不支持非ANSI;參見[IEEE標準1800 -2012](http://standards.ieee.org/getieee/1800/download/1800-2012.pdf)§23.2.2.1。ANSI是首選格式 – Greg

+2

@Greg,馬修傳達的是,有一些新的SystemVerilog僅適用於ANSI風格的端口,例如,您不能使用非ANSI風格的端口定義通用的'interface'端口 - 因爲LRM僅使用ANSI風格的端口爲該功能創建了合成器。 –

+0

@ dave_59,I當我第一次閱讀時,想念我讀了最後一行,我也忽略了非ANSI的細節不支持像通用接口這樣的功能。 – Greg

0

第二種模式是首選,但有些情況下您可能需要使用第一種模式。這是如果你有很多複雜的計算需要完成參數才能達到正確的端口寬度。下面只是一個小例子。是的,您可以用它們的表達式替換localparam,但這可能會使您的代碼無法讀取。
我認爲這是(系統)的Verilog遺漏,你不能以#(參數..定義後使用local_param之一

module example 
#(parameter  
    L2DEPTH = 8, 
    OFFSET = 2 
) 
(siga,sigb,sigc,sig_out); 
localparam DEPTH = 1<<L2DEPTH; 
localparan TOP = DEPTH+OFFSET; 
localparam BOT = DEPTH-OFFSET; 
localparam DBLDEPTH = 2<<L2DEPTH;; 
input [ L2DEPT-1:0] siga; 
input [  TOP-1:0] sigb; 
input [  BOT-1:0] sigc; 
output [DBLDEPTH-1:0] sig_out;