使用SystemVerilog参数来确定要实例化的模块

use*_*757 1 verilog system-verilog

有没有办法使用传递给父模块的参数值来选择我想要实例化的模块?以下示例

module parent ();

 parameter WORD = 1; 

 child_`WORD child (); // obviously does not work

endmodule
Run Code Online (Sandbox Code Playgroud)

如果WORD == 1,我想实例化child_1模块,for WORD == 2child_2模块,等等.当然,有人之前需要这样做吗?

dwi*_*kle 5

如果要有条件地实例化模块,则需要使用generate块.

generate
  if (WORD == 1) begin
    child_1 child();
  end
  if (WORD == 2) begin
    child_2 child();
  end
endgenerate
Run Code Online (Sandbox Code Playgroud)

以下是一个完整的工作示例.请注意,它仅考虑child_1和child_2的存在.您不能将该参数用作要实例化的模块类型名称的一部分.如果您有N个子模块,并且您不想在generate块中显式枚举它们,则可能需要创建一个辅助宏.

顺便说一句,这是有效的Verilog代码; 它不使用任何SystemVerilog功能.

module child_1();
  initial begin
    $display("child_1 %m");
  end
endmodule

module child_2();
  initial begin
    $display("child_2 %m");
  end
endmodule

module parent();
  parameter WORD = 1;

  // Conditionally instantiate child_1 or child_2 depending 
  // depending on value of WORD parameter.
  generate
    if (WORD == 1) begin
      child_1 child();
    end
    if (WORD == 2) begin
      child_2 child();
    end
  endgenerate

endmodule

module top();
  parent #(.WORD(1)) p1();
  parent #(.WORD(2)) p2();
endmodule
Run Code Online (Sandbox Code Playgroud)

来自Incisive的输出:

child_1 top.p1.genblk1.child
child_2 top.p2.genblk2.child
Run Code Online (Sandbox Code Playgroud)