如何在不改变值的情况下将向量传递给模块?

时间:2015-12-03 15:46:11

标签: verilog

我想写一个数组乘法器,我有两个模块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值。

我不知道发生了什么。

请帮忙。

感谢。

2 个答案:

答案 0 :(得分:2)

您不是覆盖ArrayMultiplier模块的参数

默认情况下,a1Ra1Ca2C等参数会初始化为0,如果这些参数被覆盖,则实例化模块,然后向量a1a2创建零大小

查看您的Top模块,映射a1R=4a1C=5a2C=3,并实例化模块,解决显示x的错误。模块实例化如下:

ArrayMultiplier #(4,5,3) test(result,a1,a2);

这解决了您的问题。有关参数化模块的详细信息,请查看Parameterized ModulesModule Parameters in Verilog链接。

答案 1 :(得分:2)

首先,根据您的代码,您从未将a1Ra1Ca2C设置为0以外的值,这意味着ArrayMultiplier中的任何内容都不会成倍增加(而你的矢量指数很差)。请更改ArrayMultiplier中的参数值,或将其从Top模块中传入。

其次,您的乘数应该使用always@(*)块,而不是initial块。