verilog中的模块选择

时间:2016-03-06 15:44:38

标签: verilog system-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

通过这样做,我可以使用generate语句轻松生成更高级别模块中的代码。有没有人尝试过此方法?它可以像我想要的那样表现吗?合成后,它是否相当于强力溶液?

1 个答案:

答案 0 :(得分:1)

这样的东西?

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用于基于某些参数(例如在参数化模块中)生成代码的重复和条件部分。例如:

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 时包含此内容非常明智,它简化了调试。)

特别回答你在这里提出的问题很难。您没有提供足够的信息来了解您的需求。