使用其他参数在Verilog中实例化自定义模块的向量

时间:2017-05-04 00:30:16

标签: verilog fpga system-verilog

我在Verilog中有一个自定义模块,它需要几个输入和一些参数。

module modA ( 
    input inp1, input inp2, ... output out);
    parameter my_addr;
...
endmodule

由于与我使用的特定硬件相关的各种原因,我需要创建此模块的许多实例,每次都使用不同的参数(因为my_addr对应于我正在访问的内存中的特定位置来自主持人)。此外,我想要一种简单的方法来访问所有输出。我想做像

这样的事情
wire [9:0] outputs;
modA #(.my_addr) all_modA[9:0](.inp1(inp1), .inp2(inp2), .out(outputs));

那么我将有一个all_modA元素的向量,输出的第n个元素将对应于modA的第n个实例化。听起来它会很好用,除了我需要为每个实例传递一个唯一的地址。当我一次只进行一次实例化时,很容易定义一个参数,但我不知道每次如何传递唯一标识符。

有没有办法实现这个目标?问题是,如果我使用for循环,那么我不知道如何用唯一标识符实例化每个modA。如果我不使用for循环,那么我不确定如何添加唯一标识符。

1 个答案:

答案 0 :(得分:2)

您可以在此处使用generate块。 在详细设计期间评估生成块。它们不在仿真时执行,并且在仿真开始之前确定结果。因此,生成方案中的所有表达式都应为常量表达式,在精化时确定。

根据要求为my_addr提供不同的值。此外,您可以将一些标签标识符应用于begin-end块。这是用于生成块的可选功能,但非常强烈推荐。通过这样做,可以看到唯一的分层路径,每个模块的modA的每个实例都是不同的。

对于您的代码,我创建了一个测试平台,用于更改my_addroutputs总线驱动out信号的值来实例化模块。

module modA #(parameter int my_addr) (input inp1, input inp2,output out);

  initial $display("%m: %d",my_addr);
endmodule

module top();
wire [9:0] outputs;
  genvar i; // generate iterator
  generate
    for(i=0;i<9;i++) begin: some_identifier
      // my_addr = i+1 for every module
      modA #(.my_addr(i+1)) all_modA(.inp1(inp1), .inp2(inp2), .out(outputs[i])); // Multiple modules
      end
  endgenerate
endmodule

有关详细信息,请参阅IEEE 1800-2012第27条。可以找到类似问题herehere