8

我正在为 FPGA 设计编写一些 Verilog 模块。我浏览了互联网,以了解如何最好地参数化我的模块。我经常看到两种不同的方法。我在下面提供了两种不同方法的示例。以下哪种方法是参数化模块的最佳方法?有什么区别?是否依赖于供应商(Altera 与 Xilinx)?

第一种方法: 模块定义:

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 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 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

提前致谢

编辑:示例中的一些更正

4

1 回答 1

4

defparam语句计划弃用。IEEE Std 1800-2012,附件 C(弃用),“C.4.1 Defparam statements”部分指出:

强烈建议用户迁移他们的代码以使用参数重新定义的替代方法之一。

Verilog 的许多功能都依赖于供应商。

于 2014-12-18T20:56:56.927 回答