在Verilog 2001模块中,如何在实例化时定义端口的宽度?
例如,乘数和实例化它的模块可能如下所示:
module Multiplier #(parameter WIDTH = 8, parameter WIDTH1 = 8, WIDTH2 = 8) (
output [WIDTH-1:0] product,
input [WIDTH1-1:0] factor1,
input [WIDTH2-1:0] factor2
);
parameter WIDTHI = WIDTH1+WIDTH2;
wire [WIDTHI-1:0] intermediate_product;
assign intermediate_product = factor1 * factor2;
assign product = (intermediate_product >>> (WIDTHI-WIDTH));
endmodule
module User();
parameter WIDTH_OF_PRODUCT = 8;
parameter WIDTH_OF_FACTOR_1 = 8;
parameter WIDTH_OF_FACTOR_2 = 8;
wire [WIDTH_OF_PRODUCT] product;
reg [WIDTH_OF_FACTOR_1] factor1;
reg [WIDTH_OF_FACTOR_2] factor2;
Multiplier #(WIDTH_OF_PRODUCT,WIDTH_OF_FACTOR_1,WIDTH_OF_FACTOR_2)
m0(product, factor1, factor2);
endmodule
如果用户中的网络宽度是在编译时定义的,那么是否可以自动定义乘数实例化中端口的宽度?
我想要一个看起来像这样的实例:
Multiplier m0(product, factor1, factor2);
这可能涉及更改乘数模块的定义。
请记住,这些仅仅是示例。我的问题是关于如何根据网络和端口定义两个模块。
提前致谢!
更新
这是一个不适用于定义的乘数的情况:
module Top();
parameter WIDE = 8;
parameter NARROW = 4;
wire [NARROW-1:0] narrow_product;
wire [WIDE-1:0] wide_product;
reg [NARROW-1:0] narrow_factor_1;
reg [WIDE-1:0] wide_factor_1;
reg [NARROW-1:0] narrow_factor_2;
reg [WIDE-1:0] wide_factor_1;
Multiplier mWide(wide_product, wide_factor_1, wide_factor_2);
Multiplier mNarrow(narrow_product, narrow_factor_1, narrow_factor_2); // PROBLEM
endmodule
我的动机是网络代表定点数,是具有小数部分的数字的表示。我必须为固定点数指定精度。虽然这可能是一个全局常数,但我可能想要使用不同的精度。因此,我可能需要参数来指定模块中端口的精度。
更新: 好吧,我不能做我想做的事。所以这就是我所做的,如果这有助于任何人:
由于输入和输出的宽度相同,我用这种方式定义它们:
module Multiplier #(parameter WIDTH = 8,
parameter WIDTH1 = WIDTH,
parameter WIDTH2 = WIDTH1) (
output [WIDTH-1:0] product,
input [WIDTH1-1:0] factor1,
input [WIDTH2-1:0] factor2
);
...
endmodule
那么我可以这样实例化:
Multiplier #(16) m0(product, factor1, factor2);
如果产品和因素都具有相同的长度。它比指定所有这些更简洁,特别是当我使用定点数时,实例化看起来像这样:
Multiplier #(16,8) m0(product, factor1, factor2);
其中第二个数字是PRECISION参数,给出小数部分的宽度。 (这需要更新乘法器模块定义,以包括PRECISION,PRECISION1和PRECISION2,其定义类似于WIDTH定义。
答案 0 :(得分:3)
参数的定义完全是他必须将参数传递给实例的原因:
module Top();
localparam WIDE = 8;
localparam NARROW = 4;
wire [NARROW-1:0] narrow_product;
wire [WIDE-1:0] wide_product;
reg [NARROW-1:0] narrow_factor_1;
reg [WIDE-1:0] wide_factor_1;
reg [NARROW-1:0] narrow_factor_2;
reg [WIDE-1:0] wide_factor_1;
Multiplier #(
.WIDTH (WIDE),
.WIDTH1 (WIDE),
.WIDTH2 (WIDE)
) mWide (
.product (wide_product),
.factor1 (wide_factor_1),
.factor2 (wide_factor_2)
);
Multiplier #(
.WIDTH (NARROW),
.WIDTH1 (NARROW),
.WIDTH2 (NARROW)
) mNarrow(
.product (narrow_product),
.factor1( narrow_factor_1),
.factor2( narrow_factor_2)
); // NOT A PROBLEM
endmodule
乘数:
module Multiplier #(
parameter WIDTH = 8,
parameter WIDTH1 = 8,
parameter WIDTH2 = 8
) (
output [WIDTH-1:0] product,
input [WIDTH1-1:0] factor1,
input [WIDTH2-1:0] factor2
);
//...