传递参数给 Verilog 模块

8
我正在编写一些用于FPGA设计的Verilog模块。我在互联网上查找了如何最好地对我的模块进行参数化的方法。我看到经常出现两种不同的方法。下面是这两种不同方法的示例。 这两种方法中哪一种是最好的参数化模块的方式? 它们之间有什么区别? 它是否取决于供应商(Altera vs 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 slave64.DATA_WIDTH = 64;
endmodule

1
defparam slave32.DATA_WIDTH = 64; 你是指slave64吗? - Anton Krug
1个回答

4

defparam语句即将被弃用。IEEE Std 1800-2012,Annex C (Deprecation),第"C.4.1 Defparam statements"节声明:

用户强烈建议将其代码迁移到使用其他参数重新定义方法之一。

Verilog的许多功能因供应商而异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接