我想写一个数组乘法器,我有两个模块ArrayMultiplier,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
和数组乘法器:
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 值。
我不知道发生了什么。
请帮忙。
谢谢。
最佳答案
您没有覆盖 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链接。
关于verilog - 如何将向量传递给模块而不改变值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070228/