我在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循环,那么我不确定如何添加唯一标识符。
答案 0 :(得分:2)
您可以在此处使用generate
块。 在详细设计期间评估生成块。它们不在仿真时执行,并且在仿真开始之前确定结果。因此,生成方案中的所有表达式都应为常量表达式,在精化时确定。
根据要求为my_addr
提供不同的值。此外,您可以将一些标签标识符应用于begin-end
块。这是用于生成块的可选功能,但非常强烈推荐。通过这样做,可以看到唯一的分层路径,每个模块的modA
的每个实例都是不同的。
对于您的代码,我创建了一个测试平台,用于更改my_addr
和outputs
总线驱动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条。可以找到类似问题here和here。