verilog中的模块选择

module selection in verilog

我有一组模块,比如 module_1、module_2、... module_N。它们执行相似但不同的逻辑操作 (out = logic_n)。但是,由于 N 非常大(数千),因此通过手动实例化它们在更高级别的模块中使用它们是不可行的。我试图为此编写 python 代码。我还想知道是否可以为此目的使用参数化模块?我的意思是这样的。

module module_generic(in, out)

parameter module_number;

case (module_number) 

   0 : out = logic_1; 

   1 : out = logic_2; 

   ...

   N : out = logic_N;

endcase

endmodule

通过这样做,我可以使用生成语句轻松生成更高级别模块中的代码。有没有人尝试过这种方法?它能像我想要的那样表现吗?综合后是否等同于暴力破解?

是这样的吗?

module module_generic#(
    parameter module_number = 0
)(
  input logic in,
  output logic out);


generate
case (module_number) 

   0 : assign out = in; 

   //1 : assign out = logic_2; 

   //...

   //N : assign out = logic_N;

endcase
endgenerate

endmodule

现在可以在您的代码中使用参数 module_number 的不同输入来实例化此模块。除非每个 logic_X 使用大量相同的代码,否则我真的不明白您为什么要这样做。不过,据我从你的问题中了解到,这应该可以做到。

编辑回复评论: 生成用于根据某些参数(例如在参数化模块中)生成 代码的重复和条件部分。例如:

generate
if(INPUT_PARAMETER)
  assign out = in;
else //Tie low
  assign out = 0;
endgenerate

genvar N;
generate
  for(N = 0; N < INPUT_PARAMETER; N++) begin :la_someModule
    someModule(.out(out[N]), .in(in[N]));
  end
endgenerate

或两者兼而有之。 (注意标签 la_someModule。在使用 generate for 时包含这个非常聪明,它简化了调试。)

具体回答您在这里提出的问题很难。您没有提供足够的信息让我了解您的需求。