例化时用的模块名是否可参数化
时间:10-02
整理:3721RD
点击:
请问在模块A中例化模块B时,模块B的模块名能用parameter代替吗?RAM模块名里有宽度深度等信息,不同大小的RAM名字不一样,只想用一份模块A的代码,而且不让用define,所以希望例化RAM模块时,用的模块名也是个parameter。
只需写这么一段话,顶层传入深度、宽度的参数,就能动态地例化出不同的RAM模块。verilog有这种语法吗?
不可以吧。模块名参数化。
不可以。但是可以用define,ifdef之类的。或者用generate.
可以把ram的深度定义成参数,这样不同大小ram的名字就一样,调用时,传参就可以了
我现在用的就是generate,但是这样做也有弊端。必须在generate体内,用case去对传入的parameter做判断,分别例化不同名字的RAM。有n种可能的话,RAM例化那一段话就要重复写n次。有没有可能只需要出现一次RAM例化的那段话,但使用的RAM名里掺杂有顶层传入的参数变量,参数不同,就能动态地例化出不同模块名的RAM?
因为RAM模块名里有深度、宽度这些信息的数字,我想要的就是类似这样的效果(伪代码,语法请忽略):
- ram${DEPTH}_${WIDTH} u_ram
- (
- .clk (clk ),
- ...
- );
只需写这么一段话,顶层传入深度、宽度的参数,就能动态地例化出不同的RAM模块。verilog有这种语法吗?
学习学习
关于ram的知识我不太清楚,我只能说一些传参。举个分频器的例子吧。
比如偶数分频,假设为N分频,
module fp_even(clk_out,clk_in,rst);
output clk_out;
input clk_in;
input rst;
reg [1:0] cnt;
reg clk_out;
parameter N=6;
………………
endmodule
在主程序中需要一个8分频,一个16分频
module top(……)
fp_even #(.N(8)) u1_fp_even();
fp_even #(.N(16)) u2_fp_even();
endmodule
可以的吧
学习了,太好嘞
