2017-05-04 104 views
0

我在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循环,那么我不确定如何添加唯一标识符。

回答

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

+0

我将如何确定some_identifier是什么? – user147177

+0

它是'begin..end'块的任何**标识符。这是生成块的用户定义标签。可以在这里使用任何字符串。 – sharvil111

+0

在我的特殊情况下,每个输出都是16位线。我会写 “wire [15:0] outputs [0:10];”? – user147177