Module 将参数传递给Verilog模块

Module 将参数传递给Verilog模块,module,verilog,fpga,parameterization,Module,Verilog,Fpga,Parameterization,我正在为FPGA设计编写一些Verilog模块。我环顾了一下互联网,想知道如何最好地参数化我的模块。我经常看到两种不同的方法。下面我举了两种不同方法的一个例子。 以下哪种方法是参数化模块的最佳方法? 有什么区别? 是否取决于供应商(Altera vs Xilinx) 第一种方法: 模块定义: module busSlave #(parameter DATA_WIDTH = 1) ( input [DATA_WIDTH-1:0] bus_data, input

我正在为FPGA设计编写一些Verilog模块。我环顾了一下互联网,想知道如何最好地参数化我的模块。我经常看到两种不同的方法。下面我举了两种不同方法的一个例子。 以下哪种方法是参数化模块的最佳方法? 有什么区别? 是否取决于供应商(Altera vs Xilinx)

第一种方法: 模块定义:

module busSlave #(parameter DATA_WIDTH = 1) (
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);
endmodule
module busSlave(
  parameter DATA_WIDTH = 1;
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);
endmodule
模块实例化:

module top;

  //DATA_WIDTH is 32 in this instance
  busSlave #(.DATA_WIDTH(32)) slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );

  //DATA_WIDTH is 64 in this instance
  busSlave #(.DATA_WIDTH(64)) slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
endmodule
module top;

  //DATA_WIDTH is 32 in this instance
  busSlave slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );
  defparam slave32.DATA_WIDTH = 32;

  //DATA_WIDTH is 64 in this instance
  busSlave slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
  defparam slave32.DATA_WIDTH = 64;
endmodule
第二种方法: 模块定义:

module busSlave #(parameter DATA_WIDTH = 1) (
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);
endmodule
module busSlave(
  parameter DATA_WIDTH = 1;
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);
endmodule
模块实例化:

module top;

  //DATA_WIDTH is 32 in this instance
  busSlave #(.DATA_WIDTH(32)) slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );

  //DATA_WIDTH is 64 in this instance
  busSlave #(.DATA_WIDTH(64)) slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
endmodule
module top;

  //DATA_WIDTH is 32 in this instance
  busSlave slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );
  defparam slave32.DATA_WIDTH = 32;

  //DATA_WIDTH is 64 in this instance
  busSlave slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
  defparam slave32.DATA_WIDTH = 64;
endmodule
提前谢谢


编辑:示例中的一些更正
defparam
语句计划弃用。IEEE标准1800-2012,附录C(弃用)第“C.4.1 Defparam声明”节规定:

强烈建议用户迁移其代码以使用 参数重新定义的替代方法


Verilog的许多功能取决于供应商。

defparam slave32.DATA_WIDTH=64;你是说奴隶64?