Передача имени модуля в качестве параметра

Я хочу создать эту общую оболочку для набора модулей, которые я пишу. Оболочка должна обеспечивать возможность подключения этих модулей к различным типам NoC без необходимости изменять поведение внутренних модулей.

Я думал, что один из способов сделать это будет следующим. Учитывая очень простой модуль для переноса:

module add #(                                                                                                                       
             parameter COLUMN_WIDTH     = 32                                                                                        
             )

   (
    //data in                                                                                                                       
    input logic [COLUMN_WIDTH-1:0]  col_1,
    input logic [COLUMN_WIDTH-1:0]  col_2,
    //data out                                                                                                                      
    output logic [COLUMN_WIDTH-1:0] col_o

    );

   assign col_o = col_1 + col_2;

endmodule

Обертка должна быть следующей:

module wrapper #(                                                                                                                   
                 parameter COLUMN_WIDTH     = 32,                                                                                   
                 parameter WRAPPED_MODULE   = add                                                                                   
             )
   (
    //data in                                                                                                                       
    input logic [COLUMN_WIDTH-1:0]  col_1,
    input logic [COLUMN_WIDTH-1:0]  col_2,
    //data out                                                                                                                      
    output logic [COLUMN_WIDTH-1:0] col_o,
    /* std signals */
    input logic                     clk,
    input logic                     reset_i // reset everything                                                                     
    );

   logic [COLUMN_WIDTH-1:0]         max_result;

   WRAPPED_MODULE #(.COLUMN_WDITH(COLUMN_WIDTH),
                    ) a(
                        .*
                        );

   always @(posedge clk) begin
      if (reset_i)
        max_result <= 0;
      else
        max_result <= (col_o > max_result) ? col_o : max_result;
   end

endmodule

Ошибка, которую я получаю, следующая:

Error-[IND] Identifier not declared
wrapper.sv, 4
  Identifier 'add' has not been declared yet. If this error is not expected, 
  please check if you have set `default_nettype to none.

Это имеет смысл, поскольку параметр — это не то же самое, что макрос. Полный дизайн должен, возможно, создавать несколько обернутых модулей, и я не хочу дублировать код, создавая оболочку для каждого внутреннего модуля. Как я могу это сделать?


person igon    schedule 10.04.2015    source источник


Ответы (1)


Параметр не может быть именем модуля. Это может быть data_type, неявный data_type или type.

Стандарт IEEE 1800-2012 A.2.1.1 Модуль объявления параметров:

parameter_declaration ::=
    parameter data_type_or_implicit list_of_param_assignments
  | parameter type list_of_type_assignments

Обходной путь заключается в использовании блока генерации и сравнении значения параметра.

module wrapper #(
    parameter        COLUMN_WIDTH     = 32,
    parameter string WRAPPED_MODULE   = "add"
  )
  (
    // ...
  );
  // ...
  generate
    if (WRAPPED_MODULE=="add") begin
      add #(.COLUMN_WDITH(COLUMN_WIDTH) ) a( .* );
    end
    else begin
     // ...
    end
  endgenerate
  // ...
endmodule
person Greg    schedule 10.04.2015
comment
Хороший обходной путь! Но будет ли это синтезируемым? - person igon; 11.04.2015
comment
Должно быть. Вам нужно будет попробовать, не все синтезаторы одинаковы. Если ему не нравится string, вы можете попробовать использовать свой собственный enum или просто проиндексировать его. - person Greg; 11.04.2015
comment
Я пробовал что-то подобное и могу подтвердить, что компилятору Cadence RTL НЕ нравится строковый параметр. Я перешел на enum и все хорошо. - person nguthrie; 30.06.2015