2015-10-19 4 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, я получил следующие ошибки:

(видеоблог-2730) Неопределенная переменная 'w1'.
(vlog-2388) 'in1', уже объявленный в этой области (имя_модуля)
(vlog-2730) Неопределенная переменная: 'w2'.
...
Идентификатор должен быть объявлен с режимом порта: in1
Идентификатор должен быть объявлен с режимом порта: 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, ваш образец заголовок не является жалоба. Все, что поддерживает этот синтаксис, будет вне стандарта.

Законно определять parameter и localparam s после заголовка с заголовками ANSI, если заголовок не ссылается на них. Пример в IEEE Std 1800-2012 § 23.10 Параметры модуля переопределения

+0

Похоже, что я искал неправильное место в документе (§ 6.20). Благодарю. – Qiu

Смежные вопросы