2015-10-19 79 views
2

參數最近,我遇到了以下問題:在軟件的Quartus我定義我的Verilog模塊如下:問題與的ModelSim

module module_name(
    input  [w1-1:0] in1, 
    input  [w2-1:0] in2, 
    output [w1-1:0] out1 
); 

    parameter w1 = 16; 
    parameter w2 = 8; 

    ... 

endmodule 

此模塊沒有任何問題的編譯。但是,當我試圖在Modelsim(-Altera)10.3d中模擬該代碼時,出現以下錯誤:

(vlog-2730)未定義變量:'w1'。
(視頻博客-2388) 'IN1' 在此範圍內(MODULE_NAME)已經聲明
(視頻博客-2730)不確定變量: 'W2'。
...
標識必須用端口模式聲明:第1
標識必須用端口模式聲明:IN2

我發現了繞過這個問題與下面的代碼的方式:

module module_name(
    in1, 
    in2, 
    out1 
); 

    parameter w1 = 16; 
    parameter w2 = 8; 

    input  [w1-1:0] in1; 
    input  [w2-1:0] in2; 
    output [w1-1:0] out1; 

    ... 

endmodule 

另一種方式也是使用下面的結構:

module module_name #(parameter w1 = 16, parameter w2 = 8)(
    input  [w1-1:0] in1, 
    input  [w2-1:0] in2, 
    output [w1-1:0] out1 
); 

... 

endmodule 

但是:在使用此參數的輸入/輸出信號之後定義參數是否是非法的(Quartus建議不)?

回答

3

IEEE Std 1800-2012 § 23.2.1 模塊頭定義狀態的兩個報頭類型:

有兩種樣式的模塊標題定義, -ansi 和ANSI

-ansi 風格分離從模塊端口和內部數據的聲明的模塊頭的定義。非ANSI風格模塊頭的非正式語法如下:

module_name (port_list) ; 
    parameter_declaration_list 
    port_direction_and_size_declarations 
    port_type_declarations 

模塊頭定義語法由端口列表的閉括號之後的分號結束。定義端口特性(方向,大小,數據類型,簽名等)的聲明是模塊內的本地定義。

ANSI 標頭樣式使模塊標頭的端口特性部分的聲明(仍以分號結尾)。一個ANSI風格模塊頭的非正式的一般語法如下:

module_name #(parameter_port_list) 
      (port_direction_and_type_list) ; 

沒有頭語法匹配提的是:

module_name (port_direction_and_type_list) ; 
    parameter_declaration_list 

基礎上LRM,您的樣品頭不投訴。任何支持該語法的東西都將來自標準之外。

只要標題沒有引用它們,在帶有ANSI樣式標頭的標頭之後定義parameter s和localparam s是合法的。 IEEE Std 1800-2012 § 23.10 示例覆蓋模塊參數

+0

看起來我正在尋找文檔中的錯誤位置(第6.20節)。謝謝。 – Qiu