我想写一个数组乘法器,我有两个模块ArrayMultiplier,Top。
在Top模块中,我有三个数组结果,a1,a2。
module Top();
reg [4*5-1:0] a1;
reg [5*3-1:0] a2;
wire [4*3-1:0] result;
integer i,j;
initial begin
for(i=0;i<4;i=i+1) begin
for(j=0;j<5;j=j+1) begin
a1[i*5+j]=1'b1;
end
end
for(i=0;i<5;i=i+1) begin
for(j=0;j<3;j=j+1) begin
a2[i*3+j]=1'b1;
end
end
end
ArrayMultiplier #(4,5,3) test(result,a1,a2);
endmodule
和ArrayMultiplier:
module ArrayMultiplier(result,a1,a2);
parameter a1R=0;
parameter a1C=0;//a1C=a2R.
parameter a2C=0;
output reg[(a1R*a2C)-1:0] result;
input [(a1R*a1C)-1:0] a1;
input [(a1C*a2C)-1:0] a2;
integer i,j,k;
initial begin
//$display("a1R=%d a1C=%d a2C=%d",a1R,a1C,a2C);
for(i=0;i<4;i=i+1)
for(j=0;j<5;j=j+1)
$display("%d a1=%d ",i,a1[i*5+j]);
for(i=0;i<a1R;i=i+1) begin
for(j=0;j<a2C;j=j+1) begin
result[i*a2C+j]=0;
end
end
for(i=0;i<a1R;i=i+1) begin
for(j=0;j<a2C;j=j+1) begin
for(k=0;k<a1C;k=k+1) begin
result[i*a2C+j]=result[i*a2C+j]+(a1[i*a1C+k]*a2[k*a2C+j]);
$display("res=%d a1=%d a2=%d",result[i*a2C+j],a1[i*a1C+k],a2[k*a2C+j]);
end
end
end
end
endmodule
我初始化了a1,a2但是当我将它们传递给ArrayMultiplier模块时,它们只有x值。
我不知道发生了什么。
请帮忙。
感谢。
答案 0 :(得分:2)
您不是覆盖ArrayMultiplier
模块的参数。
默认情况下,a1R
,a1C
和a2C
等参数会初始化为0
,如果这些参数未被覆盖,则实例化模块,然后向量a1
和a2
创建零大小。
查看您的Top
模块,映射a1R=4
,a1C=5
和a2C=3
,并实例化模块,解决显示x
的错误。模块实例化如下:
ArrayMultiplier #(4,5,3) test(result,a1,a2);
这解决了您的问题。有关参数化模块的详细信息,请查看Parameterized Modules和Module Parameters in Verilog链接。
答案 1 :(得分:2)
首先,根据您的代码,您从未将a1R
,a1C
或a2C
设置为0以外的值,这意味着ArrayMultiplier
中的任何内容都不会成倍增加(而你的矢量指数很差)。请更改ArrayMultiplier
中的参数值,或将其从Top
模块中传入。
其次,您的乘数应该使用always@(*)
块,而不是initial
块。